-1

JQuery の W3Schools サンプルからこのコード ブロックがあります。W3Schools で試してみてください。hide メソッド呼び出しにコールバックを 1 つだけ追加しました。

最初のケース

 <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> function sayHello(){ alert('hello sit'); }

$(document).ready(function(){   $("button").click(function(){
    $("p").hide(100,sayHello);   }); });

</script> </head> <body> <button>Hide</button> <p>This is a paragraph with little content.</p> <p>This is another small paragraph.</p> </body> </html>

2番目のケースは

 <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> function sayHello(){ alert('hello sit'); }

$(document).ready(function(){   $("button").click(function(){
    $("p").hide(100,sayHello());   }); });

</script> </head> <body> <button>Hide</button> <p>This is a paragraph with little content.</p> <p>This is another small paragraph.</p> </body> </html>

両方の唯一の違いは、コールバック関数を中かっこの有無にかかわらず渡すことです。

最初のケースでは、非表示ボタンをクリックすると、hello アラートが 2 回表示されます。2 番目のケースでは、hello アラートが 1 回だけ表示されます。ゼロ引数関数が中かっこの有無にかかわらず呼び出されることは問題ではないため、両方の場合でアラートが1回だけ来ることを期待しています。

関数名が中括弧なしで渡されると、コールバック関数が 2 回呼び出される理由を理解したいと思います。

4

2 に答える 2

3

2番目のケースでは、評価の結果sayHello()を渡しますが、最初のケースでは、実際の関数 sayHelloを渡します。

sayHelloアラートを表示するため、実行されるとすぐにアラートが表示されます。最初のケースでは、hide(コールバックとして)完了時に実行されますが、2番目のケースでは、への呼び出しを設定したときにhide()(おそらく非表示が実際に発生する前に)実行されます。

なぜ2回実行されているのかわかりませんが、 (以下を参照)hide()括弧なしのバージョン(バージョン1)は、完了後に実行する場合は、おそらく探しているバージョンです。

アップデート:

アラートが2回表示される理由は、2hide()回電話をかけているためです。2つの異なる<p>要素があり、.hide()それぞれに対して順番に呼び出されます(そして、コールバックも同様にそれぞれに対して順番に実行されます)。<p>3つ目のタグを追加すると、3回目のアラートが表示されると思います。

JQueryドキュメントから:

複数の要素がアニメーション化されている場合、コールバックは、アニメーション全体に対して1回ではなく、一致した要素ごとに1回実行されることに注意することが重要です。

おそらく、要素を親要素(のような<div>)に包含し、個々の<p>要素の代わりにそれを非表示にする必要があります。

于 2012-09-26T18:11:45.290 に答える
2

両者の呼び方は全く異なります。最初のものは、関数の参照を 2 番目のパラメーターとして関数に渡しhideます。ただし、2番目のものは関数を呼び出しsayHello、呼び出しの結果を2番目のパラメーターとして関数に渡しhideます。sayHello関数は、あなたが呼び出される前に呼び出さhideれます。

于 2012-09-26T18:16:52.617 に答える