実行すると、なぜかロード時に「test」の出力がされました。
リスト1を何度クリックしても、出力がされませんでした。
HTMLを見てみると、当該listタグにonclick属性も付与されていませんでした。
jQuery オブジェクトの プロパティ や メソッド(返り値)を考慮してください。
- jQuery では {HTML*Element} オブジェクト を参照するために get(0) の結果を使っている。
- 関数に () を付けると実行構文。代入するのは 結果なのか、関数そのものなのかを考える。
ご質問の $("#list1").onclick = something();
は
リンク先に倣うなら、$("#list1").get(0).onclick = something;
と書かれているはずです。
#追記)
コメント欄の質問より
$("#list1")と$("#list1").get(0)で取得されるものの違い(中略)下記の認識で合っていますか?
その認識で合っています。
手っ取り早くjQueryの実装を確認する方法:
console.log($("#list1"))
console.log($("#list1").get(0))
引数付きで関数を呼び出すような処理を付与する
HTMLでの属性記述とは異なり、JavaScriptでは DOM を介することになります。
全ての DOM要素の基底オブジェクトとなる EventTarget
の実装に従います。
(イベントハンドラの第一引数 に渡されるのが event
オブジェクト)
javascript
1$(function() {
2
3 // 1. イベント伝搬するので 要素に引数に変わる値を設定しておく例
4 $("#list1").get(0).onclick = something;
5 let elm1 = $("#list1").get(0);
6 elm1.setAttribute("my-arg","hogehoge");
7 function something( event ) {
8 console.log("test", event )
9 console.log( event.target === elm1 ); // true
10 console.log( event.target.getAttribute("my-arg") ); // "hogehoge"
11 }
12/* イベントハンドラから参照できるスコープ内で引数に変わる値を保持する方法も
13 let params = { "list1": "hogehoge" }
14 $("#list1").get(0).onclick = something;
15 function something( event ) {
16 let elmId = event.target.id;
17 console.log("test", params[elmId] ); // "test", "hogehoge"
18 }
19 */
20
21 // enclosure で引数を受け、 closure をイベントハンドラとして返却する
22 $("#list2").get(0).onclick = enclosure("hogehoge", 1, true);
23 function enclosure( ...args ){
24 return function closure(event) {
25 console.log( event );
26 console.log("test", args); // "test",["hogehoge", 1, true]
27 }
28 }
29
30 // jQuery の data API を使う
31 let argData = { hoge:"HOGE",num:123 };
32 $("#list3")
33 .data( "myArg", argData ) // 伝搬する要素に値を設定
34 .on("click", function(){
35 // クリック時に取り出して確認
36 console.log( $(this).data("myArg") ); // { hoge:"HOGE",num:123 }
37 });
38
39});
jQuery では、JavaScript オブジェクトを渡せる data API が最もスマートと言えます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/21 04:34