1

したがって、コンソールがすぐに 1 onload または何かをログに記録する理由がわかりone.onclick = alterIt(1)ません。クリックするまで待つべきではありませんone。とにかく、明らかに私はJavaScriptが得意ではありません。助けてくれてありがとう。

window.onload = initialize;
function initialize() {
    if (1 == 1){
        calculation();           
    }
}
function calculation() {
    var one = document.getElementById('one');
    one.onclick = alterIt(1);
}

function alterIt(x) {
    console.log(x);
}
4

5 に答える 5

9

あなたが書いたとき:

one.onclick = alterIt(1); 

...次に、alterIt関数を呼び出し、戻り値をonclickハンドラーとして設定しました。代わりに、次のことが必要でした。

one.onclick = function(){ alterIt(1) };

// ...or better yet
one.addEventListener('click',function(){ alterIt(1) },false);
于 2012-08-01T18:41:36.193 に答える
4

one.onclick = alterIt(1);が実行されると、alterIt(1)実際に評価されます。必要なのは、関数をにバインドすることです。これは、イベントが発生one.onclickしたときにのみ実行されます。onclick次のようなものが必要です

one.onclick = function() { alterIt(1) };

alterIt(1)toの結果をバインドするのではone.onclickなく、関数評価の結果をバインドします。

于 2012-08-01T18:42:31.357 に答える
2

この問題を回避するためのコーディング方法は 2 つあります。

//Anonymous Closures
one.onclick = function(){ alterIt(1); };

//Bind Closures  
one.onclick = alertIt.bind(window, 1);

注: Function.bind() は、すべてのブラウザーで 1 年間サポートされます。古いブラウザーが気になる場合は、匿名クロージャーが最適です。

于 2012-08-01T19:05:32.460 に答える
2

関数呼び出しを次のようにラップして、クリックするまで起動しないようにします。

window.onload = initialize;
function initialize() {
    if (1 == 1){
        calculation();           
    }
}
function calculation() {
    var one = document.getElementById('one');
    one.onclick = function(){ alterIt(1);};
}

function alterIt(x) {
   console.log(x);
}

フィドルの例: http://jsfiddle.net/RkH6Q/

于 2012-08-01T18:42:34.807 に答える
-2

何が起こっているかというと、alterIt関数を渡す必要があるときに関数を呼び出しているということです。そのため、次のように括弧を削除します。

one.onclick = alterIt;
于 2012-08-01T18:42:39.003 に答える