JS监视CSS属性更改,如“display:none”=>“display:block”?

当任何其他JS脚本/函数更改了图像的CSS属性“display”时,我想运行一些JS代码。 是否有任何方法来监视该更改并设置回调函数?

$(this).bind.('propertychange', function(){}) 

不能这样做,而setInterval也是一个坏主意。

还有什么可以做的?

这就是你要找的东西:

 document.documentElement.addEventListener('DOMAttrModified', function(e){ if (e.attrName === 'style') { console.log('prevValue: ' + e.prevValue, 'newValue: ' + e.newValue); } }, false); 

根据Jeff的建议,我建议编写一个修改图像样式属性的函数,然后使用该函数作为所有其他函数必须修改该图像样式属性的瓶颈。

 function showImage(selector, callback) { $(selector).css("display","block"); if(callback) callback(); } function hideImage(selector, callback) { $(selector).css("display","none"); if(callback) callback(); } 

必须更改图像CSS属性时,可以从JavaScript中的任何位置调用上述两个函数。 这些函数还将一个函数作为参数,该函数将在事后执行,假设函数作为第二个参数传入。

您可以进一步将其简化为单个function,但我会将其留给您,因为我不确切知道您的目标是什么。

这是您不想修改的旧JavaScript文件内部:

 // this is your original, unmodified function function originalFunction(sel) { alert(sel); $(sel).css("display","none"); } 

这是在你的代码中:

 // here is a sample callback function you pass into the extended function below function myCallback(s) { alert("The image with src = '" + $(s).attr("src") + "' has been modified!"); } // here is how you can extend the function to do what you want // without needing to modify the actual code above originalFunction = (function(legacyFn, callback) { // 1 arg function to be returned and reassigned to originalFunction return function(sel) { // call "original" originalFunction, with alert and image hide. legacyFn(sel); if(callback) callback(sel); // invoke your callback } })(originalFunction, myCallback); 

变量originalFunction被赋予一个带有一个参数的函数。 带有一个参数的函数由一个匿名的自执行函数返回,该函数接受2个参数,在修改之前对originalFunction的引用,以及对callback函数的引用。 这两个函数引用变为“锁定”在闭包内部,以便当自动执行函数为legacyFn分配新值时, legacyFn参数在修改之前仍包含对originalFunction的引用。

总之,在更高级别, originalFunctionmyCallback作为参数传递给自执行匿名函数,并传递给变量legacyFn和callback,然后将新函数分配给originalFunction

现在,当您调用originalFunction('.someClassOnAnImage') ,将触发legacyFn,它将提醒选择器并将display属性设置为none。 之后,回调函数(如果存在)将触发,然后您将看到:

 The image with src = '.someClassOnAnImage' has been modified! 

虽然这不如假设或特定于平台的addEventListener好,但它允许您修改遗留代码中函数的行为,而无需物理破解这些文件并对其进行修改。 这只是扩展了函数以执行其他行为,但无需修改原始函数甚至原始文件。

您可以将所有扩展名整齐地包含在单独的JavaScript文件(或您正在使用的任何JavaScript文件中)中,如果您想要回到原始行为,则只需删除扩展函数即可。

答案:看到这篇文章>> 有没有替代DOMAttrModified将在webkit中工作

Rant:DOM Mutation事件是您解决问题的关键。 然而,在新一轮的浏览器大战中,Wekit和Gecko无法达成一致意见。 虽然Gecko有DOMAttrModified,但是webkit有一个叫做变异观察者的东西(它打破了附加到事件的事件处理程序的模式,但是当我们想要锁定用户/编码器时,谁会关心一致性?)

PS:在这里添加这个为同样智慧的未来寻求者。