在页面加载时绑定事件的跨浏览器兼容方式

Posted

技术标签:

【中文标题】在页面加载时绑定事件的跨浏览器兼容方式【英文标题】:Cross-browser compatible way to bind events on page load 【发布时间】:2011-09-15 05:13:52 【问题描述】:

使用jQuery,我可以在DOM 加载后立即使用以下函数执行代码:

$(function() 
    // do stuff here
);

或等效:

$(document).ready(function()  
    // do stuff here
);

为了更好地理解原始 javascript,我正在使用这段代码来实现类似的效果:

window.onload = function() 
    // do stuff here

此方法是否跨浏览器兼容?有没有更好的方法来实现这个功能?

【问题讨论】:

jQuery 解决了“跨浏览器”问题,“实现此功能的更好方法”。 重复***.com/questions/3474037/… 【参考方案1】:

是的,它是跨浏览器兼容的,但onLoad 在触发之前等待页面上的所有内容加载。在内部jQuery.ready 使用DOMContentLoaded event 和一些技巧来支持不支持DOMContentLoaded 的旧浏览器。大多数modern browsers support DOMContentLoaded 包括IE 9 开始。您可以测试浏览器是否支持DOMContentLoaded using this page。

如果您没有使用内置支持DOMContentLoaded 的 DOM 库,例如 jQuery,您可以使用 DOMContentLoaded,如果浏览器不支持,则回退到 onLoad

(function ()  // Encapsulating our variables with a IIFE
  var hasRun = false;  // a flag to make sure we only fire the event once
                       // in browsers that support both events
  var loadHandler = function (evt) 
    if (!hasRun) 
      hasRun = true;
      console.log('loaded via ' + evt.type);
    
  ;
  
  document.addEventListener('DOMContentLoaded', loadHandler, false);
  window.addEventListener('load', loadHandler, false);
());

除非您希望访问者使用 IE8 等非常旧的浏览器,否则您完全可以安全地使用 DOMContentLoaded 而无需备份。

document.addEventListener('DOMContentLoaded', function (evt) 
  console.log('loaded via ' + evt.type);
, false);

【讨论】:

【参考方案2】:

这类似于 JQuery 所做的:

window.$ = ;
$.ready = function(fn) 
  if (document.readyState == "complete")
      return fn();

  if (window.addEventListener)
      window.addEventListener("load", fn, false);
  else if (window.attachEvent)
      window.attachEvent("onload", fn);
  else
      window.onload = fn;

并使用它:

$.ready(function() 
  // code here...
);

【讨论】:

【参考方案3】:

window onload 方法是跨浏览器兼容的,但还有更好的选择。

当 DOM 就绪时触发 jQuery 就绪事件。 当所有数据下载完毕后,window onload 事件就会触发。

假设您的页面上有很多图片(或一张大图片)。 html 文件将在图像下载完成之前很久就完成下载并准备好进行操作。所以 jQuery 的 ready 事件开始了,你可以开始做很棒的 JavaScript 东西,同时下载所有漂亮的图片。

这就是使用 js 库是个好主意的原因之一。

当没有那么多图像时,差异可以忽略不计。但是,您一次只能在 onload 事件上设置一个方法。但是,您可以多次设置 jQuery 的 ready 事件,并且每个方法都会被顺序调用。

【讨论】:

【参考方案4】:

跨浏览器兼容性将取决于您如何定义“浏览器”一词。例如,如果它是基于文本的浏览器,那么它可能不是您想要的。

为了回答您的问题,如果特定浏览器支持 window.onload 功能,它将是跨浏览器兼容的。

作为一般指南,我们通常使用经过测试的库,以便我们允许这些库处理这种“跨浏览器”兼容性,并处理实际的应用程序逻辑。

希望对你有帮助!

【讨论】:

为您的回答干杯!我正在尝试正确学习原始JS,因为我开始使用jQuery @aligray:我赞扬你的努力。我希望每个人都有这个愿望。然而,使用原始 JavaScript 无法轻松完成很多事情,而使用 jQuery 可以轻松完成。换句话说,我不认为它是“one or other”。我相信您可以实现您的 jQuery 时学习正确的 JavaScript。任何你不再需要的东西,因为 jQuery 做得更好,好吧,你不再需要它了。再说一次,我在 10 多年前学习了 JavaScript。 @aligray 如果你想以“正确”的方式学习 JS,我建议阅读 Douglas Crockford 的书 JavaScript: The Good Parts 和 Stoyan Stefanov 的书 Object-Oriented JavaScript:创建可扩展、可重用的高质量 JavaScript 应用程序和库两者都非常出色。如果你对这种库级别的东西感兴趣,John Resig 的 JavaScript Ninja 的秘密 将是一个很好的资源......如果他们最终发布它(它最初定于 2008 年秋季,当时我预购)。 @Useless Code 谢谢,我一定会调查的。

以上是关于在页面加载时绑定事件的跨浏览器兼容方式的主要内容,如果未能解决你的问题,请参考以下文章

js绑定事件方法:addEventListener的兼容问题

事件绑定,event兼容各浏览器

关于浏览器滚动的兼容性问题以及事件绑定

js jquery 代码如何调Firefox 兼容

JavaScript — event介绍以及兼容处理

js学习总结----DOM2兼容处理顺序问题