2016-03-29 10 views
0

現在のドキュメントのすべてのタグにイベントリスナーを追加しようとしています。そのため、タグがクリックされたときにhref値がセッションに格納されます。私が書いた以下のスクリプトは、値 "sel"を警告することさえしていません。addeventlistenerがJavaScriptで動作していません

あなたがそうのように、その関数の戻り値、nextLocation機能ではありません渡す必要があり
<script type="text/javascript" > 
    window.onload=function(){ 
    var x=document.getElementsByTagName("a"); 
    for(var i=0; i<x.length; i++){ 
     x[i].addEventListener("click", nextlocation(), false); 
    }; 
    }; 
    function nextlocation(){ 
    sessionStorage.setItem("next","sel"); 
    alert(sessionStorage.getItem("next")); 
    }; 
    </script> 
+2

は '()' – Pointy

+2

'nextlocationは()'で 'なし(偽 "クリック"、nextlocation)'のaddEventListenerであるべき'nextlocation'関数呼び出しの結果 – dfsq

答えて

1

問題は、あなたがaddEventListenerに渡しているnextLocation()引数は実際にはなく、nextLocationを呼び出すことですそれを参照するよりも、関数の戻り値はコールバックとしてaddEventListenerに供給されているものですが、関数は何も返しません。したがって、メソッド呼び出し全体が失敗します。

したがって、問題を簡単に修正できます。引数 から()を削除して、関数は参照されますが呼び出されません。

しかし、イベント配線(addEventListener)にDOMイベント標準を使用する場合は、それを一貫して使用してください。つまり、.onXyz()のイベントプロパティは、window.onloadのように、.addEventListener()のように堅牢ではないため使用しないでください。

また、scriptタグにtype=text/javascriptを追加する必要はありません。さらに、.addEventListenerの3番目のパラメータは、イベントキャプチャを使用するかどうかを指定します。デフォルト値はfalseです。したがって、明示的にfalseを渡す必要はありません。

だから、あなたのコードの修正版は、次のようになります。

<script> 
    window.addEventListener("load", function(){ 
    var x=document.getElementsByTagName("a"); 
    for(var i=0; i<x.length; i++){ 
     x[i].addEventListener("click", nextlocation); 
    }; 
    }); 

    function nextlocation(){ 
    sessionStorage.setItem("next","sel"); 
    alert(sessionStorage.getItem("next")); 
    }; 
</script> 
+0

それは完璧に働いており、あなたの大きな説明に感謝します。 –

1

<script type="text/javascript" > 
    window.onload=function(){ 
    var x=document.getElementsByTagName("a"); 
    for(var i=0; i<x.length; i++){ 
     x[i].addEventListener("click", nextlocation, false); // HERE 
    }; 
    }; 
    function nextlocation(){ 
    sessionStorage.setItem("next","sel"); 
    alert(sessionStorage.getItem("next")); 
    }; 
    </script> 
+0

ご協力いただきありがとうございました。あなたの答えも正しいです。 –

関連する問題