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

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

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

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

jQuery

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

Q&A

解決済

2回答

11894閲覧

Formのchangeイベントが何度も走ってしまう

k499778

総合スコア599

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2016/03/31 03:17

現在cakePHP3,PHP,jQuery,HTMLでアプリケーションを作っています。

前回も質問させていただいた続きです。
https://teratail.com/questions/31009

これを参考にさせていただき、以下のように実装しました。


$('form').on("change", function(event){

if(flg){
return false;
}

console.log(1);

});

var flg ;
$(/* リセットボタン */).on("click", function(event){

flg =true;

// リセット処理

flg =false;

$('form').trigger("change");
})


フラグの使い方はうまくいったのですが、
最後のtriggerイベントでchangeイベントを発火させると、何度もchangeイベントが発火してしまいます。

Formの変更がある分だけ発火するように思います。

これを1度だけ発火させる方法はないでしょうか?

もしわかる方がいればよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答2

0

ベストアンサー

最後のtriggerイベントでchangeイベントを発火させると、何度もchangeイベントが発火してしまいます。

「何度も」ってのが何回ぐらいなのかよくわかりませんが、以下に複数回changeイベントが発生する現象を開設してみます。

$("form").on("change", function(){

なので、「form部品の入力内容が変更されたとき」に常にイベントが発生します。

たとえば

<form> <div>text1:<input type='text' name='text1' /></div> <div>text2:<input type='text' name='text2' /></div> <div><input type='button' id='rst' value='reset' /></div> </form>

のようなhtml部に対して質問文のjavascriptを実行すると、

(1) text1に何かを入力してtext1からフォーカスが外れるタイミング(formの普通の振る舞い)
(2) text2に何かを入力してtext2からフォーカスが外れるタイミング(formの普通の振る舞い)
(3) リセットボタンを押したタイミング(javascriptで追加した振る舞い)

の3つのタイミングでchangeイベントが実行されます。

仮に「text1に何か入力して、すぐにリセットボタンを押す」というオペレーションをやった場合、(1)と(3)が発生することになるのでchangeイベントは2回実行されます。

投稿2016/03/31 05:16

tkturbo

総合スコア5572

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

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

k499778

2016/03/31 15:07

回答有り難うございます。 実際、やはりリセットボタン押下でFormの中の変更が複数発生し、 リセット処理が終わったあとでchangeイベントが発生していたため、 リセット処理直後にフラグを元に戻すとうまくいきませんでした。 そこでsetTimeoutを使ってフラグを元に戻すタイミングを遅らせ、 その前にchageイベントが発火し終わるようにするとうまくいきました。 ご協力ありがとうございました。
guest

0

すみません勘違いでした。
インデント整形して再度確認します。

javascript

1 2$('form').on("change", function(event){ 3  if(flg){ 4    return false; 5  } 6  console.log(1); 7}); 8 9var flg ; 10$(/* リセットボタン */).on("click", function(event){ 11 12 flg =true; 13 14 // リセット処理 15 flg =false; 16 $('form').trigger("change"); 17})

投稿2016/03/31 03:36

編集2018/05/30 08:30
m.kosuda

総合スコア153

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

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

k499778

2016/03/31 03:41

回答ありがとうございます。 そこを消すとchangeイベントが1度も呼ばれなくなってしまいます。 1度は実行したいので、そのtriggerイベントでchangeイベントの処理を実行しようとしているのですが、 1度だけ発火するかと思いきや、複数回発火してしまう現状です。 1度だけ発火させる方法はないでしょうか。
k499778

2016/03/31 03:42

はい、承知しました(^-^)
m.kosuda

2016/03/31 03:46

上記のコードだけでは問題ないと思います。 ただ、セレクタがformというざっくりした内容なので、changeを発火させた要素を確認してみてはいかがでしょうか? console.log($(this));
k499778

2016/03/31 15:08

回答有り難うございます。 実際、やはりリセットボタン押下でFormの中の変更が複数発生し、 リセット処理が終わったあとでchangeイベントが発生していたため、 リセット処理直後にフラグを元に戻すとうまくいきませんでした。 そこでsetTimeoutを使ってフラグを元に戻すタイミングを遅らせ、 その前にchageイベントが発火し終わるようにするとうまくいきました。 ご協力ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問