我正在使用.on()
来绑定在页面加载后创建的div元素的事件。对于点击、鼠标进入等事件它运行得很好,但是我需要知道何时添加了一个新的class为MyClass的div元素。我正在寻找以下解决方案:
$('#MyContainer').on({
wascreated: function () { DoSomething($(this)); }
}, '.MyClass');
我该怎么做?我已经成功地编写了整个应用程序,没有使用插件,我想保持这种方式。
谢谢。
我正在使用.on()
来绑定在页面加载后创建的div元素的事件。对于点击、鼠标进入等事件它运行得很好,但是我需要知道何时添加了一个新的class为MyClass的div元素。我正在寻找以下解决方案:
$('#MyContainer').on({
wascreated: function () { DoSomething($(this)); }
}, '.MyClass');
我该怎么做?我已经成功地编写了整个应用程序,没有使用插件,我想保持这种方式。
谢谢。
以前,人们可以钩入jQuery的 domManip
方法来捕获所有jQuery DOM操作并查看插入了哪些元素等等。 但是,自jQuery 3.0+开始,jQuery团队关闭了此功能,因为这通常不是钩入jQuery方法的好方法,并且他们使内部 domManip
方法不再在核心jQuery代码之外可用。
Mutation Events也已被弃用,因为以前可以执行类似以下内容的操作
$(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);
这是我编写的插件,可以实现您所需的功能 - jquery.initialize
使用方式与使用.each
函数相同,只需在元素上使用.initialize
函数即可。与.each
不同的是,它还会初始化将来添加的元素,而无需任何额外的代码-无论您是否使用AJAX或其他方式添加它们。
Initialize
的语法与.each
函数完全相同
$(".some-element").initialize( function(){
$(this).css("color", "blue");
});
但现在如果页面上出现了新元素与.some-element选择器匹配,它将立即被初始化。添加新项的方式并不重要,你不需要关心任何回调等。
$("<div/>").addClass('some-element').appendTo("body"); //new element will have blue color!
插件基于MutationObserver
$.initialize(".addDialog", function () {
$('.noData').hide();
});
- Heimi.initialize
函数的回调,并跳过页面最初加载时已经存在的元素的回调?我正在尝试向options
中添加一个参数来实现这一点,但到目前为止我还没有成功。 - Nevermore$('.myClass').addClass('ignore-initialize'); $.initialize('.myClass:not(.ignore-initialize)', callback);
- Adam Pietrasiak在查看了这篇和几篇其他帖子后,我试图将我认为最好的方案提炼出来,以便能够检测到元素类别的插入,并对这些元素进行操作。
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);
});
对我来说,重要的是,这使得目标元素能够存在于“addedNodes”中的任何深度,并且可以在最初插入元素时处理该元素(无需搜索整个文档设置或忽略“已处理”标志)。
if(mutation.addedNodes.length)
,因为在类型为 childList
的 mutation
中,addedNodes
和 removedNodes
数组总是存在的(在 IE11、Chrome53、FF49 中已经检查过)。仍然给你一个加分,因为你是唯一一个考虑到了 addedNodes
的答案(只有在添加节点时才调用 callback
);不仅在这个线程上,在许多其他线程上也是如此。其他人只是为所有变异调用 callback
,即使节点被删除。 - Vivek Athalye经过3年经验后,我如何听懂“DOM中添加某个类的元素”的说法:你只需要在jQuery的html()
函数中添加一个钩子,就像这样:
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);
如果你正在使用jQuery,那么这个方法适用于你。它不依赖于特定于浏览器的DOMNodeInserted
事件,因此具有跨浏览器兼容性。我还为.prepend()
添加了相同的实现。
总体来说,这对我非常有效,希望对您也是如此。
html
助手函数来修改DOM,而不是仅仅“使用jQuery”,那么这个方法才能生效。例如,使用jQuery.append
添加的元素不会触发此事件。 - iameliinsertionQ('#intercom-container').every(function(/element){ element.style.display = 'none'; });
- Dan Dascalescuhttp://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-mutationevents
编辑
来自MDN: https://developer.mozilla.org/zh-CN/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 Events 规范中 Mutation Events 的替代品。// 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();
对adeneo的回答做出两点补充:
(1) 我们可以更改该行
return el.classList.contains('MyClass');
到
if( el.classList ) {
return el.classList.contains('MyClass');
} else {
return false;
}