回答編集履歴
4
ソース修正
answer
CHANGED
@@ -41,17 +41,17 @@
|
|
41
41
|
|
42
42
|
```javascript
|
43
43
|
const funcs = {
|
44
|
-
foo(
|
44
|
+
foo() {
|
45
45
|
console.log('foo() が呼ばれました。');
|
46
46
|
return 'bar';
|
47
47
|
},
|
48
48
|
|
49
|
-
bar(
|
49
|
+
bar() {
|
50
50
|
console.log('bar() が呼ばれました。');
|
51
51
|
return 'baz';
|
52
52
|
},
|
53
53
|
|
54
|
-
baz(
|
54
|
+
baz() {
|
55
55
|
console.log('baz() が呼ばれました。');
|
56
56
|
return 'foo';
|
57
57
|
}
|
@@ -60,7 +60,7 @@
|
|
60
60
|
$('div.button').click(function () {
|
61
61
|
const name = $(this).attr('data-func');
|
62
62
|
if (funcs[name]) {
|
63
|
-
const nextFunc = funcs[name](
|
63
|
+
const nextFunc = funcs[name]();
|
64
64
|
$(this).attr('data-func', nextFunc).text(nextFunc);
|
65
65
|
}
|
66
66
|
});
|
3
ソース修正
answer
CHANGED
@@ -73,7 +73,7 @@
|
|
73
73
|
の3つです。
|
74
74
|
このやり方のメリットとして、
|
75
75
|
- 各クリック要素のそれぞれに個別に、foo → bar → baz → foo → ・・・ のサイクルを維持させるために、何らかのコード追加をする必要がない。
|
76
|
-
-
|
76
|
+
- 追加した`data-`属性の値に応じたスタイルを適用できる。こないな感じで。
|
77
77
|
```css
|
78
78
|
.button[data-func='foo'] {
|
79
79
|
background-color: blue;
|
2
ソース修正
answer
CHANGED
@@ -66,8 +66,8 @@
|
|
66
66
|
});
|
67
67
|
```
|
68
68
|
ポイントとしては、
|
69
|
-
- 3つの関数をひとつのオブジェクト `funcs`のプロパティとして持たせて、`funcs[name]`でその関数を参照していること。
|
69
|
+
- 3つの関数をひとつのオブジェクト `funcs`のプロパティとして持たせて、`funcs[name]`でその関数を参照していること。
|
70
|
-
- 各関数は、次に実行するべき関数名の文字列を返すこと。
|
70
|
+
- 各関数は、次に実行するべき関数名の文字列を返すこと。(たとえば `foo()` は文字列`'bar'`をreturnする)
|
71
71
|
- 関数の実行後に、当該HTMLの`data-func`属性に、次に実行する関数名を設定すること。
|
72
72
|
|
73
73
|
の3つです。
|
1
ソース修正
answer
CHANGED
@@ -22,4 +22,72 @@
|
|
22
22
|
```
|
23
23
|
としておけば、`operator()` として operatorを呼ぶ度にfuncA, funcB, funcCがサイクリックに実行されます。`reset()`すると、次に実行する関数を先頭のfuncAに戻します。`operator()` の実行時には引数も渡せるよってに。
|
24
24
|
|
25
|
-
➡ [サンプル](https://codepen.io/i8086x/pen/WNOwmqa?editors=1010) :ボタンをクリックされるたびに、aとbの(1)和、(2)積、(3)最大値、(4)割り算したときの商と余り、の4つをサイクリックに実行してその結果を表示します。数字を変えると次に実行する関数を(1)和に戻します。
|
25
|
+
➡ [サンプル](https://codepen.io/i8086x/pen/WNOwmqa?editors=1010) :ボタンをクリックされるたびに、aとbの(1)和、(2)積、(3)最大値、(4)割り算したときの商と余り、の4つをサイクリックに実行してその結果を表示します。数字を変えると次に実行する関数を(1)和に戻します。
|
26
|
+
|
27
|
+
## 別のやり方
|
28
|
+
|
29
|
+
もうひとつ別やり方を挙げときます。
|
30
|
+
|
31
|
+
たとえば、3つの関数 `foo()`, `bar()`, `baz()` をこの順にサイクリックに呼びたいとしましょか。このときに、これらを実行させるトリガーとなるHTMLの要素に、それをクリックしたときに実行させたい関数の名前を、何らかの `data-`属性で持たせるんや。たとえば `data-func` としましょう。(もっと良い属性名のネーミングがあるかも)
|
32
|
+
|
33
|
+
こんな感じになるで。
|
34
|
+
```html
|
35
|
+
<div class="container">
|
36
|
+
<div class="button" data-func="foo">foo</div>
|
37
|
+
<div class="button" data-func="foo">foo</div>
|
38
|
+
<div class="button" data-func="foo">foo</div>
|
39
|
+
</div>
|
40
|
+
```
|
41
|
+
|
42
|
+
```javascript
|
43
|
+
const funcs = {
|
44
|
+
foo(el) {
|
45
|
+
console.log('foo() が呼ばれました。');
|
46
|
+
return 'bar';
|
47
|
+
},
|
48
|
+
|
49
|
+
bar(el) {
|
50
|
+
console.log('bar() が呼ばれました。');
|
51
|
+
return 'baz';
|
52
|
+
},
|
53
|
+
|
54
|
+
baz(el) {
|
55
|
+
console.log('baz() が呼ばれました。');
|
56
|
+
return 'foo';
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
$('div.button').click(function () {
|
61
|
+
const name = $(this).attr('data-func');
|
62
|
+
if (funcs[name]) {
|
63
|
+
const nextFunc = funcs[name](this);
|
64
|
+
$(this).attr('data-func', nextFunc).text(nextFunc);
|
65
|
+
}
|
66
|
+
});
|
67
|
+
```
|
68
|
+
ポイントとしては、
|
69
|
+
- 3つの関数をひとつのオブジェクト `funcs`のプロパティとして持たせて、`funcs[name]`でその関数を参照していること。(たとえば `foo()` は文字列 `'bar'` をreturn する)
|
70
|
+
- 各関数は、次に実行するべき関数名の文字列を返すこと。
|
71
|
+
- 関数の実行後に、当該HTMLの`data-func`属性に、次に実行する関数名を設定すること。
|
72
|
+
|
73
|
+
の3つです。
|
74
|
+
このやり方のメリットとして、
|
75
|
+
- 各クリック要素のそれぞれに個別に、foo → bar → baz → foo → ・・・ のサイクルを維持させるために、何らかのコード追加をする必要がない。
|
76
|
+
- それと追加した`data-`属性の値に応じたスタイルを適用できる点ですかね。こないな感じで。
|
77
|
+
```css
|
78
|
+
.button[data-func='foo'] {
|
79
|
+
background-color: blue;
|
80
|
+
}
|
81
|
+
|
82
|
+
.button[data-func='bar'] {
|
83
|
+
background-color: red;
|
84
|
+
}
|
85
|
+
|
86
|
+
.button[data-func='baz'] {
|
87
|
+
background-color: green;
|
88
|
+
}
|
89
|
+
```
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
➡ [サンプル](https://codepen.io/i8086x/pen/WNOxvGQ?editors=1111)
|