Javascript 在DOM元素';s样式对象更改?
元素有一个javascriptJavascript 在DOM元素';s样式对象更改?,javascript,jquery,css,javascript-events,Javascript,Jquery,Css,Javascript Events,元素有一个javascriptstyle对象,该对象包含css样式的不同名称和值。我想在每次对象更改时触发一个函数,而不使用轮询。是否有任何方法可以做到这一点,使其与跨浏览器兼容,并且能够可靠地与第三方代码一起工作(因为假设您提供了一个插入式脚本)?绑定一个javascript事件,如DOMAttrModified或DOMSubtreeModified是不够的,因为它们不能在Chrome中工作。即使对于所有最现代的浏览器,也没有跨浏览器的方法来实现这一点。您必须通过一个可能触发事件侦听器的函数来
style
对象,该对象包含css样式的不同名称和值。我想在每次对象更改时触发一个函数,而不使用轮询。是否有任何方法可以做到这一点,使其与跨浏览器兼容,并且能够可靠地与第三方代码一起工作(因为假设您提供了一个插入式脚本)?绑定一个javascript事件,如DOMAttrModified
或DOMSubtreeModified
是不够的,因为它们不能在Chrome中工作。即使对于所有最现代的浏览器,也没有跨浏览器的方法来实现这一点。您必须通过一个可能触发事件侦听器的函数来路由所有css样式更改。这将是最干净的方法。编辑4:现场演示
$(函数(){
$('#toggleColor')。在('click',function()上{
$(this.toggleClass('darkblue');
}).改变({
trackValues:true,
回调:函数(事件){
$(this.html(“- 属性名称:“+event.attributeName+”
- 旧值:“+event.oldValue+”
- 新值:“+event.newValue+”
”;
}
});
});代码>
正文{
字体系列:“Helvetica Neue”,Helvetica,Arial,无衬线;
字体大小:12px;
}
#切换颜色{
高度:70像素;
宽度:300px;
填充物:5px;
边框:1px实心#C2C2;
背景色:#DBEAF9;
}
#切换颜色范围{
字体大小:粗体;
}
#toggleColor.darkblue{
背景色:#1A9ADA;
}
单击div下面的以切换类暗蓝色
EDIT2:
如果仍要使用变异观察者
,请使用此库:
编辑:
正如我在下面的回答中所说,感谢Vega的评论,不建议在大型应用程序中使用object.watch
或变异观测者。这是以下的实际报价:
通常情况下,您应该避免在以下情况下使用watch()
和unwatch()
可能的这两种方法只在Gecko中实现,它们是
主要用于调试使用。此外,使用观察点
对绩效有严重的负面影响,尤其如此
在全局对象上使用时,如窗口。你通常可以使用
设置者和获取者或代理。有关详细信息,请参阅兼容性
警告
因此,如果跨浏览器兼容性在您的检查列表中,我再次强烈建议覆盖样式
对象的setter
s和getter
s。
在跨浏览器解决方案中使用并牢记以下内容:
您也可以重写元素的样式
对象的getter
和setter
方法
有一个jQuery插件可用于此功能,在对a的回答中,建议如果您知道样式设置交互将通过标准接口执行(即始终使用jQuery等),则建议在调用库方法时触发自定义事件
这将允许更广泛的支持矩阵,但如果在不使用库方法的情况下执行,则会忽略任何属性更改。这种方法似乎也不适用于任何情况,因为它们不能总是被依赖。我发现了这个小插件,它可以完全做到这一点,并且可以改变它来添加任何你想要的突变。。。即使是滚动高度变化监听器
插件:
以下是演示:
您可以使用。该插件的主要功能是在HTML元素属性更改时绑定一个侦听器函数。我有一个答案,但是,你的目标是古老的浏览器吗?还是仅仅是主流浏览器?@3p3r我也在瞄准较旧版本的浏览器,但我肯定对只瞄准较新版本的解决方案感兴趣versions@3p3r但不,我不在乎没有人使用的旧浏览器,比如Konqueror或其他…@user730569我曾经使用过的,使用getter
和setter
来获得最高性能!webkit的浏览器支持是什么样的?(chrome和safari的发展历史有多远?)onPropertyChange的情况如何?
?MutationObserver非常新,但在最近的WebKit和Firefox中得到了支持。它们是DOM修改事件的未来,我很高兴看到它们包含在这个答案中这是一个很好的答案,但如果它也能处理非固定版本(Firefox15支持),那就更好了var MutationObserver=window.MutationObserver | | | window.webkit MutationObserver | | | window.MozMutationObserver
@benvie我在哪里可以找到支持它们的特定浏览器版本?不需要中的附件事件
分支addEventListener
对IE的支持(两者都是在IE 9中引入的)。我认为watch使用轮询。。OP正在寻找不使用polling@Vega嗯,我对Gecko的源代码不太了解,但我认为“polling”OP的意思是手动setInterval
s,不是吗?这个插件使用了一种有趣的方法,但它确实使用了轮询(参见setTimeout(reset,mutate.speed);
line(你可能需要将其缩小以使其可读)这就是Vega的答案所说的()事实上,插件就是因为这个问题而编写的!