0

我对 JavaScript 真的很陌生,但我不知道为什么这个程序不起作用。
当我单击位于动态创建的表中的单元格中的动态创建的按钮时,我想要获取rowindex按钮所在行的 。

在此先感谢 - 这是我的代码:

<html>
    <head>
        <script>
            function whichrow(obj) {
                var par = obj.parentNode;
                while(par.nodeName.toLowerCase()! = 'tr') {
                    par = par.parentNode;
                }
                alert(par.rowIndex);
            }
        </script>
    </head>
    <body> 
        <script>
        mybody = document.getElementsByTagName("body")[0];
        mytable = document.createElement("table");
        mytablebody = document.createElement("tbody");
        for(var i = 0; i<5; i++) {
            mycurrent_row = document.createElement("tr"); 
            mycurrent_row.id = "row"+i;

            for(var j = 0; j<4; j++) {
                mycurrentcell = document.createElement("td");  
                currenttext = document.createTextNode("Row" + i + "Column" + j);
                mycurrentcell.appendChild(currenttext);
                mycurrent_row.appendChild(mycurrentcell);
            }   
            mybutoncell = document.createElement("td");
            but = document.createElement("button");
            mybutoncell.appendChild(but);

            mycurrent_row.appendChild(mybutoncell);

            mytablebody.appendChild(mycurrent_row);
            but.onClick = whichrow(this);
        }
        mytable.appendChild(mytablebody);
        mybody.appendChild(mytable);

        mytable.setAttribute("border", "2"); 
        </script>
    </body>
</html>                 
4

2 回答 2

1

好的,这里有几点需要注意。

在 javascript 事件系统中,系统根据发生的情况使用包含不同属性的事件对象调用您的回调。

所以,这里是错误:

  1. 当您分配给事件处理程序时,当您说but.onclick = whichrow(this)您正在设置 but.onclick 的结果时whichrow,这是undefined因为您无论如何都没有返回任何内容。当用户单击您的按钮时,它应该but.onclick = whichrow;会调用。whichrow传递的参数是一个MouseEvent对象。我提供的链接应该可以作为一个好的开始,以了解您可以使用哪些类型的属性。

  2. 我必须检查一下,因为我经常使用 el.addEventListeners,但onclick需要小写,而不是像你所做的那样使用 camelCase。

  3. 在事件回调中,this通常指的是被点击的元素,所以你应该使用它。

  4. 没有rowIndex财产。

现在,试图找到解决您问题的方法。rowIndex 可以通过遍历 dom 来收集。我不确定这将起到什么作用,因为无论如何您都是手动创建 DOM 并且已经知道 rowIndex,但如果它是未知的,这就是我要做的

function whichRow(e) {
  // here this should be the button.
  var curRow = this.parentElement.parentElement,
      rowIndex = 0;

  while(curRow) {
    curRow = curRow.previousElementChild; 
    rowIndex++;
  }

  return rowIndex;
}

我是在脑海中写下这篇文章,但重点是要给出主要思想。在上面的代码片段中,我采用了按钮父级的父级,因为这里是按钮部分的大致标记:

<tr>
  <td>
    <button></button>
  </td>
</tr>

因此,按钮元素的 parentElement 的 parentElement 应该为您提供<tr>. 然后我们将向后遍历,直到我们没有任何先前的元素,边计数。一旦前一个元素为空,则返回计数。

于 2012-12-27T15:15:53.437 回答
0

obj你传递给的whichrow()是一个按钮,我假设它在一个TD. 所以你的while循环将在它的第一次迭代中退出,导致par持有一个TD- 它没有一个名为的属性rowIndex

于 2012-12-27T15:07:54.000 回答