<div class="message"></div>
在网页的某个位置,一个
p
标签会动态地添加到 div 中:<div class="message">
<p>Some Message</p>
</div>
可以删除 p
,然后再重新添加。
如果 div.message
有一个 p
子元素,并执行一些代码,我应该使用什么事件来监听?
我找到了这个问题,但它涉及外部插件。
有没有简单的方法来完成这个操作?
<div class="message"></div>
p
标签会动态地添加到 div 中:<div class="message">
<p>Some Message</p>
</div>
可以删除 p
,然后再重新添加。
如果 div.message
有一个 p
子元素,并执行一些代码,我应该使用什么事件来监听?
我找到了这个问题,但它涉及外部插件。
有没有简单的方法来完成这个操作?
根据您的实现方式和需要识别变化的速度,您可能可以使用setInterval
定期监视特定元素的内容来实现。
var checkContents = setInterval(function(){
if ($("div.message p").length > 0){ // Check if element has been found
// There is a <p> element in here!!
console.log($("div.message p").length());
}
},1000);
上面的代码片段每秒(1000毫秒)检查 div.message
元素中是否有 <p>
元素,如果存在则会将其数量记录到控制台。
根据你对浏览器支持的要求,你还可以使用变动事件 -
var element = document.querySelectorAll('div.message')
element.addEventListener("DOMNodeInserted", function (ev) {
// ...
}, false);
Vanilla JS有一种很棒的方法来检测任何DOM更改(包括节点是否添加了任何子节点),请查看: https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
但是这些文档并不是非常清晰,所以这里有一个快速的解释。
首先,您需要有一个要监听的目标节点:
const targetNode = document.getElementById('some-id');
然后,您需要在目标更改时创建一个触发器(称为MutationObserver):
const observer = new MutationObserver(callbackFunction);
定义当目标更改时要发生的事情:
const callbackFunction = function(mutationsList) { // Use traditional 'for loops' for IE 11 for(const mutation of mutationsList) { if (mutation.type === 'childList') { console.log('A child node has been added or removed.'); } else if (mutation.type === 'attributes') { console.log('The ' + mutation.attributeName + ' attribute was modified.'); } } };
注意:mutationsList是一个带有大量信息的对象,其中包括style、addedNodes等目标节点已更改的内容...
最后,你可以使用以下代码开始观察目标节点的变化:
observer.observe(targetNode, { childlist: true, attributes: true });
第二个参数是一个“选项”对象,用于定义你要查找的变化类型。
希望这能有所帮助,我发现它在js中是一个非常强大且被低估的工具。
MutationObserver
中使用document.contains(myElement)
是我构建的最佳路线。另请参阅此链接。而且没有使用JQuery。
https://dev59.com/tWIj5IYBdhLWcg3wTDVn - Code Novice