我正在使用.on()
绑定在页面加载后创建的div事件。它适用于click,mouseenter ...但我需要知道何时添加了一个新的类MyClass div。我正在寻找这个:
$('#MyContainer').on({
wascreated: function () { DoSomething($(this)); }
}, '.MyClass');
我该怎么做?我已经设法编写了我的整个应用程序而没有插件,我想保持这种方式。
感谢。
答案 0 :(得分:81)
以前可以挂钩jQuery的domManip
方法来捕获所有jQuery dom操作并查看插入的元素等等但是jQuery团队在jQuery 3.0+中将其关闭了通常不是以这种方式挂钩到jQuery方法的好方法,而且他们已经做到这一点,因此内核domManip
方法在核心jQuery代码之外不再可用。
变异事件也被弃用,就像之前可以做的那样
$(document).on('DOMNodeInserted', function(e) {
if ( $(e.target).hasClass('MyClass') ) {
//element with .MyClass was inserted.
}
});
这应该避免,今天应该使用Mutation Observers,它可以像这样工作
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
console.log(mutation)
if (mutation.addedNodes && mutation.addedNodes.length > 0) {
// element added to DOM
var hasClass = [].some.call(mutation.addedNodes, function(el) {
return el.classList.contains('MyClass')
});
if (hasClass) {
// element has class `MyClass`
console.log('element ".MyClass" added');
}
}
});
});
var config = {
attributes: true,
childList: true,
characterData: true
};
observer.observe(document.body, config);
答案 1 :(得分:45)
这是我的插件,可以做到 - jquery.initialize
使用与您使用.each
功能相同,但在元素上使用.initialize
功能,与.each
的区别在于它还会初始化将来添加的元素而不会附加代码 - 无论您是使用AJAX还是其他任何内容添加它。
初始化与.each函数
具有相同的语法$(".some-element").initialize( function(){
$(this).css("color", "blue");
});
但是现在如果新的元素匹配.some-element选择器将出现在页面上,它将被即时初始化。添加新项目的方式并不重要,您不需要关心任何回调等。
$("<div/>").addClass('some-element').appendTo("body"); //new element will have blue color!
插件基于MutationObserver
答案 2 :(得分:14)
在回顾了这个和其他几篇文章之后,我试着将我认为最好的每个帖子提炼成简单的东西,让我能够检测插入一类元素然后对这些元素进行操作
function onElementInserted(containerSelector, elementSelector, callback) {
var onMutationsObserved = function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length) {
var elements = $(mutation.addedNodes).find(elementSelector);
for (var i = 0, len = elements.length; i < len; i++) {
callback(elements[i]);
}
}
});
};
var target = $(containerSelector)[0];
var config = { childList: true, subtree: true };
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var observer = new MutationObserver(onMutationsObserved);
observer.observe(target, config);
}
onElementInserted('body', '.myTargetElement', function(element) {
console.log(element);
});
对我来说重要的是,这允许a)目标元素存在于&#34; addedNodes&#34; b)仅在最初插入时处理元素的能力(无需搜索整个文档设置或忽略&#34;已经处理过的&#34;标记)。
答案 3 :(得分:12)
3年以后的经验,这就是我如何倾听添加到DOM&#34; 的某个类的&#34;元素:你只需在jQuery中添加一个钩子{{1功能,像这样:
html()
如果您正在使用jQuery,这是有效的。它并不依赖于浏览器特定的事件function Start() {
var OldHtml = window.jQuery.fn.html;
window.jQuery.fn.html = function () {
var EnhancedHtml = OldHtml.apply(this, arguments);
if (arguments.length && EnhancedHtml.find('.MyClass').length) {
var TheElementAdded = EnhancedHtml.find('.MyClass'); //there it is
}
return EnhancedHtml;
}
}
$(Start);
,它不是跨浏览器兼容的。我还为DOMNodeInserted
总的来说,这对我来说就像是一种魅力,对你来说也很有希望。
答案 4 :(得分:5)
你可以使用突变事件
http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-mutationevents
修改
来自MDN的:https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events
弃用 此功能已从Web中删除。虽然有些浏览器可能仍然支持它,但它正在被删除。不要在旧项目或新项目中使用它。使用它的页面或Web应用程序可能随时中断。
突变观察者是DOM4中突变事件的建议替代品。它们将包含在Firefox 14和Chrome 18中。
https://developer.mozilla.org/en/docs/Web/API/MutationObserver
MutationObserver
为开发人员提供了一种对DOM中的更改做出反应的方法。它被设计为DOM3事件规范中定义的Mutation事件的替代。
使用示例
// select the target node
var target = document.querySelector('#some-id');
// create an observer instance
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
console.log(mutation.type);
});
});
// configuration of the observer:
var config = { attributes: true, childList: true, characterData: true };
// pass in the target node, as well as the observer options
observer.observe(target, config);
// later, you can stop observing
observer.disconnect();
答案 5 :(得分:0)
对adeneo的回答有两个补充:
(1)我们可以更改行
return el.classList.contains('MyClass');
收件人
if( el.classList ) {
return el.classList.contains('MyClass');
} else {
return false;
}
所以我们不会看到"Uncaught TypeError: Cannot read property 'contains' of undefined"
错误。
(2)在subtree: true
中添加config
,以在所有添加的元素中递归查找添加的节点。