質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

3443閲覧

Jquery  複数の関数を順番に実行することはできるか?

dera

総合スコア28

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/09/01 07:56

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/09/01 08:18

現状のコードの問題点は何でしょうか
guest

回答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

ku__ra__ge

総合スコア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

yambejp

総合スコア114761

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dera

2021/09/03 01:26

ありがとうございます。 とてもシンプルなロジックで、今の私での習熟度でも理解することができ、実際に動作確認まで行えました。 今回はこちらの方をベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問