0

現在の要素を識別するために、このループでインクリメンターiを呼び出すのに少し問題があります。Firebugは私にエラーを与えます"li[i].addEventListener is not a function"

document.addEventListener("DOMContentLoaded", function(){

var li = document.getElementsByTagName('li');

for(var i in li){
    li[i].addEventListener('click', function(){
        alert('yey');
    });
    }
});

奇妙なことは、私が電話した場合です

alert(li[i].getAttribute('id')

IDが通知されますが、

var id=li[i].getAttribute('id');
document.getElementById(id).addEventListener(blah);

同じ「関数ではありません」というエラーが表示されます。これはforinloopのものですか?alert(i);ループの最後に余分なものが呼び出されていることに気づきました。forinループでインクリメントを使用する別の方法はありますか?ちなみに、私が使用しているリストは次のとおりです。

<ul>
    <li id=pomp>
        stuff
    </li>
    <li id=and>
        and
    </li>
    <li id=circumstance>
        things
    </li>
</ul>
4

3 に答える 3

3

for inそのため、ループの使用は避けなければなりません

for(var i=0;i<li.length;i++){
    li[i].addEventListener('click', function(){
        alert('yey');
    });
}

inを使用する場合、iは期待どおりの整数ではなく、ノードリストのプロパティです。

于 2012-08-18T05:58:18.903 に答える
0

@lbuが指摘しているようにfor (decl; test; inc)、配列を反復処理するために使用する必要があります。

ただし、これは委任を使用するのにも適した場所です。すべて<li>がの直接の子孫である必要があるため<ul>、代わりにイベントハンドラーを配置して、ブラウザーの作業を減らすことができます。

var ul = document.getElementsByTagName('ul');

for (var i = 0, n = ul.length; i < n; ++i) {
    ul[i].addEventListener('click', function(ev) {
        alert(ev.target.id);
    });
}

http://jsfiddle.net/2mk3w/を参照してください

于 2012-08-18T06:10:12.153 に答える
-1

この方法で試してください

for(var i in li){
    i.addEventListener('click', function(){
        alert('yey');
    });
    }
});
于 2012-08-18T06:02:28.580 に答える