JavaScript-重写或阻止执行

JavaScript-重写或阻止执行,javascript,jquery,Javascript,Jquery,我正在处理一个客户端项目,我必须包括它们的页眉和页脚,其中包括一些核心JavaScript文件。我在页面上有几个PNGs,但是它们的核心JS文件编码很差,在尝试用使用AlphaImageLoader过滤器的DIVS替换包含.PNG文件的IMG标记之前,没有检查IE 7。结果是,在IE 7中,所有my.png图像被替换为具有默认显示:块的DIV标记,从而在my页面中的每个png图像后导致换行 我想做的是用一个更好的函数覆盖他们的函数,或者以某种方式阻止他们执行,但是我不能修改JS文件本身,它定义了

我正在处理一个客户端项目,我必须包括它们的页眉和页脚,其中包括一些核心JavaScript文件。我在页面上有几个
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,比如空图像。。。