Zajmuję moduł JavaScript, który nic nie wie o środowisko, w którym będzie ono używane wPo odwołaniu do elementu, jak wykryć po dołączeniu do dokumentu? .
I, technicznie rzecz biorąc, chcę wdrożyć następną funkcję:
onceAppended(element, callback);
element
jest HTMLElement
i element nadrzędny tego elementu może być nieznany podczas inicjowania modułu. callback
jest funkcją, która musi zostać wywołana, gdy na stronie pojawi się element
.
Oddzwonienie musi zostać wywołane natychmiast, jeśli element zostanie dołączony do dokumentu. W przypadku, gdy element
nie jest jeszcze dołączony, funkcja uruchomi callback
po pojawieniu się element
na dokumencie.
Problem polega na tym, że możemy wykryć zdarzenie wstawienia element
przy użyciu zdarzenia mutacji DOMNodeInserted
. Ale wydarzenia związane z mutacją są teraz deprecated. I wydaje się, że MutationObserver
nie może obsłużyć tego zadania, prawda?
Tu jest mój urywek kodu:
function onceAppended (element, callback) {
let el = element,
listener;
while (el.parentNode)
el = el.parentNode;
if (el instanceof Document) {
callback();
return;
}
if (typeof MutationObserver === "undefined") { // use deprecated method
element.addEventListener("DOMNodeInserted", listener = (ev) => {
if (ev.path.length > 1 && ev.path[ev.length - 2] instanceof Document) {
element.removeEventListener("DOMNodeInserted", listener);
callback();
}
}, false);
return;
}
// Can't MutationObserver detect append event for the case?
}
Z góry dziękuję za wszelką pomoc w tej sprawie!
@wOxxOm Czy możesz wypełnić moją funkcję, jeśli znasz temat? Próbowałem zaimplementować to z MutationObservers i nie otrzymałem wyników. – ZitRo
Nie widzę powodu, dla którego MutationObserver nie może obsłużyć tego zadania. Co próbujesz? Sądzę, że będziesz musiał dołączyć obserwatora do dokumentu i sprawdzić każdy dodany węzeł. Będzie to jednak bardzo nieskuteczne. Może więc możesz zastąpić 'appendChild',' replaceChild' i inne odpowiednie funkcje w prototypach HTMLElement i Node. – wOxxOm
Zobacz także [Alternatywa do DOMNodeInserted] (http://stackoverflow.com/a/10343915) – wOxxOm