Javascript 当一个元素被删除时,有没有一种方法可以得到DOM的通知?

Javascript 当一个元素被删除时,有没有一种方法可以得到DOM的通知?,javascript,Javascript,我最初的研究结果是空的,我不确定这是否可行。我正在寻找一个使用直接javascript的解决方案。由于设备的限制,我无法使用jQuery。基本上,我想在删除元素时附加一个事件,并提供一个要执行的函数 [编辑] 我们通过函数调用进行DOM操作。现在,我们还没有遍历整棵树来删除每一个元素。例如,我们只删除父对象。我希望通过附加到事件来提供一个快捷方式,但我想我必须走很长的路,并在函数中提供额外的逻辑。我之所以需要它,是因为我们需要能够在删除特定元素时在DOM上运行清理操作 目前,优先考虑的只是Ope

我最初的研究结果是空的,我不确定这是否可行。我正在寻找一个使用直接javascript的解决方案。由于设备的限制,我无法使用jQuery。基本上,我想在删除元素时附加一个事件,并提供一个要执行的函数

[编辑]
我们通过函数调用进行DOM操作。现在,我们还没有遍历整棵树来删除每一个元素。例如,我们只删除父对象。我希望通过附加到事件来提供一个快捷方式,但我想我必须走很长的路,并在函数中提供额外的逻辑。我之所以需要它,是因为我们需要能够在删除特定元素时在DOM上运行清理操作


目前,优先考虑的只是Opera支持,但我想实现一个跨浏览器解决方案。

如果您对跨浏览器支持感兴趣,“元素删除”则不是,因此我认为您在这里可能运气不佳。但是,如果您采用另一种策略,我认为您会有一些运气:因为您正在执行删除操作,限制删除元素的方式。然后在那里调用回调,而不是在事件处理程序中调用回调。

如果您对跨浏览器支持感兴趣,那么“on-element remove”就不是了,所以我认为您在这里可能运气不好。但是,如果您采用另一种策略,我认为您会有一些运气:因为您正在执行删除操作,限制删除元素的方式。然后简单地在那里调用回调,而不是在事件处理程序中调用。

直接的答案是否定的。当前的DOM实现没有提供可以挂接以监视DOM更改的事件


也许你可以补充你的问题,为什么你需要这个,可能有其他选择。例如,如果DOM元素被代码删除,那么该代码是否可以被修改以参与观察者模式?

直接的答案是否。当前的DOM实现没有提供任何事件,您可以钩住它来监视DOM更改


也许你可以补充你的问题,为什么你需要这个,可能有其他选择。例如,如果DOM元素被代码删除,是否可以修改该代码以参与观察者模式?

您定义了一个称为DOM突变事件的事件:


目前,这只适用于Firefox,不适用于Internet Explorer。

您定义了一种称为DOM突变事件的东西:


目前这只适用于Firefox,而不适用于Internet Explorer。

我想知道如果不是您,如何删除节点


你需要知道搬家后多久?你能每秒钟检查一下它是否消失一次吗?

如果不是你,我想知道节点是如何被移除的


你需要知道搬家后多久?你能检查一下它是否每秒消失一次吗?

我不是DOM专家,但你能覆盖removeChild方法吗

如果它能工作,那就不是一个完美的解决方案,因为DOM元素还有其他的消失方式(例如,将innerHTML设置为它的上升点之一)


您还可以在父级存储子级计数。然后将该计数与实际的子计数进行比较。当然,这需要轮询,而不是事件。

我不是DOM专家,但是您能覆盖removeChild方法吗

如果它能工作,那就不是一个完美的解决方案,因为DOM元素还有其他的消失方式(例如,将innerHTML设置为它的上升点之一)


您还可以在父级存储子级计数。然后将该计数与实际的子计数进行比较。当然,这需要轮询,而不是事件。

我不擅长Javascript,但很快模拟了下面的代码,它在Firefox中工作。您可能很幸运能在其他浏览器中使用它

<ul id="main">
    <li id="e1">Item 1</li>
    <li id="e2">Item 2</li>
</ul>

<script type="text/javascript">
var main = document.getElementById('main');
main.origRemoveChild = main.removeChild;
main.removeChild = function(child) {
    alert('Removing element ' + child.tagName + ' with id=' + child.id);
    this.origRemoveChild(child);
}
var e1 = document.getElementById('e1');
main.removeChild(e1);
</script>
    第1项 第2项
var main=document.getElementById('main'); main.origRemoveChild=main.removeChild; main.removeChild=函数(子函数){ 警报('正在删除id为'+child.id'的元素'+child.tagName+); 本.origRemoveChild(child); } var e1=document.getElementById('e1'); 主。删除child(e1);
由于您更新了您的问题,我这里有另一个解决方案:

removeFromDOM(e) {
    for (var i = 0; i < e.childNodes.length; ++i) {
        var child = e.childNodes[i];
        removeFromDOM(child);
        if (typeof child.onremove == 'function') {
            child.onremove();
        }
        e.removeChild(child);
    }
}
removeFromDOM(e){
对于(变量i=0;i

这将递归删除每个嵌套节点。在删除之前,它将尝试执行
onremove
方法。希望这能有所帮助。

我不擅长Javascript,但很快就模拟了以下代码,并在Firefox中运行。您可能很幸运能在其他浏览器中使用它

<ul id="main">
    <li id="e1">Item 1</li>
    <li id="e2">Item 2</li>
</ul>

<script type="text/javascript">
var main = document.getElementById('main');
main.origRemoveChild = main.removeChild;
main.removeChild = function(child) {
    alert('Removing element ' + child.tagName + ' with id=' + child.id);
    this.origRemoveChild(child);
}
var e1 = document.getElementById('e1');
main.removeChild(e1);
</script>
    第1项 第2项
var main=document.getElementById('main'); main.origRemoveChild=main.removeChild; main.removeChild=函数(子函数){ 警报('正在删除id为'+child.id'的元素'+child.tagName+); 本.origRemoveChild(child); } var e1=document.getElementById('e1'); 主。删除child(e1);
由于您更新了您的问题,我这里有另一个解决方案:

removeFromDOM(e) {
    for (var i = 0; i < e.childNodes.length; ++i) {
        var child = e.childNodes[i];
        removeFromDOM(child);
        if (typeof child.onremove == 'function') {
            child.onremove();
        }
        e.removeChild(child);
    }
}
removeFromDOM(e){
对于(变量i=0;i

这将递归删除每个嵌套节点。在删除之前,它将尝试执行
onremove
方法。希望有帮助。

这将是一个更容易回答的问题