0

阿罗哈。我一直在编写脚本,虽然我了解问题的每个组成部分的文档(并且查看了关于 SO 的许多其他问题),但我在实践中不了解这种特定行为。请注意,以下代码是隔离特定问题的缩写子集。这里是async.html

<!doctype html>
<html><head><script type="text/javascript" src="asyncTest.js" async="true"></script></head>
<body><ul id="menu"><li>one</li><li>two</li><li>three</li></ul></body></html>

这是asyncTest.js

var _site = function() {
  var load = function() {
    var menuCategory = document.getElementById('menu').getElementsByTagName('li');
    for(var i=0; i<menuCategory.length; i++) { alert(i+'['+menuCategory[i]+']'); }
  };

  return { load:load };
}();
window.addEventListener('load',_site.load(),false);

问题是如果没有标签async中的属性<script>,这段代码不能正确地将<li>元素存储到menuCategory中,就好像它在加载 DOM 之前运行一样(即使我认为它应该在整个window“对象”加载后触发)。我觉得这很奇怪,因为我addEventListener()只在整个加载完成后才使用时间”)。如果有的话,我认为相反的情况会导致这种行为。

有人可以解释一下吗,最好使用旧的爱因斯坦“像向六岁的孩子解释一样解释”?我显然在阅读中遗漏了一些东西。谢谢!

4

1 回答 1

1

正如 RobG 在评论中提到的,这里的问题是使用_site.load()(在调用后带有括号)导致函数被执行,然后分配给onload事件。将此行为纠正为所需功能的方法是在不带括号的情况下调用它:(_site.load_site().load)。

于 2013-03-18T08:27:26.043 回答