JQuery selectが反映されない

このQ&Aのポイント
  • JQueryを使用して動的に作成されたselect要素の変更が反映されない問題について解決方法を探しています。
  • コードの中でsetSelect(2, 6)を呼び出してもselect要素が正しく変更されない現象が発生します。
  • select要素を動的に変更する方法についてアドバイスをいただけないでしょうか?
回答を見る
  • ベストアンサー

JQuery selectが反映されない

selectを動的に作成するコードをJQueryで書いています。そのselectの要素optionの値は作成後も何度か変更します。  var select;  function setSelect(from, to){    select = $('<select>');    for(var i = from; i <= to; i++) select.append($('<option>').text(i));  };  setSelect(1, 10);  $(document.body).append(select)  setSelect(2, 6); 上記のコードを実効するとsetSelect(2, 6);は無視された状態になります。 上記のsetSelectは引数from~引数toの値をoptionにしてselectにその値をセットします。setSelect(1, 10);で1~10までを選択できるselectができ、次に setSelect(2, 6);でselectが2~6に変わることを期待しますが、そうなりません。どのようにしたら、変更が反映されるのでしょうか? ※実際のプログラムではsetSelect(2, 6)のような呼び出しは、プログラム(イベント発生など)が呼び出します。

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

>しかしながら、なぜこれでうまくいくのかは結局分かりません。 質問者様がご提示のコードは、「新しいセレクトを生成する」コードになっています。 例えば、最初のコードで  >setSelect(1, 10);  >$(document.body).append(select);  >setSelect(2, 6);   $(document.body).append(select); //追加 などとしてみれば、セレクト要素が追加されるのがわかるでしょう。 一方で、なさりたいことは、「同じselect要素に対してオプションの内容を入れ替える」ということかと推測します。 その場合は対象となるselect要素は固定なので、最初にselect要素を作成しさえすれば良く、また、入れ替えるためには一旦内容を空にしてから必要なものを追加するようにしておく必要があります。 別の考え方として、ご提示のコードのように新しくselect要素を作成し、それまでのものとそっくり入れ替える(もとのものを削除し、新しいものを追加する)ようにしても、ご希望のような結果になると思います。

newtgecko
質問者

お礼

ご回答ありがとうございます。理解出来ました。 質問文にあるコードでうまくいかない原因はfor文のselect = $('<select>');をしているところですね。新しいインスタンスがselectに入るためselectの参照が変わっていまい今まで参照していたものとは別の参照になっているからですね。 この質問に訪れる人のためを考え、まとめると、 select内部のoptionを変更(更新)するときは var select = $('<select>')のように最初に宣言したら、このselectのoptionを変えるときはselect.empty()を使いselectの中を空にしてから、optionを追加すればいいです。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5083/13282)
回答No.1

setSelect関数を呼び出しただけでは反映されません。 変数selectはJavaScript内のデータでしか無く、DOMに直接作用しません。 以下のようにすると、ご希望の動作になるのではないでしょうか。 var sel = $('<select id="select">'); $(document.body).append(sel) var select = $('#select'); function setSelect(from, to){ select.empty(); for(var i = from; i <= to; i++) select.append($('<option>').text(i)); }; setSelect(1, 10); setSelect(2, 6);

newtgecko
質問者

お礼

ご回答ありがとうございます お礼を書いている途中で疑問があってそれを確かめていたら、なぜか自分でこの質問を解決する一つの方法にたどり着きました。 var select = select = $('<select>'); $(document.body).append(select); // 最初にappendしたらなぜかうまくいきました function setSelect(from, to){  select.empty();  for(var i = from; i <= to; i++)  select.append($('<option>').text(i)); }; setSelect(1, 10); setSelect(2, 6); なるべくなら、idを使わずに実装したかったので、上記のような形でうまくいって良かったです。しかしながら、なぜこれでうまくいくのかは結局分かりません。 >変数selectはJavaScript内のデータでしか無く、DOMに直接作用しません。 というところに疑問をもってそれを試していたらこれにたどり着きました。一見するとDOMにも直接作用しているように思えます。どうなのでしょうか?

