1

チェックボックスの入力に基づいて、テーブル内の選択された行の値の配列リストを作成しようとしています。私の問題は pop コマンドだと思いますが、よくわかりません。基本的に、ユーザーは行 x、y、z を選択し、これらが配列に格納されていることを確認してから、z の選択を解除して x と y のみを表示することができます。

<script type="text/javascript"> 
    var values = new Array();

    function setrow(row)
    { 
        values = [];
        for (var i = 1; i < 5; i++) {
            if (values[i] = row) {
               values.pop(i);

            } else {
              values.push(row);
            }
        }
    } 


    function display() {
        for (var i = 0; i < values.length; i++) {
            console.log(values[i]);
        }    
    }

</script> 

<table cellspacing=0 cellpadding=0 border=1> 
<tr id="r1"> 
    <td><input type="checkbox" name="rctrl" onclick="return setrow('r1')"></td>
    <td>text</td> 
</tr> 

<tr id="r2"> 
    <td><input type="checkbox" name="rctrl" onclick="return setrow('r2')"></td>
    <td>text</td> 
</tr> 

<tr id="r3"> 
    <td><input type="checkbox" name="rctrl" onclick="return setrow('r3')"></td>
    <td>text</td> 
</tr> 

<tr id="r4"> 
    <td><input type="checkbox" name="rctrl" onclick="return setrow('r4')"></td>
    <td>text</td> 
</tr> 
</table> 

<button type="button" onClick="display()">Click</button>

4

3 に答える 3

0

r* をキーとして使用して、各チェックボックスの値をオブジェクトに格納する方がはるかに簡単です。

var values = {};

function setrow(checkbox, row)
{ 
    values[row] = checkbox.checked;
} 


function display() {
    console.log(values);  
}​

例: http://jsfiddle.net/4TjhZ/

于 2012-10-19T01:19:52.793 に答える
0

いくつかの問題があります。

  1. values呼び出すたびに配列を空の配列に設定していますsetrow()
  2. ループを 1 から開始しているため、最初の配列項目を反復処理することはありません。
  3. このpop()メソッドは、配列内の最後の項目を自動的に削除します。使用しているようなパラメーターは必要ありません。spliceメソッドを使用する必要があります。splice(i, 1)
  4. ステートメントでは、 (setter)の代わりにor (比較として)ifを使用する必要があります。======
于 2012-10-19T01:38:39.740 に答える
0

いくつかのコメント:

var values = new Array();

ほとんどの場合、入力する必要が少なく、コンストラクターが混乱する可能性があるため、配列リテラルを使用します。

var values = [];

.

function setrow(row)
{ 
    values = [];

おっと、新しい配列インスタンスを値に割り当てました。

    for (var i = 1; i < 5; i++) {
        if (values[i] = row) {
           values.pop(i);

pop引数を取らず、配列の最後のメンバーを削除して返すだけです。

おそらく、チェックされた行の配列が必要なので、テーブルにクリックリスナーを配置して、クリックが発生するたびに配列を更新しないでください。

<table onclick="updateArray(this);" ...>

次に関数:

var values;
function updateArray(table) {
  var arr = [];
  var rctrls = document.getElementsByName('rctrl');
  var el, row;

  for (var i=0, iLen=rctrls.length; i<iLen; i++) {
    el = rctrls[i];

    if (el.checked) {
      arr.push(el.parentNode.parentNode);
    }
  }
}

もう少し洗練された、入力から最初の行要素までの関数を使用できます。

function upTo(el, tagName) {
  tagName = tagName.toLowerCase();
  var el;
  do {
    el = el.parentNode;
    if (el.tagName.toLowerCase() == tagName) {
      return el;
    }
  } while (el.parentNode)
}

次に、次のようにします。

    if (el.checked) {
      row = upTo(el, 'tr');
      if (row) {
        arr.push(row);
      }
    }
于 2012-10-19T01:56:06.867 に答える