Poniższy kod wykorzystuje zdarzenie mutacji DOM DOMNodeInserted
w celu wykrycia istnienia elementu body
i zawinięcia jego innerHTML
w opakowanie.Czy obserwatory mutacji DOM działają wolniej niż zdarzenia mutacji 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>
Mimo pomyślnego zawinięcia występuje błąd informujący, że węzeł nie został znaleziony. This answer pytania wyjaśnił, że to dlatego, że po załadowaniu jQuery dodano element div
do ciała, aby wykonać pewne testy, ale nie udało się usunąć tego elementu div
, ponieważ ten element został zawinięty w opakowanie, aby nie był element dziecka w ciele.
Powyższy eksperyment mówi, że zdarzenie DOMNodeInserted
jest szybsze niż testy jQuery, ponieważ element testowy jQuery (div
) został zawinięty, zanim zostanie usunięty przez jQuery.
Teraz następujący kod może osiągnąć ten sam manipulacji, i to przy użyciu nowo wprowadzonych obserwatorów DOM mutacji. Od tego czasu (2012-07-11) działa tylko w przeglądarce Chrome 18 i nowszych.
<!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>
Kod ten nie spowodował błędu. Oznacza to, że jQuery jest szybszy niż obserwatory mutacji DOM, więc mógł usunąć swój element testowy (div
), zanim ten element zostanie zawinięty w opakowanie.
Z powyższych dwóch doświadczeń, możemy stwierdzić, że jeśli chodzi o szybkość wykonywania:
- DOM mutacji Wydarzenia > testy jQuery za
- testów jQuery > Obserwatorzy mutacji DOM
Czy ten wynik może odpowiednio udowodnić, że obserwatory mutacji DOM są wolniejsze niż zdarzenia mutacji DOM?
Wielkie dzięki @AshHeskes i miłe wyjaśnienie! W końcu rozumiem ich zasady wykonywania. –