要は、:selected Selector のお話です。 通常のコンボボックスですと、どちらでも正しく動きます。しかし、optgroup を使ってコンボボックス内に分類を作ってしまうと、option 要素の階層がが一つ深くなってしまうので選択した option 要素を取得できない事になります。 セレクタとして > を使う事はそもそもあまり無いですが、逆に必要な場合もあるので、メソッドの find(子孫) と children(直近) の違いとして覚えておくとイザという時に役に立つと思います jQuery のコンボボックスの選択で調べると、たいていセレクタでのサンプルがヒットするのですが、.find で書いたほうが明確に意図を反映できると思うのです。(後々のメンテナンスの為に) どうせ、onchange イベントでは $(this) から始まるので .find ですし
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> <select id="font" name="font"> <option value="jiyunotsubasa">自由の翼フォント</option> <option value="kirieji" >切絵字1.0</option> <optgroup label="手書き"> <option value="TanukiMagic" >たぬき油性マジック</option> <option value="setofont" >瀬戸フォント</option> </optgroup> <optgroup label="正統派"> <option value="VL-PGothic-Regular" >VLゴシックフォントファミリ</option> <option value="ume-pgo4" >梅Pゴシック</option> </optgroup> <optgroup label="変化正統派"> <option value="nukamiso_yamiyo_beta07" >ぬかみそ闇夜</option> <option value="kagamimoji-pgoth-v" >鏡文字Pゴシック-V</option> </optgroup> </select> <input type="button" value="子孫選択1" id="get_selected_text1"> <input type="button" value="子孫選択2" id="get_selected_text2"> <input type="button" value="チャイルド選択1" id="get_selected_text_child1"> <input type="button" value="チャイルド選択2" id="get_selected_text_child2"> <div id="result" style='padding:10px;border:1px solid #000;width:200px;'> </div> <div id="result2" style='padding:10px;border:1px solid #000;width:200px;'> </div> <script> // 子孫選択( 正しい方法 ) $("#get_selected_text1").click(function(){ alert( $("#font option:selected").text() ) }); $("#get_selected_text2").click(function(){ alert( $("#font").find("option:selected").text() ) }); $("#font").change(function(){ $("#result").text( $(this).find("option:selected").text() ) }); // チャイルド選択( ダメな方法 ) $("#get_selected_text_child1").click(function(){ alert( $("#font > option:selected").text() ) }); $("#get_selected_text_child2").click(function(){ alert( $("#font").children("option:selected").text() ) }); $("#font").change(function(){ $("#result2").text( $(this).children("option:selected").text() ) }); </script>
表現方法で混乱します。子孫や Children とか、親子と parent とか言われるとごちゃごちゃになりそうです。ですから、この場合 find というメソッドがとても光って見えます。
|
【jQueryの最新記事】
- jQuery の $.get を使用した ajax のテンプレート
- jquery.balloon.js を使用した簡単なバルーン( マウスオーバーで表示する追加説明用 )の作り方
- jQuery による link 要素の追加と削除を bootstrap.css でリアルタイムチェック
- FileReader で、ローカルの CSV を読み込んで(shift_jis)、jQuery でテーブルを作成して表示する
- jQuery + bootstrap.js で ajax の GET と POST を使用した DB テーブルを更新する UI テンプレート
- jQuery : 貼り付けるだけで、ページ右下にページ先頭にジャンプするリンクを表示させる( アニメーションは無し )
- STYLE 要素を追加して、CSS テキストをセットして、jQuery で CSS に important 指定を追加する。
- ページの右下に、ページの先頭へ移動するボタンを追加する(ページの先頭から 200px までは、スクロールボタンを表示しない)
- テーブルのTDをクリックしたら、INPUT で値を変更可能にして、元の値と違うものにはフラグを立てる処理を絵で書いて説明してみました
- jQuery を使用してサーバから取得した JSON データを元にテーブルを作成し、その後から列を加工する
- JSON 配列を WEB より読み出して jQuery で動的にテーブルを作成して表示する
- jQuery UI の Datepicker Widget のオプション
- FormData を使用して、jQuery で配列として PHP に送る
- 必要なデータを隠しリストボックス( multiple ) に jQuery で追加して配列として PHP に送る
- Android Studio の追加日本語化用に、キャラクタセットに依存しないコード文字列を作成するツールを作成しました
- 画像ファイルが存在した時のみ、表示する jQuery の記述
- jQuery で mobile(スマホ) かどうかのチェックをしたくて調べたら、Stack Overflow の記事でいろんな方法が答えられていました。
- jQuery と FileReader オブジェクトによる、ローカルの複数画像ファイルのプレビュー表示
- とても面白くて簡単な jQuery のクリックしたコンテンツ以外を暗転(Blackout) するサンプル
- jQuery で、左右に並んだリストボックスの右側のデーターをダブルクリックしたら左へ転送してソートする処理