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

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

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

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

Q&A

解決済

4回答

2900閲覧

JSでの送信イベントのキャンセルがうまくいかない

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2018/04/12 02:46

やりたいこと

フォームに入力された数字のバリデーションをしたいと思っています。
入力が不正な場合、submitされた時点でアラートを出し、
送信イベントをキャンセルしたいです。

現状

自分なりに調べて、addEventListenerevent.preventDefault()を使う方法でやってみました。
(外部ファイルに全て書きたかったので、HTMLのonsubmitに書き込む形は回避しました)

js

1document.getElementById("form").addEventListener("submit",function(){ 2 3 var date=document.getElementById("date"); 4 var myregex=new RegExp(/^[0-9]{6}$/); 5 6 if(date.value!=="" && date.value.match(myregex)===null){ 7 window.alert("日付は6桁の数字で入力してください。"); 8 event.preventDefault(); 9 } 10 11});

このようにしたところ、最初何度かは正常に動いた(送信イベントをキャンセルできた)ように思ったのですが、何回か実行するうちに、送信イベントがキャンセルされなくなりました。
アラートは出るのですが、そのまま送信されてしまいます。

どこがおかしいのでしょうか。
ご指導お願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/12 03:01

イベントの止め方は他の方が書かれてる通りと思いますが、それ以外に日付未入力の場合の処理もおかしいようです。
退会済みユーザー

退会済みユーザー

2018/04/12 06:31

ありがとうございます。日付については複数の検索項目の一つとしており、空欄可能としています。空欄または6桁を許容としています。
guest

回答4

0

ベストアンサー

何度か動いたの部分がちょっと分からないですが、

javascript

1 event.preventDefault();

eventaddEventListenerに渡しているイベントハンドラの引数で受け取ってください。

javascript

1document.getElementById("form").addEventListener("submit",function(event){ 2 3 var date=document.getElementById("date"); 4 var myregex=new RegExp(/^[0-9]{6}$/); 5 6 if(date.value!=="" && date.value.match(myregex)===null){ 7 window.alert("日付は6桁の数字で入力してください。"); 8 event.preventDefault(); 9 } 10 11});

投稿2018/04/12 02:51

k.tada

総合スコア1679

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

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

退会済みユーザー

退会済みユーザー

2018/04/13 09:39

ありがとうございます!
guest

0

サブミットしているaddEventListenerのコールバックに引数eventをわたしてあげてください

.addEventListener("submit",function(event){

投稿2018/04/12 02:52

編集2018/04/12 02:53
yambejp

総合スコア114771

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

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

退会済みユーザー

退会済みユーザー

2018/04/13 09:39

ありがとうございます!
guest

0

んー、単純に <input type="submit"><button type="submit"> を使わずに、
<button type="button"> を使って、
button のクリックイベントでバリデーションして、通過したら<form>をサブミットかける方がいいですね。

イベントを拾ってダメならキャンセルして~とか、処理を複雑にしていくだけです。

投稿2018/04/12 02:56

編集2018/04/12 02:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2018/04/12 02:59

確かに冗長な気がします。 どうしても作りは参考にしたサイトに依存してしまいますね。
退会済みユーザー

退会済みユーザー

2018/04/12 03:02

いまどきJS切ってあるってことも無いと思いますけど、もしそれにも対応したいなら<button type="submit">でHTML出力しておいて、JSが実行出来たらattr("type")を書き換えちゃえばいいと思うので、経験上、絶対その方が楽です。
x_x

2018/04/12 03:05

submitボタンを置かなければJavaScriptが無効のときに送信できなくなるし、置いているならinputのEnterで検証なしで送信されるため、元のほうがいいかと思います。
退会済みユーザー

退会済みユーザー

2018/04/12 03:06

勝利!
退会済みユーザー

退会済みユーザー

2018/04/12 03:18

まぁ、大体今時はJS切られてるとサイト自体マトモに表示すらできなかったりして、JS切ってる事を想定するのはせいぜい行政サイトくらいになるんだけど、そういうのに携わってるのはSIの奴らとかくらいで、あいつら、欠陥はやたら嫌うし工数増えるのやたら嫌うからサーバーサイドでバリデートしなければならない上に、クライアントサイドでもバリデーション搭載して、する場合としない場合についてケース対応するとかなったらめんどくさいから絶対「バリデーションはサーバーサイドだけでしましょう」とか押し切るだけなので、もう、JSが効かない場合の事なんか考えるだけ、無駄無駄。
x_x

2018/04/12 03:30

後半は? submitボタンが複数ある場合もあるし、変なことするより単にsubmitでのイベントを抑えたほうがいいのでは?
退会済みユーザー

退会済みユーザー

2018/04/12 03:31

複数あってもtype="button"の方が楽っす。
m.ts10806

2018/04/12 03:41

まあ要件次第と言うことで。
x_x

2018/04/12 03:43

楽とかいう問題ではなく、動きが変わるんですが? Enterキーを監視するようにしろというのでしょうか?
退会済みユーザー

退会済みユーザー

2018/04/12 03:48

Enterでsubmitするのなんか、劣悪ユーザビリティの代表じゃないですか。なんでそんな事して、ユーザーに不快感を与えたいんですか?
退会済みユーザー

退会済みユーザー

2018/04/12 03:48

チャットじゃないんですよ?
退会済みユーザー

退会済みユーザー

2018/04/12 03:50 編集

<input type="submit">の最大の問題って、formにボタンが一つの場合、関係ないinputフィールドの入力時に押したEnterとかでもsubmitが発動しちゃったりする事なんですよ。
退会済みユーザー

退会済みユーザー

2018/04/12 04:08

これだな。 4.10.21.2 Implicit submission A form element's default button is the first submit button in tree order whose form owner is that form element. If the user agent supports letting the user submit a form implicitly (for example, on some platforms hitting the "enter" key while a text control is focused implicitly submits the form), then doing so for a form, whose default button has activation behavior and is not disabled, must cause the user agent to fire a click event at that default button. There are pages on the Web that are only usable if there is a way to implicitly submit forms, so user agents are strongly encouraged to support this. https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#implicit-submission だから、type="submit"のボタンなんか作るべきではないという結論になるんです。
退会済みユーザー

退会済みユーザー

2018/04/13 09:41

ご指摘の点、考えてみたいと思います。 ・複数のフォームを同時に送信している ・エンターキーで送信したい というようなあたりから、サブミットイベントの処理が要りそうな感じもしているのですが、いずれにしてももっと勉強してきちんと考えたいと思います。
guest

0

eventを受け取っていません。

javascript

1document.getElementById("form").addEventListener("submit",function(event){ 2

投稿2018/04/12 02:53

m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2018/04/13 09:39

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問