Javascript addLoadEvent对onload冲突没有帮助

Javascript addLoadEvent对onload冲突没有帮助,javascript,onload,Javascript,Onload,我使用流行的addLoadEvent进行所有JS加载,如下所示: function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function() { if (oldonload) { oldonload

我使用流行的addLoadEvent进行所有JS加载,如下所示:

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

addLoadEvent( locationToggle );
addLoadEvent( step1 );
addLoadEvent( step2 );
addLoadEvent( step3 );
addLoadEvent( getCounties );
addLoadEvent( mapSelection);
我所读到的所有内容都表明,这是一种避免加载冲突的相当可靠的方法。然而,这种方法似乎并不比在匿名window.onload函数中包装函数更好。这两种方法都会导致与这组函数相同的onload冲突

我从与addLoadEvent函数本身相同的文件中加载这些函数。我还使用calender.js,这是一个第三方文件,在另一个文件中使用mootools 1.2.4。我的文件没有Javascript

首先,有人可以验证我没有破坏代码,我使用它的权利。第二,有人能提出为什么上述措施不能解决冲突吗

编辑
禁用所有其他Javascript文件后,问题仍然存在。

您的代码很好。问题是,以dom0方式进行设置不能确保它们不会被其他代码替换

您可以尝试新的W3C标准和IE版本,因为它们附加的处理程序不能被第三方代码替换

// window.onload W3C cross-browser with a fallback
function addLoadEvent(func) {
  if (window.addEventListener)
    window.addEventListener("load", func, false);
  else if (window.attachEvent)
    window.attachEvent("onload", func);
  else { // fallback
    var old = window.onload;
    window.onload = function() {
      if (old) old();
      func();
    };
  }
}
请注意,IE将以相反的顺序执行函数,而不是按照您添加它们的顺序执行(如果这是一个问题)

最后,我不知道您想什么时候运行代码,但是如果您不想等待图像加载,您可以提前执行函数,然后执行window.onload

有一个,可以让您这样做

有了它,您可以附加早期事件的函数:document.ready(DOMContentLoaded)

//document.ready
函数addLoadEvent(func){
if(函数类型==“函数”){
addLoadEvent.queue.push(func);
}
}
addLoadEvent.queue=[];
//////////////////////////////////////////////////////////////////////////////
//迪安·爱德华兹/马蒂亚斯·米勒/约翰·雷斯格
函数init(){
//如果已调用此函数,请退出
if(arguments.callee.done)返回;
//标记这个函数,这样我们就不会做同样的事情两次
arguments.callee.done=true;
//停止计时
如果(_定时器)清除间隔(_定时器);
//执行任务:执行队列
var que=addLoadEvent.queue;
var len=que.长度;
对于(变量i=0;i
注意:这两种方法的用法与您的版本相同


好的,现在它工作了。显然,我需要一个更新的Javascript参考:)很长一段时间以来,我一直在回复——我开始怀疑其中一个函数被破坏了。事实证明这是正确的,但毫无帮助。你可能想看看Crockford的语言视频。他是最好的:(YUI剧院)
// document.ready
function addLoadEvent(func) {
  if (typeof func == "function") {
    addLoadEvent.queue.push(func);
  }
}
addLoadEvent.queue = [];

//////////////////////////////////////////////////////////////////////////////

// Dean Edwards/Matthias Miller/John Resig

function init() {
  // quit if this function has already been called
  if (arguments.callee.done) return;

  // flag this function so we don't do the same thing twice
  arguments.callee.done = true;

  // kill the timer
  if (_timer) clearInterval(_timer);

  // do stuff: execute the queue
  var que = addLoadEvent.queue;
  var len = que.length;
  for(var i = 0; i < len; i++) {
    if (typeof que[i] == "function") {
      que[i]();
    }
  }
};

/* for Mozilla/Opera9 */
if (document.addEventListener) {
  document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
  document.write("<script id=__ie_onload defer src=javascript:void(0)>"
                +"<\/script>");
  var script = document.getElementById("__ie_onload");
  script.onreadystatechange = function() {
    if (this.readyState == "complete") {
      init(); // call the onload handler
    }
  };
/*@end @*/

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
  var _timer = setInterval(function() {
    if (/loaded|complete/.test(document.readyState)) {
      init(); // call the onload handler
    }
  }, 10);
}

/* for other browsers */
window.onload = init;