teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

訂正

2020/01/20 21:31

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

answer CHANGED
@@ -30,9 +30,9 @@
30
30
 
31
31
  ```javascript
32
32
  $(function() {
33
- $("#list1").get(0).onclick = something;
34
33
 
35
34
  // 1. イベント伝搬するので 要素に引数に変わる値を設定しておく例
35
+ $("#list1").get(0).onclick = something;
36
36
  let elm1 = $("#list1").get(0);
37
37
  elm1.setAttribute("my-arg","hogehoge");
38
38
  function something( event ) {
@@ -45,7 +45,7 @@
45
45
  $("#list1").get(0).onclick = something;
46
46
  function something( event ) {
47
47
  let elmId = event.target.id;
48
- console.log("test", params[elmId] ); // "test", { "list1": "hogehoge" }
48
+ console.log("test", params[elmId] ); // "test", "hogehoge"
49
49
  }
50
50
  */
51
51
 

1

コメントを受けて追記

2020/01/20 21:31

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

answer CHANGED
@@ -9,4 +9,64 @@
9
9
 
10
10
 
11
11
  ご質問の ``$("#list1").onclick = something();`` は
12
- リンク先に倣うなら、``$("#list1").get(0).onclick = something;`` と書かれているはずです。
12
+ リンク先に倣うなら、``$("#list1").get(0).onclick = something;`` と書かれているはずです。
13
+
14
+ #追記)
15
+ コメント欄の質問より
16
+
17
+ > $("#list1")と$("#list1").get(0)で取得されるものの違い(中略)下記の認識で合っていますか?
18
+
19
+ その認識で合っています。
20
+
21
+ 手っ取り早くjQueryの実装を確認する方法:
22
+ 1. ``console.log($("#list1"))``
23
+ 2. ``console.log($("#list1").get(0))``
24
+
25
+ > 引数付きで関数を呼び出すような処理を付与する
26
+
27
+ HTMLでの属性記述とは異なり、JavaScriptでは DOM を介することになります。
28
+ 全ての DOM要素の基底オブジェクトとなる ``EventTarget`` の実装に従います。
29
+ (イベントハンドラの第一引数 に渡されるのが ``event`` オブジェクト)
30
+
31
+ ```javascript
32
+ $(function() {
33
+ $("#list1").get(0).onclick = something;
34
+
35
+ // 1. イベント伝搬するので 要素に引数に変わる値を設定しておく例
36
+ let elm1 = $("#list1").get(0);
37
+ elm1.setAttribute("my-arg","hogehoge");
38
+ function something( event ) {
39
+ console.log("test", event )
40
+ console.log( event.target === elm1 ); // true
41
+ console.log( event.target.getAttribute("my-arg") ); // "hogehoge"
42
+ }
43
+ /* イベントハンドラから参照できるスコープ内で引数に変わる値を保持する方法も
44
+ let params = { "list1": "hogehoge" }
45
+ $("#list1").get(0).onclick = something;
46
+ function something( event ) {
47
+ let elmId = event.target.id;
48
+ console.log("test", params[elmId] ); // "test", { "list1": "hogehoge" }
49
+ }
50
+ */
51
+
52
+ // enclosure で引数を受け、 closure をイベントハンドラとして返却する
53
+ $("#list2").get(0).onclick = enclosure("hogehoge", 1, true);
54
+ function enclosure( ...args ){
55
+ return function closure(event) {
56
+ console.log( event );
57
+ console.log("test", args); // "test",["hogehoge", 1, true]
58
+ }
59
+ }
60
+
61
+ // jQuery の data API を使う
62
+ let argData = { hoge:"HOGE",num:123 };
63
+ $("#list3")
64
+ .data( "myArg", argData ) // 伝搬する要素に値を設定
65
+ .on("click", function(){
66
+ // クリック時に取り出して確認
67
+ console.log( $(this).data("myArg") ); // { hoge:"HOGE",num:123 }
68
+ });
69
+
70
+ });
71
+ ```
72
+ jQuery では、JavaScript オブジェクトを渡せる data API が最もスマートと言えます。