Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在DOM元素';s样式对象更改?_Javascript_Jquery_Css_Javascript Events - Fatal编程技术网

Javascript 在DOM元素';s样式对象更改?

Javascript 在DOM元素';s样式对象更改?,javascript,jquery,css,javascript-events,Javascript,Jquery,Css,Javascript Events,元素有一个javascriptstyle对象,该对象包含css样式的不同名称和值。我想在每次对象更改时触发一个函数,而不使用轮询。是否有任何方法可以做到这一点,使其与跨浏览器兼容,并且能够可靠地与第三方代码一起工作(因为假设您提供了一个插入式脚本)?绑定一个javascript事件,如DOMAttrModified或DOMSubtreeModified是不够的,因为它们不能在Chrome中工作。即使对于所有最现代的浏览器,也没有跨浏览器的方法来实现这一点。您必须通过一个可能触发事件侦听器的函数来

元素有一个javascript
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的答案所说的()事实上,插件就是因为这个问题而编写的!