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、タグに属性がないと、DOM がロードされる前に実行されたかのように、このコードが要素を に<script>適切に格納しないことです ( 「オブジェクト」全体がロードされた後に起動する必要があると思っていましたが)。全体がロードされた後にのみこれを試して実行するために を使用しているので、それは奇妙だと思います(そして、Chromium、FF、および Opera では適切なタイミングで実行されるように見えます-少なくとも「適切と思われるもの」時間")。どちらかといえば、逆がこの動作を引き起こすと思います。<li>menuCategorywindowaddEventListener()

できれば古いアインシュタインを使用して、誰かがこれを説明できますか? 私は明らかに私の読書に何かが欠けています。ありがとう!

4

1 に答える 1

1

コメントでRobGが述べたように、ここでの問題は、_site.load()(呼び出しの後に括弧を付けて)を使用すると、関数が実行され、onloadイベントに割り当てられることです。この動作を目的の機能に修正する方法は、括弧なしで呼び出すことです: _site.load(または_site().load)。

于 2013-03-18T08:27:26.043 に答える