我应该使用 window.onload 事件吗

Should I use window.onload event

也许这是一个重复的问题,但我想问一下。

我想制作一个不使用第三方库的 JS 应用程序,目的是在浏览器中学习 JS 事件。

所以我这样构建我的应用程序:

var APP = APP || (function (global) {
   return {
       digitsField: {},
       // other properties, methods
       init: function (config) {
          try {
              this.digitsField = global.getElementById('digitsField');
              return this;
          } catch (error) {
              console.log(error.message);
              return false;
          };
       }
   };
} (window.document));

我的 html 页面看起来像这样:

<!DOCTYPE html>
<html>
    <head> 
         <link rel="stylesheet" href="css/style.css">
         <script type="text/javascript" src="js/script.js"></script>
    </head>
    <body onload="APP.init({});">
         <input type="text" value="0" class="textField" readonly="true" id="digitsField"/>
         // other html tags
    </body>
</html>

虽然我将 window.document 发送到我的直接函数,但在加载页面或调用 APP.init() 函数之前,digitsField 标记仍未为其他工作定义。我还在 firebug 中注意到,在 DOM 选项卡中,有一个全局行专用于 onload 事件,这会扰乱全局命名空间。也许有更好的方法可以在不使用 window.onload 事件或第三方库的情况下将 APP.digitsField 初始化为标签对象?

让我知道你的想法。

window onload 事件在加载所有内容(包括外部资源)时触发。但是,您应该只需要等待 DOM 加载,这样您就可以将处理程序附加到 DOMContentLoaded 事件:

document.addEventListener("DOMContentLoaded", function() {
    // code...
});

这应该适用于比 IE8 更新的浏览器(因此 IE9 及更高版本)。

如果您想获得与 DOM 相同的好处,并与 full-browser 兼容,只需将您的代码移至 body 元素的结束标记内。

例如

<body>
     <input type="text" value="0" class="textField" readonly="true" id="digitsField"/>
     // other html tags
     <script>
         APP.init({});
     </script>
</body>

否则考虑移动到 jQuery 及其 DOM 就绪事件,它会为您处理浏览器兼容性问题。

例如

$(document).ready(function(){
   APP.init({});
});

或快捷方式版本:

$(function(){
   APP.init({});
});

jQuery版本可以放在任何地方(header、body等)