El siguiente código utiliza el evento de mutación DOM DOMNodeInserted
para detectar la existencia del elemento body
y ajustar su innerHTML
en un contenedor.¿Los observadores de mutación DOM son más lentos que los eventos de mutación DOM?
<!DOCTYPE html>
<html lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
function DOMmanipulation() {
if (document.body) {
document.removeEventListener('DOMNodeInserted', DOMmanipulation);
// DOM manipulation start
document.body.innerHTML = '<div class="wrapper">' + document.body.innerHTML + '</div>';
// DOM manipulation end
}
}
document.addEventListener('DOMNodeInserted', DOMmanipulation);
</script>
</head>
<body>
<p>Lorem ipsum dolor sit amet.</p>
</body>
</html>
Y a pesar del éxito de la envoltura, hay un error que muestra que no se encontró un nodo. This answer de una pregunta explica que es porque cuando se cargó jQuery, se agregó un elemento div
en el cuerpo para realizar algunas pruebas, pero no se pudo eliminar ese elemento div
porque ese elemento se ha incluido en el contenedor para que no sea un elemento infantil del cuerpo más.
El experimento anterior nos dice que el evento DOMNodeInserted
es más rápido que las pruebas de jQuery porque el elemento de prueba de jQuery (div
) se completó antes de que jQuery lo elimine.
Ahora el siguiente código puede lograr la misma manipulación, y está utilizando los observadores DOM Mutación de reciente introducción. A partir de este momento (2012-07-11), solo funciona en Chrome 18 y versiones posteriores.
<!DOCTYPE html>
<html lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
var observer = new WebKitMutationObserver(function() {
if (document.body) {
observer.disconnect();
// DOM manipulation start
document.body.innerHTML = '<div class="wrapper">' + document.body.innerHTML + '</div>';
// DOM manipulation end
}
});
observer.observe(document, { subtree: true, childList: true });
</script>
</head>
<body>
<p>Lorem ipsum dolor sit amet.</p>
</body>
</html>
Estos códigos no producen ningún error. Eso significa que jQuery es más rápido que DOM Mutation Observers, por lo que fue capaz de eliminar su elemento de prueba (div
) antes de que ese elemento pueda ser envuelto en el contenedor.
A partir de los dos experimentos anteriores, encontramos que cuando se trata de la velocidad de ejecución:
- DOM Mutación Eventos > pruebas de jQuery
- pruebas de jQuery > Observadores de mutación DOM
¿Puede este resultado probar que DOM Mutation Observers es más lento que DOM Mutation Events?
Muchas gracias @AshHeskes y buena explicación! Finalmente entiendo sus principios de ejecución. –