• ベストアンサー

上手な配列への代入方法

Data = new Array();                    var Name = [ Data[0]  = [0,0,0,0,0,0];  [0,"なし"],                    [0,"--果物--"], Data[1003] = [0,0,0,0,0,0];  [1003,"りんご"], Data[1001] = [0,0,0,0,0,0];  [1001,"みかん"],                    [0,"--野菜--"], Data[203] = [10,10,0,2,0,5]; [203,"レタス"], Data[202] = [10,10,0,2,0,5]; [202,"キャベツ"],                    [0,"--肉--"], Data[100] = [5,5,0,0,0,0];  [100,"鶏肉"], Data[105] = [5,5,0,0,0,5];  [105,"牛肉"],                    [0,"--その他--"], Data[211] = [10,10,0,2,0,5]; [211,"チーズ"], Data[200] = [10,10,0,2,0,5]; [200,"バター"], ~~ var Html = "<SELECT onchange=calc(this.value)>"; for(i=0;i<Name.length;i++){   Html += "<OPTION value="+ Name[i][0] +">"+ Name[i][1] +"</OPTION>"; } Html += "</SELECT>"; selectに表示される順番を簡単に入れ替えるために右のNameを入力したいんですが 何かいい方法はないでしょうか? 単にName代入部分をほかの場所に書けばいいのですが、 結構頻繁に項目追加、順番入れ替えをするので、人間的に読みやすさを考えて出来ればデータと同じ行に書きたいのです(出来ればDataにくっつけたいところですが) 制限としてCookieでData[x]のxを記憶しているため、ここがずれると困ります ※動かない理由はわかっています、大体やりたいことを表現してみました

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

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

> 出来れば配列番号を明記しないで 質問の内容と矛盾しているわよ。 > 制限としてCookieでData[x]のxを記憶しているため、ここがずれると困ります それともxはなくてもいいってこと? まあそれはともかく > Indexのそれ以下を1ずつずらさないといけなくなります 引数にせずにグローバル変数で管理して index++していけばいいじゃない。

mania11
質問者

補足

>function setDataName(index,id,value,data) { >Data[id]=data; >Name[index]=[id,value]; >} >それともxはなくてもいいってこと? idはずれると困りIndexは上の行から順に、と言う感じです >引数にせずにグローバル変数で管理して >index++していけばいいじゃない。 これでいけそうです

その他の回答 (5)

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

No2、No5です。 こんにちは。 >valueの値をcookieで保存しているのでたとえば   ・・・・・ >のように入れ替えた場合、<OPTION value=' + i +'>に対するデータが >変わってきませんか? はい、その通りです。 全体像が不明なので、質問で明示されている範囲から考えるとその方が簡単だろうと思った次第です。 (「このコードを他に用いていない場合は」とお断りしてありますよね?) 順番が入れ替わるのが前提であれば、cookieなどに保存しておくのは、当然、照合用のコードでないとまずいですね。 例で言えば、iではなくName[i][0]を保存しておくことになります。 cookieとの照合がどのくらい頻繁にあるのか不明ですが、多分、最初に照合しておけば良いのでしょうから、1度だけFor~で照合してインデックスを読替えておけば、処理自体はテンポラリな引数(i)を使用していても問題はないと想像します。 もちろん、もともとご提示のように、全体を「照合用のコード」を用いて処理するという方法でもよいはずです。 どのような方法にするのが便利そうかは、全体の処理の内容から決めればよいのではないでしょうか? そもそもは、『配列の代入部分をわかりやすく記すには、どのような構成にすればよいか』という観点からスタートしていますので、他の(質問文に現れていない)部分までには配慮はしていません。 ついでに、今、見ていて気がつきましたがグループラベルの判定は  if ((''+Name[i][0]).substr(0,2)=='--')  よりも  if (Name[i].length=1) のほうが簡単そう。 あるいは、ラベルの項目を配列でなくしておけば  if (Name[i].length) でも判定できそうな気がします。(←未確認) 

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

No2です。 >連想配列?のことですか? はい、そうです。 多分、1003とかは数字というよりも識別コードなんだと想像したのですが、Data[1003]とかやるとData[0]~Data[1003]までの配列が出来るわけで、それが全部埋まっているとは思えなかったので… >計算のときvalueで呼び出す配列番号を指定する良い方法が思い >つかず断念してました 識別コードをキーにして、全部を連想配列に入れてしまえばよいのではと思いましたが、実験したところ、ブラウザによって取り出すときにキーでソートしてしまうものがあるみたいなので、インデックスだけ別に連想配列で作成しておいたほうがよさそうですね。 ついでに、(想像ですが・・)「--果物--」などは選択用のアイテムではなくて、グループ化したラベルだと解釈すれば… 定義は var idx={}; //インデックス用のハッシュ var Name = [ [0,'なし',0,0,0,0,0,0], ['--果物--'], [1003,'りんご',0,0,0,0,0,0], [1001,'みかん',0,0,0,0,0,0], ['--野菜--'], [203,'レタス',10,10,0,2,0,5], [202,'キャベツ',10,10,0,2,0,5], ['--肉--'], [100,'鶏肉',5,5,0,0,0,0]    ・・・・・ などとしておいて、 セレクトボタンのソース作成時に var gr=false; var Html = "<SELECT onchange=calc(this.value)>"; for(var i=0; i<Name.length; i++){ if ((''+Name[i][0]).substr(0,2)=='--') { Html +=(gr?'</optgroup>':'')+'<optgroup label="'+ Name[i][0] + '">'; gr=true; } else { Html +='<OPTION value=' + Name[i][0] +'>' + Name[i][1] + '</OPTION>'; idx[Name[i][0]]=i; }} Html +=(gr?'</optgroup>':'') + '</SELECT>'; みたいにすれば、Name[]の引数をind[value]にすることでOKでは? (実際の使用法がよくわかってないけど、想像通りなら、最初の[0,'なし'…]も不要になると思うけど、とりあえずそのまま。) *)とりあえず原案を尊重して、識別用のコード(1003など)を使用して対象させていますが、このコードを他に用いていない場合は、オプションのバリューにiの値をそのまま設定しておけば、idxなんていう中間のインデックスも不要になるし、もっと簡単にできます。 Html +='<OPTION value=' + i +'>' + Name[i][1] + '</OPTION>'; でよくなるし、idxも不要でoptionのvalueをそのままインデックスに使えばよいことになります。

mania11
質問者

補足

なるほど、option部品を作成するときにIndex番号を入力すれば良いわけですね 盲点でした >ついでに、(想像ですが・・)「--果物--」などは選択用のアイテムではなくて、グループ化したラベルだと解釈すれば… <optgroup>というタグもあったんですね グループとして設定されているからなのか、オンマウスしてもフォーカスが行かないのはちょっと便利なんですが 勝手に子のoptionがインデントされてしまうのが逆に邪魔なので(スタイルで何とかなりそうな気はしますが) まだ作ってないのですが、Select部品作成時に valueが0の場合 Optionにstyle=color:#0000ff; font-weight:bold; などとやろうかなと考えています >*)とりあえず原案を尊重して、識別用のコード(1003など)を使用して対象させていますが、このコードを他に用いていない場合は、オプションのバリューにiの値をそのまま設定しておけば、idxなんていう中間のインデックスも不要になるし、もっと簡単にできます。 自分が理解してないだけかもしれませんが valueの値をcookieで保存しているのでたとえば [0,'なし',0,0,0,0,0,0], ['--果物--'], [1001,'みかん',0,0,0,0,0,0], [1003,'りんご',0,0,0,0,0,0], のように入れ替えた場合、<OPTION value=' + i +'>に対するデータが変わってきませんか?

noname#84373
noname#84373
回答No.4

問題ありそう~!^^; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>サンプル</title> <body> <form action="" method=""> <p>   <select id="p" onChange="calc(this.value)">   </select> </p> </form> <script type="text/javascript"> var data = {    0: [0,0,0,0,0,0,"なし"],    999: [0,0,0,0,0,0,"--果物--"],   1003: [0,0,0,0,0,0,"りんご"],   1001: [0,0,0,0,0,0,"みかん"],    199: [0,0,0,0,0,0,"--野菜--"],    203: [10,10,0,2,0,5,"レタス"],    202: [10,10,0,2,0,5,"キャベツ"],    99: [0,0,0,0,0,0,"--肉--"],    100: [5,5,0,0,0,0,"鶏肉"],    105: [5,5,0,0,0,5,"牛肉"],    198: [0,0,0,0,0,0,"--その他--"],    211: [10,10,0,2,0,5,"チーズ"],    200: [10,10,0,2,0,5,"バター"] }; window.onload = function () {   rebuild('p', data, getCookie('x')); } function rebuild (elementId, data, sno) {   var e = document.getElementById(elementId);   var o, key, str;   var reg0 = /^--.+--$/;   var gp = null;   var tmp;    //  while (o = e.firstyChild) e.removeChild(o);   for (key in data) {     str = data[key][6];     if (str && str.match(reg0)) {       gp = document.createElement('optgroup');       gp.setAttribute('label', str);       gp = e.appendChild(gp);     } else {       tmp = gp ? gp: e;       var op = document.createElement('option');       op.value = key;       op.selected = key == sno;       op.appendChild(document.createTextNode(str));       tmp.appendChild(op);     }        } } function calc(val) {   setCookie('x', val, 100);   alert("0="+data[val][0]+', 6='+data[val][6]); } function getCookie( name ) { name = encodeURIComponent( name ).replace( /([.*()])/g, '\\$1' ); var value = document.cookie.match( RegExp ( name + '\\s*=\\s*(.*?)(?:[\\s;,]|$)' ) ); return value ? decodeURIComponent( value[1] ) : ''; } function setCookie ( name, value, day, path, domain ) {   return document.cookie = encodeURIComponent( name ) + '=' + encodeURIComponent( value ) +     '; ' + 'expires=' + new Date( (new Date) - 86400000 * -day ).toUTCString() +     '; ' + ( path ? 'path=' + encodeURI( path ) + '; ': '' ) +     ( domain ? 'domain=' + encodeURI ( domain ) + '; ': ''); } </script>

mania11
質問者

補足

for (key in data)でループさせると入力した順に回るんですね 知りませんでした ですが下の方のようにブラウザによってはやろうとしていることが出来ないようなのでちょっと問題かもです

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

なんだかよくわからないけど、想像で… >Data[x]のxを記憶しているため、ここがずれると困ります xは識別子で使っているのでしょうから、定義を誤記しない限りは順番等をいくら変えても変わらないように見えるけど? あと、いきなりData[1003]とかになってるけど、連番の配列に入れるべき内容なのでしょうか?(ハッシュとかが合っているのでは?) 質問文では、イメージで書かれているみたいなので、Nameの内容がどこまでなのか良くわからないですが、想像で書くと、わかりやすく記載したいのなら、全部をセットで定義すればよいのでは? たとえば、 var Name = [ [0,'なし','0,0,0,0,0,0'], [0,'--果物--'], [1003,'りんご','0,0,0,0,0,0'], [1001,'みかん','0,0,0,0,0,0'], [0,'--野菜--'], [203,'レタス','10,10,0,2,0,5'], [202,'キャベツ','10,10,0,2,0,5'], [0,'--肉--'], [100,'鶏肉','5,5,0,0,0,0'], ・・・・・・・・・・ ご質問文の通りに配列にデータを入れたいのなら、 Data=[]; for (var i=0; i<Name.length; i++)if (Name[i][2]) Data[Name[i][0]]=Name[i][2].split(','); とでもしておけば良いですけれど、多分、事前にDataにセットしておく必要はないのではないでしょうか。 処理内容が不明なのでまったくの想像ですが、都度、参照する程度で済む処理なのではなかろうかと想像します。そうすればDataの配列そのものが不要になりますね。

mania11
質問者

補足

>xは識別子で使っているのでしょうから、定義を誤記しない限りは順番等をいくら変えても変わらないように見えるけど? 「xの数値が」かわると困ると言うことです 行はずれても問題ないです >あと、いきなりData[1003]とかになってるけど、連番の配列に入れるべき内容なのでしょうか?(ハッシュとかが合っているのでは?) HTMLへの出力順番を行ごと変えたために1003番が一番上に来ただけです ハッシュとは何でしょう 連想配列?のことですか? >参照する程度で済む処理 fanction calc(value){ var DataHTML = ""; DataHTML += "種類 :"+ Data[value][0]+"<BR>"; DataHTML += "カロリー :"+ Data[value][1]+"<BR>"; ~~ などと表示をしているだけです ごくまれに書き換えることはありますがほぼ参照だけです 書いていただいたName配列の方法は考えたのですが 計算のときvalueで呼び出す配列番号を指定する良い方法が思いつかず断念してました 思いついたのは for(i=0;i<Name.length;i++){ if(value==Name[i][0]) value=i; } と呼び出されるたびに毎回ループ処理をやるくらいでしょうか

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

読みにくいわ。 そしてやりたいことがわからない。 正しいコードが書かれていれば 判断の仕様があるんだけど。 というツッコミをしたいんだけどダメかしら。 コードは文法に従って書いてあれば それを理解する人にはそれが一番読みやすいものよ。 Nameはたぶん<option>のvalue属性と表示項目に対応しているのよね。 そして<select>で選択されたvalue値に対応する Data[value]を取り扱うてことなのかしら。 私ならいっそ <option value="0,0,0,0,0,0">りんご</option> とかやっちゃうけどね。 そうすればそれぞれ1行になるわ。 そういうことじゃないのかしら? もうNameとDataの両配列が取り外せない前提で 且つ、どうしてもならべて値をセットしたいというなら そういう関数を作ればいいのよ。 function setDataName(index,id,value,data) { Data[id]=data; Name[index]=[id,value]; } こんな感じ。

mania11
質問者

補足

正しいコードと言われても、動くコードとしては var Name = [ [0,"なし"], [0,"--果物--"], [1003,"りんご"], [1001,"みかん"], [0,"--野菜--"], [203,"レタス"], [202,"キャベツ"], [0,"--肉--"], [100,"鶏肉"], [105,"牛肉"], [0,"--その他--"], [211,"チーズ"], [200,"バター"], ~~ の部分がほかの場所に書かれていて、Data部分の右にはコメントで何のデータかわかるように「//りんご」などとかかれてます calcの部分はただ計算しているだけなので省いていたんですがここのことでしょうか >Nameはたぶん<option>のvalue属性と表示項目に対応しているのよね。 >そして<select>で選択されたvalue値に対応する >Data[value]を取り扱うてことなのかしら。 そのとおりです やりたいことと言うと、 左のData部分とそれに対応した右のName部分があり (大量にあるので)HTMLに出力する時に左のData部分ごと行を入れ替え・削除・追加するだけで出力順番を変えれるようにしたいのです ><option value="0,0,0,0,0,0">りんご</option> これがやりたいことに近そう何ですが活用方法がよくわかりません >function setDataName(index,id,value,data) { >Data[id]=data; >Name[index]=[id,value]; >} これを作ったうえで setDataName(0,0,"なし",[0,0,0,0,0,0]); setDataName(1,0,"--野菜--",[0,0,0,0,0,0]); setDataName(2,203,"レタス",[10,10,0,2,0,5]); setDataName(3,202,"キャベツ",[10,10,0,2,0,5]); のようにやれば出来なくはないみたいですが、 レタスとキャベツの間に項目を追加したくなったとき、Indexのそれ以下を1ずつずらさないといけなくなります 出来れば配列番号を明記しないで追加していくような感じで増やしていきたいです かなりわかりづらいかもしれません、すみません

関連するQ&A

  • ボタンを押して計算結果を出したい

    下記のもの、うまくいきません。 どのようにしたらよいのでしょうか? 教えてください。よろしくお願いします。 <HTML> <HEAD> <TITLE>Calculator</TITLE> <SCRIPT language = "JavaScript"> function calc(Submit){ Num1 = document.foam1.Num1; Num2 = document.foam1.Num2; Ans = document.foam1.Ans; document.foam1.Ans.value = s1 Ans s2; } </SCRIPT> </HEAD> <PRE> 数値1 演算子 数値2 答え</PRE> <FORM METHOD=GET ACTION="/calc/calc.exe"> <INPUT NAME="Num1" VALUE="" onChange="calc()"> <SELECT NAME="Opr" SIZE=1 VALUE="" onChange="calc()"> <OPTION>+<OPTION>-<OPTION>*<OPTION>/</SELECT> <INPUT NAME="Num2" VALUE="" onChange="calc()"> = <INPUT NAME="Ans" VALUE="" onChange="calc()"> <INPUT TYPE="Submit" VALUE="計算"> </FORM> <H2></H2> </HTML>

  • FORMデータを配列としてそうしんしたいのですが・・・

    JavaScriptでセレクトボックス内の値が変化したらもう一つあるセレクトリスト内の値が変更されるように組みました。 以下コード。 ----------------------- <HTML> <head> <script type="text/JavaScript"> <!-- menuItem = [["A","B","C","D","E"],       ["1","2","3"], ["あ","い","う","え","お","か"]]; function setMenuItem(n) { len = document.myForm.works.options.length; for (i=len-1; i>=0; i--) { document.myForm.works.options[i] = null; } for(i=0; i<menuItem[n].length; i++) { document.myForm.works.options[i] = new Option(menuItem[n][i],menuItem[n][i]); } } } //--> </script> </head> <body> <FORM name = "myForm"> <SELECT name="list" onChange="setMenuItem(this.selectedIndex)"> <option value="list1">リスト1 <option value="list2">リスト2 <option value="list3">リスト3 </SELECT> <SELECT name="works[]" MULTIPLE> <OPTION>A <OPTION>B <OPTION>C <OPTION>D <OPTION>E </SELECT> </FORM> </BODY> </HTML> ----------------------- でセレクトリスト内のデータを配列として送信したいのですがうまくいきません。 セレクトリストのnameはworks[]にしたら動作すらしなくなりました。 どなたかご教授願います。

  • IDの取得、繰り返しに問題があるようなんですが・・・

    複数のセレクトの中から選んだ内容をコピーするスクリプトなんですが、 function answerPut(){ var answer = document.getElementById("s1"); var answerCopy = document.getElementById("answer"); answerCopy.value=answer.value } ▲このように単独で1つのフォームからならコピーできたのですが これを複数のフォームに対応させるためにforを使ってみたのですが どうにもうまくいきません。お知恵を拝借いただければ幸いです。 ▼うまくいかないスクリプト <html> <body> <script type="text/javascript"> function answerPut(){ for(var i=1; i<=3; i++){ var answer = document.getElementById(id+i); var answerCopy = document.getElementById("answer"); answerCopy.value=answer.value } } </script> (1)<select name="" id="s1" onChange="answerPut();"> <option value="あ1">あ1</option> <option value="い1">い1</option> <option value="う1">う1</option> </select> (2)<select name="" id="s2" onChange="answerPut();"> <option value="あ2">あ2</option> <option value="い2">い2</option> <option value="う3">う2</option> </select> (3)<select name="" id="s2" onChange="answerPut();"> <option value="あ1">あ3</option> <option value="い2">い3</option> <option value="う3">う3</option> </select> <br> <br> ▼選んだ回答内容が入る<br> <input type="text" name="9" value="" size="40" id="answer"> </body> </html>

  • プルダウンで別項目に値を代入したい(HTML SELECT)

    ホームページのプルダウン項目を選択すると直ぐ下にあるテキスト項目に値を設定するプログラムを作りたいのですが上手くいきません。 HTMLのSELECT句でonchange属性に記述するのは分りますが、その場合にはjavascriptで記述(例:onchange="fncSet();"等)します。 下記は記述を省略しましたが、option項目はDBのテーブルから読み込んでセットしています。 <select name=sel onchange="???">  <option value=" "> </option>  <option value="1">はい</option>  <option value="2">いいえ</option> </select> <input type=text name=txt value=""> この場合にselのonchangeで選択した項目の値をtxtに設定するにはどうすればいいのでしょうか? OS   :WIN2K ブラウザ :IE6 プログラム:HTML(asp,vbscript,javascript)

    • ベストアンサー
    • HTML
  • どちらのほうが処理が早いか

    Food=0; Drink=0; <SELECT onchange='Food=this.value; calc();'> <OPTION value=1>パン</OPTION> ... </SELECT> <SELECT onchange='Drink=this.value; calc();'> <OPTION value=1>水</OPTION> ... </SELECT> function calc(){ totalPrice = Price[Food]+Price[Drink]; alert(totalPrice); } として一旦グローバル変数に入れて計算するのと <SELECT id='Food' onchange='calc();'> <OPTION value=1>パン</OPTION> ... </SELECT> <SELECT id='Drink' onchange='calc();'> <OPTION value=1>水</OPTION> ... </SELECT> function calc(){ totalPrice = Price[document.getElementById['Food'].value]+Price[document.getElementById['Drink'].value]; alert(totalPrice); } getElementByIdで指定して呼び出して計算するのではどちらのほうが処理が早くなりますか?

  • 見よう見まねで以下のように作成してみたのですが

    見よう見まねで以下のように作成してみたのですが 作動しませんでした。 (当方javascript初心者です) どこに問題があるのか、指摘してくださる方を探しています。 極めて初歩的なところで誤っているのだろうと思いますので 質問するのも恐縮なのですが・・・ どなたかよろしくお願いいたします。 ------------------------------------------ <HTML> <HEAD> <script language="JavaScript"> function calc(){ var a = document.form1.001.value; var b = document.form1.002.value; var c = document.form1.003.value; var d = document.form1.004.value; var total = a + b + c + d; document.form1.field.value = total; } </script> </HEAD> <BODY> <BR><BR> <form name="form1"> <Select name="001"> <Option value="10">case1 <Option value="20">case2 </Select>ケース <BR><BR> <INPUT size="15" type="text" name="002">number <BR><BR> <Select name="003"> <Option value="100">volume1 <Option value="200">volume2 <Option value="300">volume3 </Select>ボリューム <BR><BR> <Select name="004"> <Option value="0">N <Option value="50">size1 <Option value="100">size2 <Option value="150">size3 </Select>サイズ <BR><BR> <INPUT type="button" name="calc" value="計算" onClick="calc()"><BR><BR> <input size="15" readonly="readonly" name="field" type="text">total </form> </BODY> </HTML>

  • セレクトで選んだ数の計算方法

    初心者なので基本的な質問ですが、よろしくお願いします。 セレクトで選んだ数値が2つあり、その積を表示したいのです。 どうしたらよいでしょうか。 </script> <script langauage="JavaScript"> <!-- function calcNum(){ var num1 = parseInt(document.getElementById('s1').value); var num2 = parseInt(document.getElementById('s2').value); var kei = num1 * num2; } //--> </script> </head> <body> <form name="form1"> <select size="1" name="select2" id="s2" onchange="selectChange()"> <option value="5"> 5</option> <option value="9"> 9</option> </select> </form> <form name="form1"> <select size="1" name="select1" id="s1" onchange="selectChange()"> <option value="2"> 2</option> <option value="12">12</option> </select> </form> <input type="text" name="kei" size="10">  <input type="button" value="計算" onmousedown="calcNum()"> スクリプトのところだけの抜粋でわかりにくいかもしれないのですが、 どのようにしたら良いか、教えてください。 根本的に違っているようでしたら、どうやればよいのか教えてください。 よろしくお願いします

  • javascriptで選択肢が分かれるプルダウンでcgiにデータを送るには?

    下記のように、javascriptで選択肢が変化するプルダウンを使用してcgiにデータを送りたいのですが、この方法ですと一番最初の選択肢である「果物・肉」の部分のデータしかcgiに送れません。 例えば「果物・梨・20世紀梨」や「肉・鶏肉・比内地鶏」というように、選択したすべてのデータをcgiに送れるようにするにはどうすればよいのでしょうか? 分かりづらい説明で申し訳ありません。 補足説明致しますので、どうかご教授下さいますようお願い致します。 以下がサンプルソースです。 <html> <head> <script type="text/javascript"> <!-- function ConnectedSelect(selIdList){ for(var i=0;selIdList[i];i++) { var CS = new Object(); var obj = document.getElementById(selIdList[i]); if(i){ CS.node=document.createElement('select'); var GR = obj.getElementsByTagName('optgroup'); while(GR[0]) { CS.node.appendChild(GR[0].cloneNode(true)); obj.removeChild(GR[0]); } obj.disabled = true; } if(selIdList[i+1]) { CS.nextSelect = document.getElementById(selIdList[i+1]); obj.onchange = function(){ConnectedSelectEnabledSelect(this)}; } else { CS.nextSelect = false; } obj.ConnectedSelect = CS; } } function ConnectedSelectEnabledSelect(oSel){ var oVal = oSel.options[oSel.selectedIndex].value; if(oVal) { while(oSel.ConnectedSelect.nextSelect.options[1])oSel.ConnectedSelect.nextSelect.remove(1); var eF = false; for(var OG=oSel.ConnectedSelect.nextSelect.ConnectedSelect.node.firstChild;OG;OG=OG.nextSibling) { if(OG.label == oVal) { eF = true; for(var OP=OG.firstChild;OP;OP=OP.nextSibling) oSel.ConnectedSelect.nextSelect.appendChild(OP.cloneNode(true)); break; } } oSel.ConnectedSelect.nextSelect.disabled = !eF; } else { oSel.ConnectedSelect.nextSelect.selectedIndex = 0; oSel.ConnectedSelect.nextSelect.disabled = true; } if(oSel.ConnectedSelect.nextSelect.onchange)oSel.ConnectedSelect.nextSelect.onchange(); } --> </script> </head> <body> <form method="POST" action="http://www.●●.com/●●.cgi"> <input type="hidden" name="mode" value="regist" /> <select name="item" id="sel1"> <option value="果物">果物</option> <option value="肉">肉</option> </select> <select name="" id="sel2"> <optgroup label="果物"> <option value="梨">梨</option> <option value="りんご">りんご</option> </optgroup> <optgroup label="肉"> <option value="牛肉">牛肉</option> <option value="鶏肉">鶏肉</option> </optgroup> </select> <select name="" id="sel3"> <optgroup label="梨"> <option value="20世紀梨">20世紀梨</option> <option value="ラフランス">ラフランス</option> </optgroup> <optgroup label="りんご"> <option value="ふじ">ふじ</option> <option value="つがる">つがる</option> </optgroup> <optgroup label="牛肉"> <option value="和牛">和牛</option> <option value="アメリカ牛">アメリカ牛</option> </optgroup> <optgroup label="鶏肉"> <option value="名古屋コーチン">名古屋コーチン</option> <option value="比内地鶏">比内地鶏</option> </optgroup> </select> <script type="text/javascript"> ConnectedSelect(['sel1','sel2','sel3']); </script> <input type="submit"></form> </body> </html>

  • selectのnameが配列の場合

    説明がわかりにくいかもしれませんがよろしくお願いいたします。   セレクトボックスが選択されると、テキストフィールドが変わるというJavaScriptを作成しています。 nameに配列を使った場合、elementsを使用すればいいと言うことまでは分かり1つだけの場合は成功しました。 しかし、同じname(配列)のセレクトボックスとテキストフィールドが複数ある場合は成功しません。 PHPでデータベースに格納する際に、どうしてもセレクトボックスとテキストフィールドは配列にして置かないといけないのですが、この場合どうすれば、成功するでしょうか? 現在以下のようにソースを書いて失敗しています。 ご教授の程よろしくお願いいたします。 ↓↓JavaScript部分 <script> function selectChange(){ var no = document.test1.elements['member[]'].selectedIndex; if(no==1){ document.test1.elements['point[]'].value =0; } else{ document.test1.elements['point[]'].value =""; } } </script> ↓↓HTML部分 <form name='test1'> <select name='member[]' onChange='selectChange()'> <option value='aaa'>aaa</option> <option value='bbb'>bbb</option> <option value='ccc'>ccc</option> </select> <input name='point[]' type='text'> <br> <select name='member[]' onChange='selectChange()'> <option value='aaa'>aaa</option> <option value='bbb'>bbb</option> <option value='ccc'>ccc</option> </select> <input name='point[]' type='text'> </form> //bbbの場合だけ、テキストフィールドのデフォルト値を0にしたい

  • html onchange

    下記のコードでf002は動きますが、f001が動きません。 scriptで作ったオプションメニューもonChangeが働くようにするには、いかがしたらよろしいでしょうか? <script language="JavaScript"><!-- function f001(){ if (document.test.s1.value==2) alert("2が入力されました"); } function f002(){ if (document.test.s2.value==2) alert("2が入力されました"); } var i,ht=[]; i=0; ht[i] = '<select onChange="f001()" id="s1" >'; for( var i=1; i<=5;) ht[i] = '<option value='+(i)+(i==1?' selected':'')+'>'+(i++)+'</option>'; ht[i] = '</select>'; document.write('s1 =', ht.join('')); // --></script> <form name="test"> s2 = <select onChange="f002()" id=s2> <option value=1 selected>1</option> <option value=2>2</option> <option value=3>3</option> <option value=4>4</option> </select> </form>

専門家に質問してみよう