現在HTMLやjavascript,jqueryを使ってボタンクリックイベントを行っています。
バリデーション処理と画面遷移処理を分けねばならず、
イベントの発火順序を生かして
バリデーション処理はmousedownイベント,
画面遷移処理はclickイベント
と切り分けたいと思っています。
そのときなのですが、
バリデーションチェックでエラーがあったら
「指定のclickイベントを発火させない」
といった実装をすることは可能でしょうか?
もし「指定のイベントや次のイベントを発火させない」といった処理の書き方や方法を知っている方がいましたら教えて頂きたいです。
よろしくお願い申し上げます。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
デフォルトの挙動が設定されているものに関してなら、それを止めることは可能です。
例えば a要素
は指定されているURLに遷移するものですが、以下のようにすることでそのデフォルトの挙動(つまり画面遷移)を止めることができます。
js
1var a = ... // a要素の取得 2a.addEventListener('click', function (evt) { 3 evt.preventDefault(); 4}, false);
ただ内容を読んでいると、そもそもバリデーションはクリックのタイミングじゃなくてもいいのかなと思いました。
つまりバリデーションのタイミングを別で持ち、もしバリデーションエラーであるならボタンなりリンクなりをそもそも無効にしてしまう、という処理のほうが適切ではないかなと感じましたがいかがでしょうか。
投稿2016/03/31 14:44
総合スコア2286
0
DOMのEventについては発火を止める事は基本的には出来ません
(input系のタグであればdisable属性を設定することで発生そのものを抑止できますが、完全に非活性になってしまうので今回の要件では適切ではなさそうです)
今回の要件としてはユーザが指定のDOMをclickした時に以下のような動作にしたいのだと思います。
- バリデーションチェックを実施
- エラーがなければ画面遷移をする
この想定であれば、そもそも1と2の処理をmousedown,clickの2つのイベントに振り分ける必要はあまり無く、単純にclickのイベントハンドラに渡すfunction内部で1の実行結果を元に処理を分岐させれば良いと思います。
バリデーションエラーが発生すれば単純に return でfunctionの処理を終了させてしまえばブラウザ上では何も起こりませんので。
投稿2016/03/31 13:40
総合スコア42
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
理解できた範囲で書きますが、コードを見せていただいた方が具体的なアドバイスがしやすいです。
共通処理の設定がもし、下記のように書かれていたらダメなんですが、
そうではなく、処理を別関数に任せる形であれば、処理を再利用するのは簡単です。
JavaScript
1// 再利用しにくい 2$btn.on('click', function(){ 3 var hoge; 4 hoge = .... 5});
別関数に任せるパターン。
JavaScript
1// 再利用しやすいパターン 2 3// 遷移処理が関数化されている 4var pageJump = function(){ 5 var hoge; 6 hoge = ... 7}; 8 9$btn.on('click', function(){ 10 pageJump(); // イベント時には関数実行のみ 11});
もし、具体的な処理を別関数に任せているのであれば、.off()
を使って共通のクリックイベントを無効にしつつ、中の関数だけ再利用できます。
下記の設定を書くのはバリデートの設定を書いているJSの方です。
// 共通のクリックイベント(ページ遷移)を一旦無効にする。 $btn.off('click'); $btn.on('click', function(){ // ここでバリデートの処理・関数実行。 if(エラーがなければ){ pageJump(); // ページ遷移の処理実行(ページ遷移の関数の再利用) } });
イベントに名前を付けておくと「そのボタンに関連付けられたクリックイベント全て」ではなく、
「そのボタンに関連付けられたページ遷移のイベントだけ」をピンポイントで無効にもできます。
投稿2016/03/31 15:59
編集2016/03/31 16:12総合スコア2092
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
共通処理の中でバリデーションをしないで欲しいと言われてしまいました。
こういうのならいいのでしょうか
javascript
1// A バリデーション 2$("button").on("click", function(eve){ 3 // バリデーション 4 if(!$("form").get(0).checkValidity()){ 5 eve.stopImmediatePropagation() 6 } 7}) 8 9// B 共通jsのコード 10$("button").on("click", function(){ 11 // 画面遷移 12})
A を B より先に登録しておきます
A でバリデーションが失敗したら stopImmediatePropagation を実行して B を実行しないようにします
投稿2016/03/31 15:44
総合スコア633
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/31 15:14