2011-12-19 14 views
0

さまざまなHTML divのテキストとして使用したい単語を含む一連の配列があります(約35種類ありますが、簡潔にするためにいくつかしかありません)。関数の引数で配列を参照する方法

var bodyplan = ['Anguilliform', 'Compressiform', 'Depressiform', 'Filiform', 'Fusiform', 'Globiform', 'Sagittiform', 'Taeniform']; 

var mouthposition = ["Inferior", "Jawless", "Subterminal", "Superior", "Terminal"]; 

var barbels = ['1', '2', '4 or more']; 

var caudalshape = ['Continuous', 'Emarginate', 'Forked', 'Lunate', 'Rounded', 'Truncate']; 

私はユーザーの選択に基づいてテキストを変更することになっているスイッチ機能を持っている:それはdoesnのを除いて

switch(n){ 
      case 1: 
      changelabels(bodyplan, 8); 
      break; 
      case 2: 
      changelabels(mouthposition, 5); 
      break; 
      case 3: 
      changelabels(barbels, 3); 
      break; 
      case 4: 
      changelabels(caudalshape, 6); 
      break; 
      case 5: 
      changelabels(dorsalspines, 8); 
      break; 
      default: 
      alert("handquestsel error")}}; 

は最後に、私は「(私は変更を行いたい機能を持っていますT):

function changelabels(opt1,opt2){ 
    var i = opt2; 
    var im = opt2 - 1; 
    var c = 1; 
    var index = 0; 
    while (i>=c){ 
     var oldlbl = document.getElementById("rb" + c + "lbl"); 
     var newlbla = opt1.slice(im,i); 
     var newlblb = opt1.toString(); 
     oldlbl.innerHTML = newlblb; 
     c = c + 1 
     index = index + 1 
}}; 

が、私は私の関数のコードを知っているが、この時点で単純に間違っているが、私はそれを私はもう何が起こっているのかわからないので、何度も変更されています。ある時点では、関数を使ってテキストを変更することができましたが、間違っていました(配列の名前を解析し、配列から値を抽出しませんでした)。助けてください。私はここでいくつかの基本的な概念を見落としているのは分かっていますが、どちらが重要かはわかりません。私はこれを理解しようとした時間を失ってしまった。それはとてもシンプルでなければならないようですが、それを機能させるための私の混沌とし​​た試みでは、私はまだ答えにつかまえていません。

EDIT:私はswitch文が関数を呼び出して、関数のラベルを引っ張る適切な配列に渡すようにしたい。このアプリの目的は、ユーザーが魚を識別することを学ぶのを助けることです。ユーザがページ上で選択を行うと、様々な文字状態についての一連の画像が、状態を説明する付随するラベルとともに示される。例えば、ユーザが口座位置を選択すると、一連のdivには、魚が持つ異なる口位置が表示され、ピクチャの下にラベルが表示され、その特定の文字状態が何であるかをユーザに伝えます。私はちょうど良い変更するには、写真を得ることができますが、私はラベルと地獄を持っている。

+1

「私はもう何が起こっているのか分からないほど何度も変更しました」というのは、あなたが机から起き上がり、建物を4回歩いて戻ってくるときです。 –

+0

最終目標は何ですか?これをより明確にすることで、より良い解決策を決定するのに役立ちます。 – JesseBuesking

+0

私はお手伝いしたいと思いますが、あなたが何をしようとしているのか分かりません。あなたはもっと詳しく説明してくれますか? – swatkins

答えて

0

switch文で、適切な配列への参照とその配列の予想される長さの両方を渡しています。すべてのJavaScript配列に.length propertyがあるため、2番目のパラメータは不要です。 。ただindexで個々のアイテムを取得するためにarrayVariable[index]を使用する - それは元からコピーされた新しい配列を返すため、

あなたは、配列のうちの個々の値を取得するために.slice()を使用したくありません。あなたのコードよりも、どのようにはるかに簡単

switch(n){ 
    case 1: 
     changelabels(bodyplan); 
     break; 
    case 2: 
     changelabels(mouthposition); 
    // etc. 
} 

function changelabels(data) { 
    var i, 
     lbl; 

    for (i = 0; i < data.length; i++) { 
     lbl = document.getElementById("rb" + (i+1) + "lbl"); 
     lbl.innerHTML = data[i]; 
    } 
} 

お知らせ:

だから、(既存のアレイの定義と)このような何かをしようとしている一緒に入れて?ここでは、更新する要素に「rb1lbl」、「rb2lbl」などのID番号が1から始まると仮定しています。JavaScript配列のインデックスが始まるので、これらのIDは(i + 1)を使用していますゼロ。また、lbl変数も必要ではないことにご注意ください:document.getElementById("rb" + (i+1) + "lbl").innerHTML = data[i]と言うこともできますが、私はそれを残して、下に展開するものがあります。

機能の中では変化しているようです配列内の値ごとに1つの要素のセット(ラジオボタンのラベル?)にラベルを貼り付けますが、配列アイテムがなくなると停止します。これは、残っている要素が以前の選択からの値を保持していることを意味します前回の選択は8つのオプションを持つ "ボディプラン"でしたが、あなたは5つしかない "口当たり"に変更しました。残りの3つの要素を隠して、残りのいくつかの "ボディプラン"アイテムを表示し続ける必要があります。要素をループすることができる配列の長さに基づいてループを設定し、現在の要素が配列の終わりを超えるインデックスを持つ場合それデ、このような何か:

