我想在任何其他JS脚本/函数更改图像的CSS属性“display”时运行一些JS代码。是否有任何方法来监视该更改并设置回调函数?
$(this).bind.('propertychange', function(){})
不能这样做,而setInterval也是一个坏主意。
还能做些什么?
答案 0 :(得分:8)
这就是你要找的东西:
document.documentElement.addEventListener('DOMAttrModified', function(e){
if (e.attrName === 'style') {
console.log('prevValue: ' + e.prevValue, 'newValue: ' + e.newValue);
}
}, false);
答案 1 :(得分:1)
根据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中的任何位置调用上述两个函数。这些函数还将一个函数作为参数,该函数将在事后执行,假设函数作为第二个参数传入。
您可以进一步将其简化为单一功能,但我会留给您,因为我不确切知道您的目标是什么。
答案 2 :(得分:1)
这是您不想修改的旧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
函数的引用。这两个函数引用在闭包内变为“锁定”,这样当originalFunction
被自执行函数赋值为新值时,legacyFn
参数仍包含对originalFunction
的引用。在被修改之前。
总之,在更高级别,originalFunction
和myCallback
作为参数传递给自执行匿名函数,并传递给变量legacyFn和callback,然后一个新函数分配给originalFunction
。
现在,当您调用originalFunction('.someClassOnAnImage')
时,将触发legacyFn,这将提醒选择器并将display属性设置为none。之后,回调函数(如果存在)将触发,然后您将看到:
The image with src = '.someClassOnAnImage' has been modified!
虽然这不如假设或特定于平台的addEventListener好,但它确实允许您修改遗留代码中函数的行为,而无需物理破解这些文件并对其进行修改。这只是扩展了函数以执行其他行为,但无需修改原始函数甚至原始文件。
您可以将所有扩展程序整齐地包含在单独的JavaScript文件中(或者您正在使用的任何JavaScript文件中),如果您想要回到原始行为,则只需删除扩展函数。
答案 3 :(得分:1)
答案:请参阅此其他帖子>> is there an alternative to DOMAttrModified that will work in webkit
咆哮: DOM Mutation事件是您解决问题的关键。然而,在新一轮的浏览器大战中,Wekit和Gecko无法达成共识。虽然Gecko有DOMAttrModified,但是webkit有一个叫做变异观察者的东西(它打破了附加到事件的事件处理程序的模式,但是当我们想要锁定用户/编码器时,谁会关心一致性?)
P.S:只是在这里为未来寻求相同智慧的人添加这个。