argetはidがgreenのdivしか指していないので、灰色になるのはgreenのdivだけですが、アラートが3かいでるのと同じように3回処理されています。このサンプルのように問題にならない場合もありますが無駄なことは避けるべきです。ということで、次項のstopPropagationメソッドにつながります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
並び順がcategory1,2,3,4...という順序になることが保証されているのであれば、
category1,2,3に「category」クラスを付与し、「categoryクラスのchangeイベント」で一元管理することができます。
以下サンプルコード。
※コードは長くなってしまっていますが、category4が増えてもjQueryの修正は不要です。
`
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js"></script> <script type="text/javascript"> $(function(){ function reset(category) { category.empty(); category.append($("<option selected>----</option>")); } /** * カテゴリクラスのチェンジイベント */ $('.category').change(function () { // 今チェンジしたオブジェクトが、カテゴリクラスオブジェクトの何番目かを取得 var index = $(".category").index(this); var child_category = $(".category:eq(" + (index + 1) + ")"); // 子供のオブジェクトが無い場合は処理終了 if (child_category.length == 0) { return false; } // 自分自身より後のカテゴリクラスオブジェクトのオブジェクトを全てreset $(".category:gt(" + index + ")").each(function() { reset($(this)); }); // 自分の子供のカテゴリクラスオブジェクトを更新 call($(this).attr("id"), child_category); }); reset($('#category1')); call(0, $('#category1')); function call(parent_id, category) { ~変更していないので省略~ } }); </script> </script> </head> <body> <div> <select id="category1" class="category"> <option>----</option> </select> <select id="category2" class="category"> <option>----</option> </select> <select id="category3" class="category"> <option>----</option> </select> </div> </body> </html> ` 並び順が保証されていない場合でも、カスタムデータ属性を、各セレクトボックスに追加すれば、同じ方針で対応可能かと思います。http://dresscording.com/blog/html5/custom_data_attribute.html
投稿2014/08/05 05:52
総合スコア696
0
手元で動くことを確認したので再投稿します。
select要素にclass="category"
を追加し、resetとcallはそのままで以下のようにしました。
`
<html> <head> <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js"></script> <script type="text/javascript"> $(function(){ var categories = $('.category'); categories.change(function() { var $this = $(this);</head> <body> <div> <select id="category1" class="category"> <option>----</option> </select> <select id="category2" class="category"> <option>----</option> </select> <select id="category3" class="category"> <option>----</option> </select> <select id="category4" class="category"> <option>----</option> </select> </div> </body> </html> `// 最後の.categoryなら何もしない if ($this.is(':last-child')) return; // チェンジした.categoryのindex var index = categories.index(this); // 後ろの.categoryをすべてreset() $('.category:gt(' + index + ')').each(function() { reset($(this)); }); // 選択したカテゴリーのcategory_id var parent_category_id = $this.find('option:selected').val(); call(parent_category_id, $this.next('select')); }); function reset(category) { category.empty(); category.append($("<option selected>----</option>")); } function call(parent_id, category) { $.ajax({ async: true, type: 'POST', url: 'category.php', data: {'parent_id': parent_id}, success: function(result) { try { var json = JSON.parse(result); $.each(json, function (idx, val) { var $op = $("<option />").val(val.category_id).text(val.category_name); category.append($op); }); } catch (err) { alert('サーバーとの通信でエラーが発生しました'); return false; } }, error: function(msg) { alert('サーバーとの通信でエラーが発生しました'); return false; } }); } }); </script>
投稿2014/08/05 07:19
総合スコア25
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/08/05 07:40
2014/08/05 07:53
2014/08/05 08:09
2014/08/05 08:18
2014/08/05 08:24
2014/08/05 08:32
2014/08/05 08:44
2014/08/05 09:02
2014/08/05 09:12
2014/08/05 09:27
2014/08/05 09:53
2014/08/05 10:09
2014/08/05 13:15
2014/08/05 13:57
2014/08/05 14:25
2014/08/06 02:31
2014/08/06 13:27
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/08/05 07:24
2014/08/05 07:29
2014/08/05 07:35
2014/08/05 07:37
2014/08/05 08:12
2014/08/06 04:27