関連するQ&A

  • Jquery セレクトボックス追加

    現在jqueryにて、セレクトボックスchangeの値でセレクトボックスを追加するというものを作っています。 わからない点がいくつかあり、ご質問させていただきました。 <select name="num" id="num"> <option value="1">A</option> <option value="2">B</option> <option value="3">C</option> <option value="4">D</option> <option value="5">E</option> </select> というselectboxがあったときに、changeイベントで常に値をとっています。 $('#num').change(function(){ var numTotal = eval($('#num :selected').val()); $('#num1 > select').remove(); for(i = 1; i <= numTotal; i++) { $('#num1').append($('<select name="num1['+ i +']" class="num1">')); for(no = 1; no <= 99; num++) { $('#num1').append('<option value="'+ no +'">'+ no +'</option>'); } $('#num1').append($('</select>')); } }); と記述をしているのですが、 numで5を選択すると5個分selectboxは表示されます。 ですが、optionをnoで回しているとnumで選択した数ぶんループしています。 またnumでの値で表示されたslectbox(num1)2つめ以降から様子が変わり、noのループ数が1つずつ減っていきます。 例:numで5を選択 num1[0]では99までの数字が5回表示され、num1[1]だと99までの数字が4回表示され、num[2]だと99までの数字が3回表示されてしまいます。 これを正常に各num1[0]、num1[1]は99までの数字を1回のみに表示させるにはどうしたらよいでしょうか? 悩んでしまったため、投稿させていただきました。 どなたかご教授いただけないでしょうか?

  • 2つのセレクトボックスを連動させたい

    2つのセレクトボックスを連動させて、 片方の選択を変更すると、もう一方の選択できる範囲が限定されるようにしたい。 下記のようなソースでセレクトボックスを2つ表示させています。 jQueryを使用しています。 それぞれ「開始年」「終了年」という意味合いで、 取得する値から、「年の範囲」を決定するものです。「option」の「value」には、西暦の4桁の数字が入るようにしています。 そこで、「開始年」選択を変更させたときに、「終了年」のセレクトが開始年よりも古い年を選択できないように連動させたいのですが、何かいい方法はないでしょうか。 ※「送信」ボタンをクリックした際に、警告文を表示するのではなく、 2つのセレクトを連動される形で実現させたいと考えております。 ↓↓【記述コード】---------------------------------------------- 開始年:<select name="year_start" id="feas_1_1"></select> <script type="text/javascript" src="jquery-1.11.1.js"></script> <script type="text/javascript"> //現在の年数オブジェクトを4桁で生成 var time = new Date(); var year = time.getFullYear(); var init_year = 1955; //1970年まで表示 for (var i = init_year; i <= year; i++) { if(i < 1989){ no = 1925; era = '昭和 '; }else{ no = 1988; era = '平成 '; } var s = i - no; if(s == 1){ s = '元'; } $('#feas_1_1').append('<option value="' + i + '">' + era + s +'年( '+ i+ '年)</option>'); } </script> 終了年:<select name="year_end" id="feas_1_2"></select> <script type="text/javascript"> //現在の年数オブジェクトを4桁で生成 var time = new Date(); var year = time.getFullYear(); var init_year = 1955; //1970年まで表示 for (var i = year; i >= init_year; i--) { if(i < 1989){ no = 1925; era = '昭和 '; }else{ no = 1988; era = '平成 '; } var s = i - no; if(s == 1){ s = '元'; } $('#feas_1_2').append('<option value="' + i + '">' + era + s +'年( '+ i + '年)</option>'); } </script>

  • 条件を付けたセレクトメニューの値の取得

    JavaScriptで下記の流れの入力フォームを作成しています。 (1)一つ目のセレクトメニューで選択した項目に応じて、もう1つのセレクトメニューの内容を変更する (2)submitボタンを押すと、次のWeb画面で選択した内容を表示する (1)については色々なところのサンプルコードを参考にしつつ、なんとか作成できました。 しかし、(2)は値の受け渡しがうまく出来ずに頭を抱えています。 (unitの値もgroupの値も共に空欄が返ってくる) ◆(1)のコード: 例えばUnit1を選択すると、グループ1(1-1~1-4)が表示され、 Unit2を選択すると、グループ2(2-1~2-4)がセレクトメニューに表示されるというものです。 <TR><TD> <TD><B>Unit</B><BR>  <select name="unit" onchange="groupSet()"> <option value="">-選んでください-</option> <option value="">Unit1</option> <option value="">Unit2</option> <option value="">Unit3</option> </select> <TD><B>Group</B><BR>  <SELECT NAME="group"> <option value="">-選んでください-</option> <option value=""></option> <option value=""></option> <option value=""></option> <option value=""></option> </select> <script> //グループ1の配列 var group1_list=new Array( "-選んでください-","1-1","1-2","1-3","1-4"); //グループ2の配列 var group2_list=new Array( "-選んでください-","2-1","3-2","3-3","3-4"); //グループ3の配列 var group3_list=new Array( "-選んでください-","4-1","4-2","4-3","4-4"); function buSet(){ //オプションタグを連続して書き換える for ( i=1; i<5; i++ ){ //選択分岐 switch (document.selbox.unit.selectedIndex){ case 0: document.selbox.bu.options[i].text="";break; case 1: document.selbox.bu.options[i].text=group1_list[i];break; case 2: document.selbox.bu.options[i].text=group2_list[i];break; case 3: document.selbox.bu.options[i].text=group3_list[i];break; } } document.selbox.bu.selectedIndex=0;} </script> ◆(2)のやりかた request.getParameter("unit")およびrequest.getParameter("group")で値を取得し、 画面への表示&ファイルへの保存を行っていますが、選択したgroup○○○の項目ではなく、空欄を取得しているようなのです・・・ どなたか知恵を貸してください。よろしくお願いします。

  • [jQuery]イベント定義時のコールバック関数に引数を渡したい

    ■以下のHTMLが1~5の5個あるとします。 <select id="test_list1"> <option value="1">あいうえお</option> <option value="2">かきくけこ</option> </select> <div id="test_txt1"></div> ■jqueryで以下のように、セレクトボックスを変更したら、それに紐づくdivタグのテキストを書き換えるとします。 var test = 5; for (i=1; i <= test; i++) { $("#test_list"+ i).change( function() { $("#test_txt"+ i ).text('変更されました。'); }); } change()イベント時は、iの値が正常なんですが、 text()で書き換え時は、iの値が常に5になってしまいます。 text()で書き換え時のiは、イベント定義時のiではないということは分かるのですが、 解決の方法がわかりません。 こんなふうに引数として渡すことはできないのでしょうか? $("#test_list"+ i).change( function( i ) { $("#test_txt"+ i ).text('変更されました。'); }); ご教示願います。。

  • selectの初期値を設定したい

    いつもお世話になります。 javascriptにて、ページを開くと、 セレクトボックスの値が、初期値になるようにしようと思ってますがうまくいきません。 詳しく書きますと、担当者一覧がセレクトボックスに入っていて、 そのページを開くと、ログインしている担当者名が選ばれた状態にしたいのです。 ※たとえば、「山本太郎」でログインしているとすると、ページを開くとセレクトボックスが、  「山本太郎」が選ばれている状態にしたいのです。 いろいろ調べて、自分なりにソースを書いてみましたが、うまくいきません。 以下ソースになります。 <SCRIPT LANGUAGE="JavaScript" > var tantou = "<%=Rs("作業担当者")%>" var element = document.getElementById("sagyounm"); for (var i=0; i<element.options.length;i++) { if(element.options[i] === 'tantou'){ element.options[i].selected = true; break; }; }; </SCRIPT> Rs("作業担当者")は、ログインした担当者名です。 たぶん上記のソースはセレクトが選ばれている値を取得してるだけだと思います。 *********************************************** 以下は、セレクト部分です。 <select name="sagyoutantou" id="sagyounm" required> <option value=""/>---作業担当者選択---</option> <option value="山本 太郎"/>山本 太郎</option> <option value="山下 清"/>山下 清</option> <option value="岡本 次郎"/>岡本 次郎</option> どうにか、初期状態から担当者が選ばれている状態にできないでしょうか。 お忙しいとは思いますが、 おわかりの方いらっしゃいましたら、 どうかご教授お願いします。

  • jquery datepickerについて

    言語初心者です。 まだ、ほとんど自分では書けず、どうにかネットに上がっているものを使っている状態です。 datepickerを利用しつつ、fromとtoから期間を計算させたいと思っています。 過去ログがあったので示します。 http://okwave.jp/qa/q7656838.html onSelect: function() {   // 開始を取得     var from = $('#date-from').val();   // 終了を取得     var to = $('#date-to').val();     if ( from !== '' && to !== '' ) {        var date = new Date(to).getTime() - new Date(from).getTime();        alert ( date/(1000*60*60*24) );     }   } 上記ソースコードの   alert ( date/(1000*60*60*24) ); の部分を書き換えて /*html内*/ <input type="text" id="from-to" name="期間"> のテキストボックスに計算させた日数を出したいのですが、上手くいきません。 どなたかご教授ください。よろしくお願いいたします。

  • jQueryでセレクトボックスの制御

    自身のウェブサイト上のhtmlファイル内に複数選択型のセレクトボックスを、<select multiple="multiple">以下に<option value="XXX">を通し番号をつけて並列することで実装したとします。 jQueryにて例えば var a= [001, 003, 042]; といったように配列aを定義したときこの配列の中の要素(3桁の数字)に対応するようなvalueをもつoption(選択肢)をselectedに書き換えたいのですが初学者のためどうもさっぱりうまく行きません。 1.配列aをoptionタグのvalueの値であるとjQuery側に認識させる方法 2.jQueryによって配列に対応するvalueを持つoptionをselectedに書き換える方法 以上の2点について教えていただきたく思います。(説明が下手で申し訳ないです。) 配列を使わなくてももっと簡単な方法があるのかもしれませんが、諸事情によりなんとか配列を用いて実装できたらと思います。よろしくお願いします。

  • サブウィンドウのリンクに応じて親ウィンドウのセレクトメニューにデータを反映させる

    よろしくお願いします。 子ウィンドウ側の地下鉄南北線という文字リンクをクリックすると 00:北24条駅","01:札幌駅","02:大通駅"が親ウィンドウのセレクトメニューに反映されるように変えたいのです。下記のスクリプトを使ってどのように親ウィンドウと子ウィンドウに分ければいいのでしょうか? 駅名の数はそれぞれのリンクによって違います。 <html> <head> <title>セレクトメニューで選択したものに応じて2つめのセレクトメニューに反映させる</title> <script language="JavaScript" type="text/JavaScript"> <!-- var data = new Array(":交通",":地下鉄南北線",":地下鉄東西線",":地下鉄東豊線"); var data0 = new Array(":---"); var data1 = new Array("00:北24条駅","01:札幌駅","02:大通駅"); var data2 = new Array("10:西18丁目駅","11:西11丁目駅","12:大通駅","13:バスセンター前","14:東札幌"); var data3 = new Array("20:札幌駅","21:大通駅","22:豊水すすきの"); function SetList(objid, arr){ var obj = document.getElementById(objid); for(i=obj.length; i>=0; i--){ obj.options[i] = null; } for(i=0; i<arr.length; i++){ var a = arr[i].split(":"); obj.options[i] = new Option(a[1], a[0]); } } //--> </script> </head> <body onLoad="SetList('sel0', data);"> <form name="form1"> <select id="sel0" name="sel0" style="width:160px;" onChange="SetList('sel1', eval('data' + this.selectedIndex))"> <option>---</option> </select> <select id="sel1" name="sel1" style="width:160px;"> <option>---</option> </select> </form> </body> </html> どなたか教えていただける方がいましたらどうぞよろしくお願いいたします。

  • セレクトボックスを動的に選択された状態で表示

    画面から取得した値を元にセレクトボックスが選択された状態で画面に表示させる方法を教えて下さい。 JavaScript //前の画面から値を取得 //取得した値は問題無し if(kbumon=="10"){ var bumon = "部署1"; }else if(kbumon=="20"){ var bumon = "部署2"; }else{ var bumon = ""; } var data = { bumon : bumon, } html <span style=" color:black;"><b>部署:</b></span> <select name="bumon" class="select"> <option></option> <option>部署1</option> <option>部署2</option> </select>

  • jqueryでselect要素を表示・非表示する方

    下記のように、select要素を2つ用意し、果物か魚を撰択すると、それに応じた2番目のselect要素が表示されるようなコードを作りました。 見た目の問題はないのですが、1つ目で魚を撰択し、あじやさんまを撰択しても、最終的にフォームが送信される時には 果物のvalueが参照されてしまいます。 jqueryのhiddenで隠しているだけなので、果物用のselect要素が裏に潜んでいるためにこういった結果になっているかと思うのですが この問題を解決するためにはどうしたらよいのでしょうか。 <form id="test"> <select id="type"> <option value="fruit">果物</option> <option value="fish">魚</option> </select> <select name="sample" id="fruit"> <option value="apple">りんご</option> <option value="orange">おれんじ</option> </select> <select name="sample" id="fish"> <option value="aji">あじ</option> <option value="sanma">さんま</option> </select> <input type="submit" > </form> // はじめは全て隠しておく $('#fruit').hide(); $('#fish').hide(); $('#type').change(function(){ var type = $(this).val(); if (type == 'fruit') { $('#fruit').show(); $('#fish').hide(); } else { $('#fruit').hide(); $('#fish').show(); } }); $('form').submit(function(){ var result = $('form [name=sample]').val(); alert(result); return false; });

専門家に質問してみよう