Resize Observer, Mutation Observer, and Intersection Observers are efficient APIs compared to their older counterparts:

These three observers have similar APIs, although they have differences that will be discussed later. To use an observer, follow these steps:

1. **Create a new observer with the `new` keyword:** This involves passing an observer function to execute.
2. **Handle the observed changes:** This is done through the observer function provided to the observer.
3. **Observe a specific element:** Use the `observe` method.
4. **(Optionally) unobserve the element:** Use the `unobserve` or `disconnect` method, depending on the observer.

For example, using `ResizeObserver`:

“`javascript
// Step 1: Create a new observer
const observer = new ResizeObserver(observerFn);

// Step 2: Handle the observed changes
function observerFn(entries) {
for (let entry of entries) {
// Handle entry
}
}

// Step 3: Observe an element
const element = document.querySelector(‘#some-element’);
observer.observe(element);

// Step 4 (optional): Disconnect the observer
observer.disconnect(element);
“`

Without comments, the code appears as:

“`javascript
const observer = new ResizeObserver(observerFn);

function observerFn(entries) {
for (let entry of entries) {
// Handle entry
}
}

const element = document.querySelector(‘#some-element’);
observer.observe(element);
“`

We can improve the observer APIs for easier usage.

### The Resize Observer

Starting with `ResizeObserver`, the simplest of them all, we encapsulate it in a function:

“`javascript
function resizeObserver() {
// Implementation
}
“`

Refactor the `ResizeObserver` code into the `resizeObserver` function:

“`javascript
function resizeObserver() {
const observer = new ResizeObserver(observerFn);

function observerFn(entries) {
for (let entry of entries) {
// Handle entry
}
}

const node = document.querySelector(‘#some-element’);
observer.observe(node);
}
“`

Pass the `element` to the function to simplify it:

“`javascript
function resizeObserver(element) {
const observer = new ResizeObserver(observerFn);

function observerFn(entries) {
for (let entry of entries) {
// Handle entry
}
}

observer.observe(node);
}
“`

This makes the function versatile, allowing any element to be passed:

“`javascript
// Usage of the resizeObserver function
const node = document.querySelector(‘#some-element’);
const obs = resizeObserver(node);
“`

Next, pass an observer function to the callback:

“`javascript
// Not great
function resizeObserver(node, observerFn) {
const observer = new ResizeObserver(observerFn);
observer.observe(node);
}
“`

Since `observerFn` is consistent, looping through `entries` and acting on each `entry`, we can pass a `callback` for tasks when the element resizes:

“`javascript
// Better
function resizeObserver(node, callback) {
const observer = new ResizeObserver(observerFn);

function observerFn(entries) {
for (let entry of entries) {
callback(entry);
}
}

observer.observe(node);
}
“`

Use the `callback` in `resizeObserver`, making it like an event listener:

“`javascript
// Usage of the resizeObserver function
const node = document.querySelector(‘#some-element’);
const obs = resizeObserver(node, entry => {
// Handle each entry
});
“`

Enhance the callback by providing both `entry` and `entries`:

“`javascript
function resizeObserver(element, callback) {
const observer = new ResizeObserver(observerFn);

function observerFn(entries) {
for (let entry of entries) {
callback({ entry, entries });
}
}

observer.observe(element);
}
“`

Retrieve `entries` in the `callback` if needed:

“`javascript
// Usage of the resizeObserver function
// …
const obs = resizeObserver(node, ({ entry, entries }) => {
// …
});
“`

Pass the callback as an option parameter for consistency with `mutationObserver` and `intersectionObserver` functions:

“`javascript
function resizeObserver(element, options = {}) {
const { callback } = options;
const observer = new ResizeObserver(observerFn);

function observerFn(entries) {
for (let entry of entries) {
callback({ entry, entries });
}
}

observer.observe(element);
}
“`

Use `resizeObserver` like this:

“`javascript
const obs = resizeObserver(node, {
callback({ entry, entries }) {
// Handle entries
}
});
“`

### The Observer Can Take in an Option Too

`ResizeObserver`


Discover more from WIREDGORILLA

Subscribe to get the latest posts sent to your email.

Similar Posts