JavaScript-重写或阻止执行
我正在处理一个客户端项目,我必须包括它们的页眉和页脚,其中包括一些核心JavaScript文件。我在页面上有几个JavaScript-重写或阻止执行,javascript,jquery,Javascript,Jquery,我正在处理一个客户端项目,我必须包括它们的页眉和页脚,其中包括一些核心JavaScript文件。我在页面上有几个PNGs,但是它们的核心JS文件编码很差,在尝试用使用AlphaImageLoader过滤器的DIVS替换包含.PNG文件的IMG标记之前,没有检查IE 7。结果是,在IE 7中,所有my.png图像被替换为具有默认显示:块的DIV标记,从而在my页面中的每个png图像后导致换行 我想做的是用一个更好的函数覆盖他们的函数,或者以某种方式阻止他们执行,但是我不能修改JS文件本身,它定义了
PNG
s,但是它们的核心JS文件编码很差,在尝试用使用AlphaImageLoader
过滤器的DIVS
替换包含.PNG
文件的IMG
标记之前,没有检查IE 7。结果是,在IE 7中,所有my.png
图像被替换为具有默认显示:块的DIV
标记,从而在my页面中的每个png图像后导致换行
我想做的是用一个更好的函数覆盖他们的函数,或者以某种方式阻止他们执行,但是我不能修改JS文件本身,它定义了函数并将其附加到窗口onload
事件。我曾尝试在几个地方(标题,就在/body
标记之前,在$(document).ready
中,等等)以相同的名称重新定义函数,但原始函数似乎总是执行,大概是因为原始函数代码是与事件处理程序一起存储的,而不仅仅是指向函数的指针
我能修好吗?有没有一种方法可以选择性地删除onload
事件处理程序?如果这是唯一一种在加载时运行的方法,我认为您可以这样做
window.onload = null;
如果有其他东西在运行,我想你必须重新连接它们。我想它有点易碎 页眉和页脚之间的一个大IFRAME应该可以做到这一点。在IE7中,您可以使用detachEvent方法:-
window.detachEvent("load", fn)
其中fn是附加的函数,但是由于在这个混合中有jquery,因此要获得附加的实际函数可能是一项艰巨的任务。实际附加的函数很可能是匿名的。好吧,根据它的绑定方式,您可能可以通过以下方式逃脱:
window.onload = function(){
var alert=function(a){
console.log(a);
}
window.onload();
}
显然,您希望重新定义alert以外的内容,但这可能会起作用。如果仅此而已,您可以编写一个函数来反转它,查找所有png图像并删除div,如果您希望跳过某些图像,则可以将一个属性插入到您希望以不同方式处理的图像中
另一种方法是通过在图像文件名中不包含png部分来欺骗函数,并在加载时附加.png(在加载后)
或者,您可以用另一个标记替换png图像,并替换onload
顺便说一句,如果您只是提醒window.onload,那么您可以确切地知道onload中的内容,如果只有该功能,请设置window.onload=null 您是否尝试过使用$(窗口)。解除绑定(“加载”)
您知道替换PNG图像的函数名吗?如果是这样,您可以通过执行以下操作来覆盖现有函数:
// Assuming PNG function is called pngSwap
function pngSwap() {
alert('png swap');
}
$(document).ready(function() {
if (window.pngSwap && window.pngSwap.constructor === Function) {
var oldFunc = window.pngSwap;
window.pngSwap = function() {
alert('new png swap');
}
}
pngSwap();
});
他们是用事件侦听器分配它,还是仅仅通过window.onload分配它?您试图覆盖的JS文件是否使用jQuery?我认为有一个解决方案,如果是这样的话,你能看看JS内部,看看它是如何绑定的吗?这很重要。它是使用window.attachEventYeah绑定的。问题是我不知道还有什么附加的,也不能做出任何保证。有没有办法列举所有附加的事件?Hrm,我建议的是启动Firebug或其他东西,然后看看window.onload。可能有一些明显的方法可以更改它。使用“load”会引发错误,但“onload”不会。然而,这两个函数都没有停止函数的执行。@Chris:我不记得IE在这种情况下是否使用了“on”前缀。它不起作用的原因是,所讨论的函数要么是由附加到事件的另一个函数调用的,要么是由直接分配到onload属性的函数调用的。如果您添加一点代码或事件,或者对您试图对该问题执行的操作进行一个小的复制,这可能会有所帮助。该函数可能正在运行匿名分配或通过代理分配。如果它已经附加了attachEvent,detachEvent对于一个已知的函数来说应该是有效的。是的,IE的前缀是“on”。仅供参考,将window.onload设置为null不起作用,至少对于IE 7来说是这样。分配的事件处理程序仍在启动。window.onload=function(){}怎么样;如果这并不能阻止该函数,那么您应该修复的不仅仅是它的document.body.onload,还可能是它的document.body.onload,也可能是特定元素的onload,比如空图像。。。