Как вы сказали, MutationObserver
позволяет вам только обнаружить, когда манипулируют дочерними элементами элемента.Это означает, что вам нужно будет прослушать родительский элемент и проверить, какие изменения были внесены, чтобы увидеть, был ли удален целевой элемент.
function onRemove(element, callback) {
const parent = element.parentNode;
if (!parent) throw new Error("The node must already be attached");
const obs = new MutationObserver(mutations => {
for (const mutation of mutations) {
for (const el of mutation.removedNodes) {
if (el === element) {
obs.disconnect();
callback();
}
}
}
});
obs.observe(parent, {
childList: true,
});
}
, а затем на вашем примере вместо
element.onRemove(() => releaseKraken(element));
Вы можете сделать
onRemove(element, () => releaseKraken(element));
Этот подход должен быть достаточно быстрым, если все, что вы делаете, это наблюдаете за одним элементом.Хотя это может показаться приличным количеством циклов, для removedNodes
довольно редко быть более одного узла, и если что-то не удаляет тонны братьев и сестер за раз, mutations
тоже будет довольно маленьким.
Вы также можете подумать о
callback(el);
, который позволит вам сделать
onRemove(element, releaseKraken);