2009年11月11日
jQuery bindバインド時にデータを渡す
誤った使い方
例えばbind時にname変数に格納された情報を渡したい
var name = "kinopyo";
$(":button").bind("click", function(name){
alert(name);
});
これは誤った使い方です。
alertでは望まれた「kinopyo」の文字列は表示されません。
私は最初jQueryに触れたときはこんな書き方をしたんです。
もちろんname変数とbindのコールバックは同じスコープなのでfunctionから直接name変数を参照できますが、
ここではあえて誤った使い方にしました。
実際alertでは[object Object]と表示されました。
firebugで中身をのぞいてみるとこんな感じのオブジェクトです。
このnameは一体何のか、答えはjQueryのEventオブジェクトです。
Eventオブジェクトについてはこの記事「jQuery Eventオブジェクトの詳細、バブリングの仕組み」を参照してください。
bindのAPI
**bind(type, [data], fn)**
- type:click, dbclick,mousedown...などトリガーとなるイベントタイプ
- [data]:第三パラメータのハンドラにデータを渡す。括弧は配列の意味ではなく、省略可の意味
- fn:イベントハンドラ
- パラメータ:jQueryのEventオブジェクト、event.dataで第二引数の[data]を参照できる
jQueryは第二パラメータに対してdataかfunctionか自動判断してます。
普段使い慣れたのはdataを省略したものでしょう。
さっきの例を修正すると、正しく「kinopyo」が表示されます。
var name = "kinopyo";
$(":button").bind("click", name, function(event){
alert(event.data);
});
渡されるのはJavaScriptのオブジェクトです。。
つまり配列も、キー値ペアのオブジェクトも全部渡されます