2011-07-25 14 views
0

ユーザーがWebページ上の要素をクリックしたときにいくつかの機能を作成しようとしています。コールバック関数は、ページが実行されるとすぐに実行されます。これは、ユーザーが要素をクリックしたときにのみ実行されます。ここ は、コードは次のとおりです。コールバック関数の受け渡しに失敗しました

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Javascript Test</title> 
    <script src="http://code.jquery.com/jquery-latest.pack.js"></script> 
    <script> 
     $("#clickMe").one('click', printThis("Hello All")); 
     function printThis(msg) { 
     console.log(msg); 
     } 
    </script> 
    </head> 
    <body> 
    <div id="clickMe">Click me!</div> 
    </body> 
</html> 

ありがとう!

+0

あなたの機能があまりにも早く残している...多分それはあなたのユーザ名とは何かを持っています。 – hugomg

答えて

3

コールバックを呼び出さないでください。必要な関数を呼び出す匿名のコールバック関数を渡します。実際に関数を渡すのではなく、代わりに、それは関数を評価し、コールバックパラメータとして結果を渡して

function printThis(msg) { 
    console.log(msg); 
} 

$("#clickMe").one('click', function() { printThis("Hello All") }); 
5

(この場合、undefined)。

この代わり

1
<script> 
    function printThis(msg) { 
    console.log(msg); 
    } 
    $("#clickMe").one('click', function() { 
    printThis("Hello All"); 
    }); 
</script> 

一つの方法は、2番目のパラメータとしてコールバックを取るしてください。 printThis( "こんにちはすべて")は実際にそのメソッド自体を呼び出しますので、clickMeをクリックするとハンドラがないので何も起こりません。

$("#clickMe").one('click', function() { printThis("Hello All") }); 

これはクロージャとして知られている:https://developer.mozilla.org/en/JavaScript/Guide/Closures 閉鎖は、多くの場合、コードのインライン/匿名ブロックとして宣言され、関数であることを既に掲載答えは右であるこの

function printThis(msg) { 
    console.log(msg); 
} 

$("#clickMe").one('click', function() { printThis("Hello All") }); 
1

をお試しくださいあなたの関数の実行を遅らせ、渡すべき "Hello All"引数の値を格納します。

jQueryはこの "function(){...}"コードブロックをイベントハンドラとして保存し、後で#clickMe要素がそのコードブロックが実行され、次にprintThis関数が呼び出されます。

jQueryではこのパターンを頻繁に使用しています。

0

はこれを試してみてください... http://jsfiddle.net/PcVJq/

+0

くそー、私は自分のiPadにいますし、jsfiddleで何かするのに時間がかかります:( –

関連する問題