jqueryを使って画像の切替をクリックイベントで順番に切り替えたい。
jquery
1 2$(div.xxx).click(function(){ 3 funcA(); 4 funcB(); 5 funcC(); 6 .... //A⇒B⇒C⇒A⇒B⇒Cのような感じでクリックするたびに実行する関数を変更したい。 7}); 8 9 10function funcA(){ 11 //画像A表示 12}); 13 14function funcB(){ 15 //画像B表示 16}); 17 18function funcC(){ 19 //画像C表示 20}); 21
色々探してみたのですが、やり方が見つからず・・・。
clickイベントで順番に関数を実行する方法はありませんでしょうか。
良い方法があれば、ご教示ください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
こんなんも。
javascript
1const cyclicExecutor = (...fns) => { 2 let i = 0; 3 4 const operator = (...params) => { 5 const rtn = fns[i](...params); 6 if (fns.length === ++i) i = 0; 7 return rtn; 8 }; 9 10 const reset = () => { 11 i = 0; 12 } 13 14 return [operator, reset]; 15}
とかゆう、引数として、順番に実行したい複数の関数を受け取り、それらをサイクリックに実行する関数と、次に実行する関数を先頭にもどす関数の2つのクロージャーを返す関数を作っておくやんか。ほんで、
javascript
1const [operator, reset] = cyclicExecutor(funcA, funcB, funcC);
としておけば、operator()
として operatorを呼ぶ度にfuncA, funcB, funcCがサイクリックに実行されます。reset()
すると、次に実行する関数を先頭のfuncAに戻します。operator()
の実行時には引数も渡せるよってに。
➡ サンプル :ボタンをクリックされるたびに、aとbの(1)和、(2)積、(3)最大値、(4)割り算したときの商と余り、の4つをサイクリックに実行してその結果を表示します。数字を変えると次に実行する関数を(1)和に戻します。
別のやり方
もうひとつ別やり方を挙げときます。
たとえば、3つの関数 foo()
, bar()
, baz()
をこの順にサイクリックに呼びたいとしましょか。このときに、これらを実行させるトリガーとなるHTMLの要素に、それをクリックしたときに実行させたい関数の名前を、何らかの data-
属性で持たせるんや。たとえば data-func
としましょう。(もっと良い属性名のネーミングがあるかも)
こんな感じになるで。
html
1<div class="container"> 2 <div class="button" data-func="foo">foo</div> 3 <div class="button" data-func="foo">foo</div> 4 <div class="button" data-func="foo">foo</div> 5</div>
javascript
1 const funcs = { 2 foo() { 3 console.log('foo() が呼ばれました。'); 4 return 'bar'; 5 }, 6 7 bar() { 8 console.log('bar() が呼ばれました。'); 9 return 'baz'; 10 }, 11 12 baz() { 13 console.log('baz() が呼ばれました。'); 14 return 'foo'; 15 } 16 } 17 18 $('div.button').click(function () { 19 const name = $(this).attr('data-func'); 20 if (funcs[name]) { 21 const nextFunc = funcs[name](); 22 $(this).attr('data-func', nextFunc).text(nextFunc); 23 } 24 });
ポイントとしては、
- 3つの関数をひとつのオブジェクト
funcs
のプロパティとして持たせて、funcs[name]
でその関数を参照していること。 - 各関数は、次に実行するべき関数名の文字列を返すこと。(たとえば
foo()
は文字列'bar'
をreturnする) - 関数の実行後に、当該HTMLの
data-func
属性に、次に実行する関数名を設定すること。
の3つです。
このやり方のメリットとして、
- 各クリック要素のそれぞれに個別に、foo → bar → baz → foo → ・・・ のサイクルを維持させるために、何らかのコード追加をする必要がない。
- 追加した
data-
属性の値に応じたスタイルを適用できる。こないな感じで。
css
1.button[data-func='foo'] { 2 background-color: blue; 3} 4 5.button[data-func='bar'] { 6 background-color: red; 7} 8 9.button[data-func='baz'] { 10 background-color: green; 11}
➡ サンプル
投稿2021/09/02 03:53
編集2021/09/02 20:19退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
javascript
1<script> 2$(function(){ 3 const picChanger = (function *() { 4 yield funcA(); 5 yield funcB(); 6 yield funcC(); 7 })(); 8 $('#xxx').click(function(){ 9 picChanger.next(); 10 }); 11 function funcA(){ 12 console.log('A'); 13 } 14 function funcB(){ 15 console.log('B'); 16 } 17 function funcC(){ 18 console.log('C'); 19 } 20}); 21</script> 22<div id="xxx">xxx</div>
投稿2021/09/01 08:13
総合スコア4524
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
javascript
1<script> 2$(function(){ 3 var funcs=[funcA,funcB,funcC]; 4 var num=0; 5 $('#xxx').click(function(){ 6 funcs[num](); 7 num++; 8 if(num>=funcs.length) num=0; 9 }); 10 function funcA(){ 11 console.log('A'); 12 } 13 function funcB(){ 14 console.log('B'); 15 } 16 function funcC(){ 17 console.log('C'); 18 } 19}); 20</script> 21<div id="xxx">xxx</div>
投稿2021/09/01 08:03
総合スコア116724
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。