Javascript执行后页面渲染IE6

J.H*_*rix 0 javascript iframe rendering onload internet-explorer-6

在IE 6中完全呈现页面之前,我遇到了一些运行JavaScript的问题(可能还有其他版本,但现在只测试IE6.Firefox似乎没问题).我可以通过这样调用js来解决window.onload这个问题:

window.onload = function(){doIt();}
Run Code Online (Sandbox Code Playgroud)

但是,我担心的是,我将覆盖可能已存在的任何其他内容window.onload.代码将用作库的一部分,因此我不能保证window.onload不会被其他人设置在其他地方.我宁愿将我的函数添加到这样的onload事件:

window.onload += function(){doIt1();}
window.onload += function(){doIt2();}
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,只会doit2()被召唤.有没有办法在页面完全呈现时注册事件处理程序?我的第二个想法是将我的代码放在一个循环检查中,以确保在运行之前我的所有对象都存在.但我担心这可能会锁定浏览器.

仅仅为了一些背景信息,我的代码隐藏/显示iFrames.我知道我可以使用iFrame的onload属性,但我需要在调用代码之前完全加载所有iFrame.

来自社区的任何想法?在此先感谢您的投入.

Jos*_*ola 6

使用这个通用的addLoadEvent函数......

function addLoadEvent(func) {
  if(typeof window.onload != 'function')
    window.onload = func;
  else {
    var oldLoad = window.onload;

    window.onload = function() {
      if(oldLoad) oldLoad();
      func();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这基本上排队了要执行的功能.它永远不会覆盖先前分配的处理程序.以下示例用法......

addLoadEvent(function() { alert("One!"); });

addLoadEvent(two);
function two() {
  alert("Two!");
}
Run Code Online (Sandbox Code Playgroud)

我想提一下像jQuery这样的库会为你处理这样的已知问题.

  • 反应快!而且几乎就是我要放的东西!为清晰起见,您可能希望将示例用法放入代码块中.值得注意的是,这将始终将新函数添加到被调用链的末尾.这可以通过在第二部分中更改`func()`和`oldload()`调用的顺序来简单地改变,或者可以通过将第二个变量传递给函数(如果它需要是可更改的)来改变. (2认同)