お世話になります。何卒宜しくお願い致します。
以下のプルダウンボックスが選択されていればその下にあるボタンを有効化し、選択されないでボタンを押すとボタンが無効化されていると同時に、”プルダウンボックスが選択されていません”というエラーメッセージを表示するという設定にしたいのですが、どうかご教授頂けませんでしょうか。
[プルダウンボックス]
<input type="hidden" name="mode" value="" />
<select name="category_id" class="box">
<option label="" value="1">カテゴリ</option>
<!--{html_options options=$arrCat selected=$category_id}-->
</select>
[送信ボタン]
<input type="image" src="<!--{$TPL_URLPATH}-->img/button/search.jpg" alt="検索" name="search" />
ounisi5011様
ご教授いただき感謝いたします。
生成されたHTMLは以下になります。何かお分かりになりますでしょうか。
<input type="hidden" name="mode" value="" />
<select name="category_id" class="box">
<option label="" value="1"> カテゴリ</option>
<option label=" 北海道" value="1391"> 北海道</option>
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
IE9以下やiPadなど、「多少効かない環境がある」ことに目をつぶれば、HTML側に少し手を加えるだけで実現できます。
<select name="category_id" class="box" required="required">
こうすると、そのリストボックスから吹き出しが出て、「選択してください」のようなメッセージが表示されます(ブラウザ側の機能なので、表示スタイルは少しずつ違いますが)。
サンプルページ ※inputですが、selectに付けても同様に動作します
投稿2015/04/15 02:35
編集2015/04/15 02:38総合スコア146543
0
formでの機能を想定して書きます。
送信を無効にするには、form
のsubmitイベントでfalse
を返します。
後は、false
を返す場合と何もしない場合を切り分ければ完成です。
処理はjqueryを使用して記述しています。
lang
1 2// 送信時のイベント 3$('form').submit(function(){ 4 5 // カテゴリの取得 ( value項目が取得される ) 6 var val = $('[name=category_id]').val(); 7 8 // `選択してください`と比較し、処理を切り分ける 9 if(val===''){ 10 11 // 無効時 : `選択してください`の場合 12 alert('選択してください'); 13 14 // 送信しない場合は、falseを返す 15 return false; 16 } 17 18 // 通常時 19 // 何もしなければ、送信されます。 20})
投稿2015/04/15 00:50
総合スコア131
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
*コメント欄が長くなりすぎたので、失礼ながら新たに回答とさせていただきます。
nouzoさんのコードを(質問文追記分のHTML含め)コピーして少し手を加えてローカルで動かしてみましたが、普通に動いてしまいましたね…。
lang
1<input type="hidden" name="mode" value="" /> 2 <select name="category_id" class="box"> 3 <option label="" value="1"> カテゴリ</option> 4 <option label=" 北海道" value="1391"> 北海道</option> 5<option label=" 三重" value="1387"> 三重</option> 6<option label=" 鹿児島" value="1380"> 鹿児島</option> 7 </select> 8 9<input type="image" src="<!--{$TPL_URLPATH}-->img/button/search.jpg" alt="検索" name="search" />
lang
1var select = document.querySelector('select[name="category_id"]'); 2var searchButton = document.querySelector('input[type="image"][name="search"]'); 3 4searchButton.addEventListener("click", function(e){ 5 var idx = select.selectedIndex; 6 var notSelected = (idx <= 0); 7 8 if (notSelected) { 9 e.preventDefault(); 10 e.stopPropagation(); 11 12 window.alert("プルダウンボックスが選択されていません。"); 13 } 14}, false);
カテゴリを選択してもエラーメッセージが表示されるということは(ここで言う「エラーメッセージ」が選択していない時に表示されるものと同じものであるなら)変数[notSelected]が常にtrueであると評価されていることになります。
idx <= 0 について考えてみると、これがtrueと評価される idx にはいくつかパターンが存在します。
lang
1// 0以下の数字型 2console.log(0 <= 0); //==> true 3// null 4console.log(null <= 0); //==> true 5// 空文字 6console.log("" <= 0); //==> true 7// 長さ0の配列 8console.log([] <= 0); //==> true 9// 上記の値を一つ含んだ長さ1の配列 10console.log([0] <= 0); //==> true 11console.log([null] <= 0); //==> true 12console.log([""] <= 0); //==> true 13console.log([[]] <= 0); //==> true
この中で考えられそうなのは…「0」くらいしかないですね。
変数[select]がnullだとすると、そもそもselect.selectedIndexを参照した時点で例外が発生してしまいますし、selectedIndexをきちんと参照できているなら、戻り値は必ず整数になるはずです。
つまり何を選択してもselectedIndexが0かそれ以下になっていると推測します。
とはいえ、selectedIndexが固定値を返す状況が思い浮かびません。私の力量不足です。
長々と書いた上で情けない話になってしまいますが、私には正直今ある情報ではこの程度の返答が限界です。
申し訳ありません。
ここからは蛇足なので読み飛ばしてくださっても結構です。
lang
1var searchButton = document.querySelector('input[type="image"][id="search_button"]');
こう書かれて動作しているということは、検索ボタンにIDを振られたということですね。
となるとパフォーマンス的にも可読性的にも
lang
1var searchButton = document.querySelector('#search_button');
とする方がよいかと思います。
正直実感できるほどの差はありませんが、計算コストは減るはずです。
また、仕事でそういったものを書いた経験がないため想像になってしまい恐縮ではありますが、実際にシステムに組み込む際にはjQueryやPrototype.jsなどブラウザ間の差異を吸収できるようなライブラリやフレームワークを用いるのが一般的かと思います。
例えば、私のコードはモダンブラウザが対象であることを前提としているため、IE8以下で動きません。
上記のコードをjQueryで素直に書き直すと
lang
1jQuery(function($){ 2 var $select = $('select[name="category_id"]'); 3 var $searchButton = $('input[type="image"][name="search"]'); 4 5 $searchButton.on("click", function(e){ 6 var idx = $select.prop("selectedIndex"); 7 var notSelected = (idx <= 0); 8 9 if (notSelected) { 10 window.alert("プルダウンボックスが選択されていません。"); 11 return false; 12 } 13 }); 14});
このような感じになります。
今になって言うのもどうかと思いますが、ymknjuggさんが書かれたようにformタグのsubmitイベントに引っかけた方がスマートですね。
lang
1<form action="[POST先]" method="POST"> 2 <input type="hidden" name="mode" value="" /> 3 <select name="category_id" class="box"> 4 <!--省略--> 5 </select> 6 7 <button type="submit" name="search"> 8 <img src="<!--{$TPL_URLPATH}-->img/button/search.jpg" alt="検索"/> 9 </button> 10</form>
lang
1$('form').on("submit", function(e){ 2 // 省略 3});
投稿2015/04/18 15:03
総合スコア870
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/14 23:07
2015/04/17 11:08

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