Il seguente codice utilizza DOM Mutation Event DOMNodeInserted
per rilevare l'esistenza dell'elemento body
e avvolgere il suo innerHTML
in un wrapper.Gli osservatori di mutazione DOM sono più lenti degli eventi di mutazione 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>
E nonostante il successo del wrapping, c'è un errore indica che un nodo non è stato trovato. This answer di una domanda ha spiegato che è perché quando jQuery è stato caricato, ha aggiunto un elemento div
nel corpo per fare alcuni test, ma non è riuscito a rimuovere quell'elemento div
perché quell'elemento è stato inserito nel wrapper in modo che non sia un elemento infantile del corpo più.
È possibile che questo esperimento ci dice che DOMNodeInserted
evento è più veloce rispetto ai test di jQuery, perché elemento di prova di jQuery (div
) ottenuto avvolto prima che possa essere rimosso da jQuery.
Ora il seguente codice può ottenere lo stesso manipolazione, e che sta utilizzando gli Osservatori DOM mutazione di nuova introduzione. A partire da questo momento (2012-07-11), funziona solo su Chrome 18 e versioni successive.
<!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>
Questo codice non ha prodotto alcun errore. Ciò significa che jQuery è più veloce di DOM Mutation Observers, quindi è stato in grado di rimuovere il suo elemento di test (div
) prima che quell'elemento possa essere inserito nel wrapper.
Da questi due esperimenti, troviamo che quando si tratta di velocità di esecuzione:
- DOM mutazione Eventi > test di jQuery
- test di jQuery > osservatori di mutazione DOM
Questo risultato può dimostrare in modo appropriato che DOM Mutation Observers è più lento di DOM Mutation Events?
Grazie mille @AshHeskes e bella spiegazione! Finalmente capisco i loro principi di esecuzione. –