javascript - 在 div 更改时触发 jQuery 事件

标签 javascript jquery widget jquery-events

我有一个 div,它的内容可能会以各种方式改变:例如,它的全部内容可能会通过 innerHTML 重新加载,或者节点可能会通过 DOM 方法添加。这反过来可能通过 native Javascript 或通过调用 jQuery API 或其他库间接发生。

我想在 div 的内容发生变化时执行一些代码,但我绝对无法控制它会如何变化。事实上,我正在设计一个可供其他人使用的小部件,他们可以按照自己喜欢的方式自由更改 div 的内容。当此 div 的内部内容发生变化时,小部件的形状也可能必须更新。

我正在使用 jQuery。有没有办法捕获此 div 的内容已更改的事件,无论它发生了什么?

最佳答案

您可以使用 DOMNodeInsertedDOMNodeRemoved 来检查是否添加或删除了元素。很遗憾,IE 不支持此功能。

$('#myDiv').bind('DOMNodeInserted DOMNodeRemoved', function(event) {
    if (event.type == 'DOMNodeInserted') {
        alert('Content added! Current content:' + '\n\n' + this.innerHTML);
    } else {
        alert('Content removed! Current content:' + '\n\n' + this.innerHTML);
    }
});

更新

您可以使用 .data() 保存初始内容和 future 的更改。这是一个例子。

var div_eTypes = [],
    div_changes = [];
$(function() {
    $('#myDiv').each(function() {
        this['data-initialContents'] = this.innerHTML;
    }).bind('DOMNodeInserted DOMNodeRemoved', function(event) {
        div_eTypes.concat(e.type.match(/insert|remove/));
        div_changes.concat(this.innerHTML);
    });
});

示例输出:

> $('#myDiv').data('initialContents');
"<h1>Hello, world!</h1><p>This is an example.</p>"
> div_eTypes;
["insert", "insert", "remove"]
> div_changes;
["<iframe src='http://example.com'></iframe>", "<h4>IANA — Example domains</h4><iframe src='http://example.com'></iframe>", "<h4>IANA – Example domains</h4>"]

更新2

您可能还想包含 DOMSubtreeModified,因为我发现 DOMNodeInsertedDOMNodeRemoved 如果元素innerHTML 直接替换。它在 IE 中仍然不起作用,但至少在其他浏览器中可以正常工作。

关于javascript - 在 div 更改时触发 jQuery 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4979738/

相关文章:

javascript - Ghost - 嵌入式 JavaScript 不会触发 d3js

javascript - 使用 Phaser 在世界中随机放置平台

python - 从任务栏隐藏 PyQt 应用程序

asynchronous - 在 Flutter 中更新下拉数据会报错

Android:如何在 AppWidgetProvider 中创建警报

javascript - 如何在 ReactJs 的 Textarea 中设置光标位置?

javascript - VueJS : render new component after click

javascript - Jquery 'mouseover' 仅在内容加载之前

jquery - 如何在响应式网站的图像源中添加宽度?

JQuery 用户界面 : resizable div with scrollbar