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

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

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

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

jQuery

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

Q&A

1回答

1037閲覧

お問い合わせフォームのバリデーションを作成したい

MTON

総合スコア13

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2020/04/24 12:43

以下jQueryで作成されたお問い合わせフォームのバリデーションのコードがありますがこちらをJavascriptにて書き換えを行いたいのですが、
一部上手くいかずに困っております。
上手くいかない箇所は、「var removeErrorMessage = function (selector) {」の箇所です。
もし、input,textareaの属性isSuccessがtrueであれば、class「errorInput」、<span class="errorMsg">を削除するというコードを
記述しているのですが、こちらが効かずに困っております。
ご教授のほどよろしくお願いいたします。

html

1<div> 2<form id="myForm" method="post"> 3<table> 4<tr> 5<th><label for="formName">名前 <span class="ind">必須</span></label></th> 6<td><input type="text" name="formName" id="formName"></td> 7</tr> 8<tr> 9<th><label for="formFurigana">ふりがな <span class="ind">必須</span></label></th> 10<td><input type="text" name="formFurigana" id="formFurigana"></td> 11</tr> 12<tr> 13<th><label for="formTell">電話番号 <span class="ind">必須</span></label></th> 14<td><input type="text" name="formTell" id="formTell"></td> 15</tr> 16<tr> 17<th><label for="formMail">メールアドレス <span class="ind">必須</span></label></th> 18<td><input type="text" name="formMail" id="formMail"></td> 19</tr> 20<tr> 21<th><label for="formInquiry">お問い合わせ内容 <span class="ind">必須</span></label></th> 22<td><textarea rows="9" name="formInquiry" id="formInquiry"></textarea></td> 23</tr> 24</table> 25<p><input type="submit" value="送信内容を確認する"></p> 26</form> 27</div>

css

1html,body,div,p,table,tr,th,td,form,ul,li{ 2 margin: 0; 3 padding: 0; 4} 5 6img{ 7 border: none; 8} 9 10body{ 11 font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif; 12 font-size: 14px; 13 line-height: 20px; 14 margin: 24px; 15} 16 17div{ 18 width: 695px; 19} 20 21li{ 22 list-style: none; 23} 24 25form{ 26} 27 28table{ 29 width: 100%; 30 margin: 0 0 12px; 31 border-collapse: collapse; 32 border-spacing: 0; 33} 34 35th, 36td{ 37 padding: 8px 12px; 38 border: 1px solid #ddd; 39 text-align: left; 40 vertical-align: middle; 41} 42 43th{ 44 width: 180px; 45 background: #eee; 46 font-weight: normal; 47} 48 49th span{ 50 font-size: 12px; 51} 52 53th .ind{ 54 color: #f00; 55 font-size: 14px; 56} 57 58td{ 59 background: #fff; 60} 61 62td input{ 63 width: 250px; 64} 65 66td textarea{ 67 width: 464px; 68} 69 70.errorMsg{ 71 display: block; 72 color: #f00; 73} 74 75.errorInput{ 76 background: #fcf0f2; 77}

jQuery

1$(function(){ 2 3 function setMyForm(target){ 4 5 var ERROR_MESSAGE_CLASSNAME = 'errorMsg'; //エラー時のメッセージ要素のclass名 6 var ERROR_INPUT_CLASSNAME = 'errorInput'; //エラー時のinput要素のclass名 7 8 var items = []; //チェック対象となるテキスト入力要素を格納した配列 9 10 //項目チェックする 11 var checkAll = function(){ 12 var errorCount = 0; 13 //項目:名前のチェック 14 checkEmptyText( items[0], '名前をご入力ください。' ); 15 //項目:ふりがなのチェック 16 checkEmptyText( items[1], 'ふりがなをご入力ください。' ); 17 //項目:電話番号のチェック 18 checkEmptyText( items[2], '電話番号をご入力ください。' ); 19 //項目:メールアドレスのチェック 20 checkEmptyText( items[3], 'メールアドレスをご入力ください。' ); 21 //項目:お問い合わせ内容のチェック 22 checkEmptyText( items[4], 'お問い合わせ内容をご入力ください。' ); 23 //input,textareaのチェック 24 for( var i=0; i<items.length; i++ ){ 25 if( items[i].prop('isSuccess') == false ){ 26 errorCount++; 27 }; 28 }; 29 //エラーカウントが0であれば、エラー無し 30 if( errorCount == 0 ){ 31 alert( '送信内容にエラーはありません。' ); 32 }; 33 }; 34 35 //エラーメッセージの追加 36 var addErrorMessage = function(selector, msg){ 37 removeErrorMessage(selector); 38 selector.before('<span class="'+ERROR_MESSAGE_CLASSNAME+'">'+msg+'</span>'); 39 selector.addClass(ERROR_INPUT_CLASSNAME); 40 }; 41 42 //エラーメッセージの削除 43 var removeErrorMessage = function(selector){ 44 var msgSelector = selector.parent().find('.'+ERROR_MESSAGE_CLASSNAME); 45 if( msgSelector.length != 0 ){ 46 msgSelector.remove(); 47 selector.removeClass(ERROR_INPUT_CLASSNAME); 48 }; 49 }; 50 51 //input,textareaの未入力チェック 52 var checkEmptyText = function(selector, msg){ 53 if( selector.val() == '' ){ 54 addErrorMessage(selector, msg); 55 selector.prop('isSuccess', false); 56 }else{ 57 removeErrorMessage(selector); 58 selector.prop('isSuccess', true); 59 }; 60 }; 61 62 //初期設定 63 var init = function(){ 64 //submitイベントの設定 65 target.on({ 66 'submit': function(){ 67 checkAll(); 68 return false; 69 } 70 }); 71 //input要素を配列に格納 72 items = [ 73 target.find('input[name=formName]'), 74 target.find('input[name=formFurigana]'), 75 target.find('input[name=formTell]'), 76 target.find('input[name=formMail]'), 77 target.find('textarea[name=formInquiry]') 78 ]; 79 //input要素のプロパティを設定 80 $.each(items, function(index){ 81 items[index].prop('isSuccess', false); 82 console.log(items) 83 }); 84 //enterキーでsubmitしてしまうのを防止する 85 target.find('input[type=text]').on({ 86 'keypress': function(e){ 87 if( (e.keyCode == 13) ) return false; 88 } 89 }); 90 }; 91 92 init(); 93 94 }; 95 96 setMyForm($('#myForm')); 97 98});

//Javascriptにて書き換えたもの

Javascript

1(function () { 2 3 var ERROR_MESSAGE_CLASSNAME = 'errorMsg'; 4 var ERROR_INPUT_CLASSNAME = 'errorInput'; 5 6 var inputSubmit = document.querySelectorAll('input[type="submit"]'); 7 inputSubmit[0].addEventListener("click", function (e) { 8 checkAll(); 9 e.preventDefault(); 10 //console.log("checkAll関数を実行") 11 }); 12 13 items = [ 14 document.querySelectorAll('input[name=formName]')[0], 15 document.querySelectorAll('input[name=formFurigana]')[0], 16 document.querySelectorAll('input[name=formTell]')[0], 17 document.querySelectorAll('input[name=formMail]')[0], 18 document.querySelectorAll('textarea[name=formInquiry]')[0] 19 ]; 20 21 for (let i = 0; i < items.length; i++) { 22 items[i].setAttribute("isSuccess", false); 23 } 24 25 var inputText = document.querySelectorAll('input[type="text"]') 26 for (let i = 0; i < inputText.length; i++) { 27 inputText[i].addEventListener("keypress", function (e) { 28 if (e.keyCode == 13) { 29 e.preventDefault(); 30 } 31 }); 32 } 33 34 function checkAll() { 35 var errorCount = 0; 36 37 checkEmptyText(items[0], '名前をご入力ください。'); 38 checkEmptyText(items[1], 'ふりがなをご入力ください。'); 39 checkEmptyText(items[2], '電話番号をご入力ください。'); 40 checkEmptyText(items[3], 'メールアドレスをご入力ください。'); 41 checkEmptyText(items[4], 'お問い合わせ内容をご入力ください。'); 42 43 for (var i = 0; i < items.length; i++) { 44 if (items[i].getAttribute('isSuccess') == false) { 45 errorCount++; 46 //console.log(items) 47 }; 48 }; 49 if (errorCount == 0) { 50 alert('送信内容にエラーはありません。'); 51 }; 52 } 53 54 var checkEmptyText = function (selector, msg) { 55 if (selector.value == '') { 56 addErrorMessage(selector, msg); 57 selector.setAttribute("isSuccess", false); 58 } else { 59 removeErrorMessage(selector); 60 selector.setAttribute("isSuccess", true); 61 } 62 }; 63 64 var addErrorMessage = function (selector, msg) { 65 removeErrorMessage(selector); 66 67 var spans = document.createElement("span"); 68 spans.classList.add(ERROR_MESSAGE_CLASSNAME); 69 spans.textContent = msg; 70 71 var selectorParent = selector.parentNode; 72 selectorParent.appendChild(spans); 73 selector.classList.add(ERROR_INPUT_CLASSNAME); 74 }; 75 76 var removeErrorMessage = function (selector) { 77 78 79 80 //該当箇所 81 var test = selector.getAttribute("isSuccess"); 82 var error = document.getElementsByClassName("errorMsg"); 83 84 if(test == true) { 85 selector.classList.remove(ERROR_INPUT_CLASSNAME); 86 87 for(let i = 0; i < error.length; i++) { 88 var errorParent = error[i].parentNode; 89 errorParent.removeChild(error); 90 console.log(errorParent) 91 } 92 } 93 94 95 }; 96})();

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

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

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

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

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

yambejp

2020/04/24 12:58

どういうバリデーションの想定ですか? 値があるかないかだけですか?
MTON

2020/04/24 13:00

ご連絡ありがとうございます。 値があるかないかだけです。 未入力チェックだけのバリデーションを作成したいです。
guest

回答1

0

該当の箇所の前に、下記の部分ですが、

if (items[i].getAttribute('isSuccess') == false) {

getAttributeで取得したものは文字列で返ってきていると思うので、
boolean型との比較では意図していない挙動になっていませんか。

投稿2020/04/24 13:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

MTON

2020/04/24 15:19

ご連絡ありがとうございます。 おそらくこの箇所もerrorCountが++されてないので、挙動がおかしいかと思われますが、 やり方がわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問