function changelabels(data) { 
    var i, 
     lbl, 
     elementCount = 20; // or whatever your element count is 

    for (i = 0; i < elementCount; i++) { 
     lbl = document.getElementById("rb" + (i+1) + "lbl"); 
     if (i < data.length) { 
     lbl.innerHTML = data[i]; 
     lbl.style.display = ""; 
     } else { 
     lbl.innerHTML = ""; 
     lbl.style.display = "none"; 
     } 
    } 
} 

これらの要素は、ラジオボタン(IDに基づいてただの推測)のためのラベルであるならば、あなたはまた、対応するラジオボタンを非表示にしたり、表示したいと思いますが、私はあなたを願っています上記のようにいくつかの行を追加する方法を理解することができます。

(前述したように、配列のインデックスは0から開始するときに要素のidは1からカウントアップ持っていることについて注意してください)

上記は、(の少なくとも一部)を投稿してください動作しない場合は、関連するHTML - 明らかに私はちょうどそれがどんなものかを推測しなければなりませんでした。

+0

応答いただきありがとうございます。私は今日これらのことを試してみるつもりです。結果を掲載します。私はそれを働かせることができない場合、私はちょうど変更をハードコードし、移動するつもりです。 – WyoBuckeye

+0

私はあなたの提案を取った。配列はまだアクセスできません。私はinnerHTMLステートメントを直接文字列にラベルを変更することができます。例: 'document.getElementById( "rb" +(i + 1)+ "lbl")。innerHTML = "文字列"'。しかし、私が配列 '.... innerHTML = bodyplan [i]を参照しようとすると、動作しません。何らかの理由で配列にアクセスすることができず、理由を知っていれば気になります。私がやろうとしていることはそれほど難しいことではありません。これ以前は何の問題もなく、コードのページがありましたが、配列にアクセスしようとするこの部分はフラットになります。 – WyoBuckeye

+0

私の疑惑スコープの問題が確認されました。私は配列を変更ラベル関数に移しましたが、すべてうまくいきました。何らかの理由で、ページの上部に宣言したグローバル変数は実際にはグローバルではありません。ケースだと思います。 – WyoBuckeye

-1

あなたのコードで正確に達成しようとしていることを理解できません。しかし、変数(この場合は配列)を参照渡しするには、変数の前に "&"を追加するだけです。

function the_name(&$var_by_ref, $var_by_value) { 
// Here if you modify $var_by_ref this will change the variable passed to the function. 
} 

より:助けhttp://php.net/manual/en/language.references.pass.php

希望。

+1

JavaScript配列では、オブジェクトはオブジェクトであるため、配列は常に参照渡しされます。参照インジケータ '&'によるパスは存在しません。 – Halcyon

+0

それは助けにはなりませんでしたが、感謝します。 – WyoBuckeye

1

の線に沿って、なぜだけではなく、何か:あなたは本当に抽象データ構造にすべてをかけるしようと、私はする理由を見ていないように見える

document.getElementById("bodyplan_label").innerHTML = bodyplan[bodyplan_index]; 

。ちょっとだけそれを保つ。

またbodyplanはわずか8の要素を持っているので、すべての近代的なプログラミング言語で一般的であるように配列は0で始まるためbodyplan[8]はあなたにout of bounds exceptionを与えるだろう。

+0

私はこれを試しました。問題は配列にアクセスすることにあるようです。たとえば、次の文を作成するとします。 'document.getElementById( "bodyplan_label")。innerHTML = "bodyplan [bodyplan_index]";ラベルは二重引用符内の文字列に変更されます。しかし、引用符を取り除いて試してみると何も起こりません。ステートメントはラベルを変更するために働きます。しかし、私はそれを変更する文字列を与える場合のみ。配列の宣言をチェックして正しい構文を使用していることを確認しましたが、アクセシブルではないようです。 – WyoBuckeye

+0

スコープに関する問題の疑いが確認されました。私は配列を変更ラベル関数に移して、すべてうまくいった。何らかの理由で、私がページの先頭で宣言したグローバル変数は実際にはグローバルではありません。私はなぜそれが事実であるか分からない。 – WyoBuckeye

+0

'' bodyplan [bodyplan_index] ''は実際の文字列を意味します_bodyplan [bodyplan_index] _、 'bodyplan [bodyplan_index]'は 'bodyplan'の' bodyplan_index'の位置の値を意味します – Halcyon

0

解決策:アレイ変数の範囲を、ページ上部のグローバル変数として使用する代わりに、使用する関数に移動することによって、ローカル変数に変更しました。私は変数宣言のすべてのルールに従っていたので、私は理解しません。しかし、いくつかの未知の理由のために、JavaScriptのグローバル変数は嫌です。

解決策編集:グローバル変数を宣言する際にエラーが見つかりました。これはなぜ私がそれらにアクセスすることができなかったの私の問題の源であったかもしれません。しかし、私のコードを修正して以来、この時点では問題にはならない。

+0

これは、どの言語でもグローバルを最小限に抑えるためには良いプログラミング方法ですが、それは言語の信頼できない部分を避ける方法ではなく、組織化とモジュール化の問題です。 **グローバルな_do_はJavaScriptで動作します** - それにはいくつかのトリックはありません。もちろん、私はあなたのプログラムがうまく動作してうれしいですが、そのように動作するのをやめるには間違った何かがあったに違いないでしょう。あなたの「未知の理由」は、経験豊富なJavaScripterによって説明されている可能性が高いと思われます。もしあなたがすべてのコードを文脈で見ることができれば、それをhttp://jsbin.comに貼り付けることができます。 – nnnnnn

関連する問題