我需要注意特定DOM元素的任何子元素的属性更改。到目前为止,我一直在使用mutation events。
问题是 - 他们是越野车:例如在Chromium下,DOMAttrModified
未被解雇,但是DOMSubtreeModified
。这个问题很容易解决:因为根据规范,如果触发了任何其他事件,就会触发DOMSubtreeModified
,所以我只是听了DOMSubtreeModified
。
无论如何,Chromium在最近的版本中,如果某个属性被修改,就会停止触发任何内容。
然而,新的Mutation Observer API完美无缺。
到目前为止,我只需要在任何特定元素的子树更改时触发回调 - 只是因为没有别的东西可以改变 - 所以我通过使用变异事件来解决我的问题。同一段代码中的变异观察者(如果可用)。
但是,现在我需要对事件进行更强大的过滤(例如,在新节点上,在删除的节点上) - 所以一个库,可能是一个jQuery插件,它将允许我优雅地使用这些API的两者 - MutationObserver
(如果可用)和突变事件作为后备,能够过滤特定事件类型(例如添加元素,属性已更改)。
E.g。
$("#test").watch({onNewElement: 1}, function(newElement){})
$("#test").watch({onNewAttribute: 1}, function(modifiedElement) {})
或没有jQuery
watchChanges("#test", {onNewElement: 1}, function(newElement){})
watchChanges("#test", {onNewAttribute: 1}, function(modifiedElement){})
答案 0 :(得分:2)
这会有用吗?
http://darcyclarke.me/development/detect-attribute-changes-with-jquery/
$.fn.watch = function(props, callback, timeout){
if(!timeout)
timeout = 10;
return this.each(function(){
var el = $(this),
func = function(){ __check.call(this, el) },
data = { props: props.split(","),
func: callback,
vals: [] };
$.each(data.props, function(i) { data.vals[i] = el.css(data.props[i]); });
el.data(data);
if (typeof (this.onpropertychange) == "object"){
el.bind("propertychange", callback);
} else if ($.browser.mozilla){
el.bind("DOMAttrModified", callback);
} else {
setInterval(func, timeout);
}
});
function __check(el) {
var data = el.data(),
changed = false,
temp = "";
for(var i=0;i < data.props.length; i++) {
temp = el.css(data.props[i]);
if(data.vals[i] != temp){
data.vals[i] = temp;
changed = true;
break;
}
}
if(changed && data.func) {
data.func.call(el, data);
}
}
}
答案 1 :(得分:2)
为了使用jQuery进行有效的DOM监控,您可以查看使用优化版jQuery Behavior Plugin的Live Query(免责声明:我是作者)。我现在已经在几种产品中使用它3年了,没有任何问题。
编辑:收听属性更改将如下所示:
$.behavior({
'div:first': {
'changeAttr': function (event, data) {
console.log('Attribute "' + data.attribute + '" changed from "' + data.from + '" to "' + data.to + '"');
}
}
});
$('div:first').attr('foo', 'bar');