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

回答編集履歴

3

data-*属性のコード追記

2015/09/08 14:00

投稿

think49
think49

スコア18194

answer CHANGED
@@ -59,6 +59,40 @@
59
59
 
60
60
  ---
61
61
 
62
- ここまで書いておいていうのも何ですが、複数のimg要素ノードに `click` を定義するなら親ノードでバブリングを利用してキャプチャするとスマートになります。
62
+ **(2015/09/08 23:00追記)**
63
63
  [data-* 属性](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes#data-*)で index を割り振っておくのも一つの手段だと思います。
64
+ ([JSFiddle](http://jsfiddle.net/m627kwag/8/)にサンプルUPしました)
65
+
66
+ ```HTML
67
+ <img src="sample-1.jpg" alt="sample1" data-i="1">
68
+ <img src="sample-2.jpg" alt="sample2" data-i="2">
69
+
70
+ <script>
71
+ (function () {
72
+ function handleClick (event) {
73
+ var img = event.target || event.srcElement; // target要素を得る(Standard || IE8-)
74
+ console.log(img.getAttribute('data-i'), event.type); // data-*属性を参照
75
+ }
76
+
77
+ function addEvent (element, type, listener) {
78
+ if (element.addEventListener) { // Standard
64
- `data-*` 属性は `getAttribute` を使えば、IE8- でも使えます。
79
+ element.addEventListener(type, listener, false);
80
+ } else if (element.attachEvent) { // IE8-
81
+ element.attachEvent('on' + type, listener);
82
+ }
83
+ }
84
+
85
+ function init () {
86
+ var imgs = document.getElementsByTagName('img');
87
+
88
+ for (var i = 0, l = imgs.length; i < l; ++i) {
89
+ addEvent(imgs[i], 'click', handleClick);
90
+ }
91
+ }
92
+
93
+ init();
94
+ }());
95
+ </script>
96
+ ```
97
+
98
+ img要素の親要素ノードでバブリングを利用してキャプチャすると更にスマートになります。

2

typo

2015/09/08 14:00

投稿

think49
think49

スコア18194

answer CHANGED
@@ -61,4 +61,4 @@
61
61
 
62
62
  ここまで書いておいていうのも何ですが、複数のimg要素ノードに `click` を定義するなら親ノードでバブリングを利用してキャプチャするとスマートになります。
63
63
  [data-* 属性](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes#data-*)で index を割り振っておくのも一つの手段だと思います。
64
- `data-*' 属性は `getAttribute` を使えば、IE8- でも使えます。
64
+ `data-*` 属性は `getAttribute` を使えば、IE8- でも使えます。

1

IE8- 対応策と data-* 属性による手法

2015/09/08 10:15

投稿

think49
think49

スコア18194

answer CHANGED
@@ -21,4 +21,44 @@
21
21
  </script>
22
22
  ```
23
23
 
24
- `handleEvent` は `addEventListener` に備わった機能なので第一引数の `event` オブジェクトと併用できます。
24
+ `handleEvent` は `addEventListener` に備わった機能なので第一引数の `event` オブジェクトと併用できます。
25
+
26
+ ---
27
+
28
+ **(2015/09/08 19:14追記)**
29
+ もし、IE8- にも対応させるならクロージャで変数束縛する方法があります。
30
+ ([JSFiddle](http://jsfiddle.net/m627kwag/6/)にサンプルUPしました。)
31
+
32
+ ```JavaScript
33
+ (function () {
34
+ function createHandleClick (i) {
35
+ return function handleClick (event) {
36
+ console.log(i, event.type);
37
+ };
38
+ }
39
+
40
+ function addEvent (element, type, listener) {
41
+ if (element.addEventListener) {
42
+ element.addEventListener(type, listener, false);
43
+ } else if (element.attachEvent) {
44
+ element.attachEvent('on' + type, listener);
45
+ }
46
+ }
47
+
48
+ function init () {
49
+ var imgs = document.getElementsByTagName('img');
50
+
51
+ for (var i = 0, l = imgs.length; i < l; ++i) {
52
+ addEvent(imgs[i], 'click', createHandleClick(i));
53
+ }
54
+ }
55
+
56
+ init();
57
+ }());
58
+ ```
59
+
60
+ ---
61
+
62
+ ここまで書いておいていうのも何ですが、複数のimg要素ノードに `click` を定義するなら親ノードでバブリングを利用してキャプチャするとスマートになります。
63
+ [data-* 属性](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes#data-*)で index を割り振っておくのも一つの手段だと思います。
64
+ `data-*' 属性は `getAttribute` を使えば、IE8- でも使えます。