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

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

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

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

jQuery

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

Q&A

2回答

2209閲覧

コードを短くしたい

honoka11191

総合スコア50

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2014/08/04 23:53

argetはidがgreenのdivしか指していないので、灰色になるのはgreenのdivだけですが、アラートが3かいでるのと同じように3回処理されています。このサンプルのように問題にならない場合もありますが無駄なことは避けるべきです。ということで、次項のstopPropagationメソッドにつながります。

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

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

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

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

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

guest

回答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

nak

総合スコア696

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

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

honoka11191

2014/08/05 07:24

動かなかったので間違いがあればご指摘ください
nak

2014/08/05 07:29

「call関数の中身」が無いからではありませんか? ※私のサンプルコードでは「~変更していないので省略~」と書かせていただいておりますので、 honoka11191さんが最初に提示されたコードに書かれていた内容を、そのままご利用ください。
honoka11191

2014/08/05 07:35

すみません honoka11191さんが最初に提示されたコードに書かれていた内容を、そのままご利用ください。 とはどのようにすればよいのでしょうか?
honoka11191

2014/08/05 07:37

一応コピペさせていただいて文字はいじっていません
honoka11191

2014/08/05 08:12

再びすみません $.ajax({ から下の文を使っていないから値が取れていないのでしょうか?
nak

2014/08/06 04:27

> $.ajax({ > から下の文を使っていないから値が取れていないのでしょうか? はい。 サンプルコードがちょっと長くなってしまったので、 「honoka11191さんが質問文に最初に書かれていたコード」 のうち、こちらで修正不要だった(=そのまま使用できる)call関数の中身を省略させていただきました。 # コード中にも「~変更していないので省略~」と書いたつもりだったのですが・・・ # 説明がわかりにくかったようで申し訳ありません。 ですので、私の提示したサンプルコードの function call(parent_id, category) { ~変更していないので省略~ } を、 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; } }); } (↑質問文に書かれていたfunction call()をそのままコピペしました) に置き換えていただければ動くのではないかと・・・。 よろしくお願いします。
guest

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);
// 最後の.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>
</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> `

投稿2014/08/05 07:19

mzhs1986

総合スコア25

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

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

honoka11191

2014/08/05 07:24

動かなかったので間違いがあればご指摘ください
mzhs1986

2014/08/05 07:40

手元で動くことを確認して再度投稿しました
honoka11191

2014/08/05 07:53

すみません さっそくの対応ありがとうございます コピペさせていただいたんですがchromeのf12でエラー内容を確認したところ Uncaught SyntaxError: Unexpected end of input    selectCategory.html:1 とでて動きませんでした。 どうすればいいでしょうか?
mzhs1986

2014/08/05 08:09

省略せずに書き直してみました。callは手元で試せるように書き換えてあります。
honoka11191

2014/08/05 08:18

mzhs1986様 回答ありがとうございます これを応用して一番上のコードでやるにはどのようにすればいいでしょうか? 今回はajaxで値をとってきているので
mzhs1986

2014/08/05 08:24

callを元のコードに書き換えてください
honoka11191

2014/08/05 08:32

すみません・・・ 元のコードとはどういった感じのものでしょうか?
mzhs1986

2014/08/05 08:44

callを元に戻しました
honoka11191

2014/08/05 09:02

mzhs1986様 動いたのですが一つ目のセレクトボックスの値と二つ目のセレクトボックスの値が同じになってしまいます 例えば今一つ目のセレクトボックスを選んだらみかん、りんごが出るのですが 二つ目のセレクトボックスでもみかん、 りんごと出てしまいます 三つ目のセレクトボックスから二つ目のセレクトボックスでみかんを選んだら甘い、すっぱい りんごを選んだらコクがある、美味しい と条件通りに出ます どうすれば一つ目と二つ目のセレクトボックスの値が同じようにならないでしょうか?
honoka11191

2014/08/05 09:12

コメントも入れてもらえるとありがたいです
mzhs1986

2014/08/05 09:27

category.phpを見せていただけないでしょうか
mzhs1986

2014/08/05 10:09

すみませんjs側のミスでした。直したので確認してみていただけないでしょうか
honoka11191

2014/08/05 13:15

ありがとうございます! 無事に動くことが出来ました 少しお聞きしたいのですが $('.category').change(function(e) { var index = $('.category').index(e.target); のeの部分はeventとはまた違うのですか? 調べてみたのですが何か違うようだったのでお聞きしたいです
honoka11191

2014/08/05 14:25

eventですかすいません 長々とお付き合いありがとうございます 頑張って勉強していこうと思います!
honoka11191

2014/08/06 02:31

すみませんもしよろしければ$(function(){var ~ {$.ajaxまでのコードの意味の解説よろしいでしょうか? 自分なりにやってるんですがいまいちわかりません
mzhs1986

2014/08/06 13:27

無駄な処理が多かったので(すみませんorz)削ってコメントを追加しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問