将onclick事件添加到表行

时间:2009-07-30 17:00:50

标签: javascript html dom javascript-events

我正在尝试通过Javascript将onclick事件添加到表格行。

function addRowHandlers() {
    var table = document.getElementById("tableId");
    var rows = table.getElementsByTagName("tr");
    for (i = 1; i < rows.length; i++) {
        row = table.rows[i];
        row.onclick = function(){
                          var cell = this.getElementsByTagName("td")[0];
                          var id = cell.innerHTML;
                          alert("id:" + id);
                      };
    }
}

这在Firefox中可以正常工作,但在Internet Explorer(IE8)中,我无法访问表格单元格。我认为这在某种程度上与onclick函数中的“this”被识别为“Window”而不是“Table”(或类似的东西)这一事实有关。

如果我可以访问当前行,我可以在onclick函数中执行getElementById,我无法找到方法。有什么建议吗?

谢谢!

12 个答案:

答案 0 :(得分:34)

像这样。

function addRowHandlers() {
  var table = document.getElementById("tableId");
  var rows = table.getElementsByTagName("tr");
  for (i = 0; i < rows.length; i++) {
    var currentRow = table.rows[i];
    var createClickHandler = function(row) {
      return function() {
        var cell = row.getElementsByTagName("td")[0];
        var id = cell.innerHTML;
        alert("id:" + id);
      };
    };
    currentRow.onclick = createClickHandler(currentRow);
  }
}

修改

工作demo

答案 1 :(得分:3)

我认为对于IE,您需要使用Event object的srcElement属性。如果jQuery是您的选择,您可能需要考虑使用它 - 因为它为您抽象了大多数浏览器差异。示例jQuery:

$("#tableId tr").click(function() {
   alert($(this).children("td").html());
});

答案 2 :(得分:2)

以上是@redsquare和@SolutionYogi所讨论的纯粹的 Javascript 不是jQuery )解决方案的紧凑和清洁版本(re:添加适用于所有主要Web浏览器的onclick所有HTML表行的事件处理程序,包括最新的IE11:

function addRowHandlers() {
    var rows = document.getElementById("tableId").rows;
    for (i = 0; i < rows.length; i++) {
        rows[i].onclick = function(){ return function(){
               var id = this.cells[0].innerHTML;
               alert("id:" + id);
        };}(rows[i]);
    }
}
window.onload = addRowHandlers();

工作DEMO

注意:为了使其在IE8中工作,而不是this指针使用@redsquare建议的显式标识符,如function(myrow)。 最好的问候,

答案 3 :(得分:1)

头部卡在jq中太久了。这将有效。

function addRowHandlers() {
    var table = document.getElementById("tableId");
    var rows = table.getElementsByTagName("tr");
    for (i = 1; i < rows.length; i++) {
        var row = table.rows[i];
        row.onclick = function(myrow){
                          return function() { 
                             var cell = myrow.getElementsByTagName("td")[0];
                             var id = cell.innerHTML;
                             alert("id:" + id);
                      };
                  }(row);
    }
}

答案 4 :(得分:0)

尝试将this.getElementsByTagName("td")[0])行更改为row.getElementsByTagName("td")[0];。这应该捕获闭包中的row引用,它应该按预期工作。

编辑:以上是错误的,因为row是一个全局变量 - 正如其他人所说的那样,分配一个新变量然后在闭包中使用THAT。

答案 5 :(得分:0)

我的桌子位于另一个iframe中,所以我修改了 SolutionYogi 答案以便使用:

<script type="text/javascript">
window.onload = addRowHandlers;
function addRowHandlers() {
    var iframe = document.getElementById('myiframe');
    var innerDoc = (iframe.contentDocument) ? iframe.contentDocument : iframe.contentWindow.document;

    var table = innerDoc.getElementById("mytable");
    var rows = table.getElementsByTagName("tr");
    for (i = 0; i < rows.length; i++) {
        var currentRow = table.rows[i];
        var createClickHandler = 
            function(row) 
            {
                return function() { 
                                        var cell = row.getElementsByTagName("td")[0];
                                        var id = cell.innerHTML;
                                        alert("id:" + id);
                                 };
            }

        currentRow.onclick = createClickHandler(currentRow);
    }
}
</script>

答案 6 :(得分:0)

我试图选择一个表格行,以便可以轻松地将其复制到剪贴板然后粘贴到Excel中。以下是您的解决方案的一个小改编。

参考文献:

<!DOCTYPE html>
<html>
<body>

<div>
    <table id="tableId" border=1>
      <tbody>
        <tr><td>Item <b>A1</b></td><td>Item <b>B1</b></td></tr>
        <tr><td>Item <b>A2</b></td><td>Item <b>B2</b></td></tr>
        <tr><td>Item <b>A3</b></td><td>Item <b>B3</b></td></tr>
      </tbody>
    </table>
</div>

<script>
function addRowHandlers() {
    var table = document.getElementById("tableId");
    var rows = table.getElementsByTagName("tr");
    for (i = 0; i < rows.length; i++) {
        var currentRow = table.rows[i];
        var createClickHandler = 
            function(row) 
            {
                return function() { 
                                        var cell = row.getElementsByTagName("td")[0];
                                        var id = cell.innerHTML;

                                        var cell1 = row.getElementsByTagName("td")[1];
                                        var id2 = cell1.innerHTML;
                                        // alert(id + " - " + id2);
                                        window.prompt("Copy to clipboard: Ctrl+C, Enter", "<table><tr><td>" + id + "</td><td>" + id2 + "</td></tr></table>")
                                 };
            };

        currentRow.onclick = createClickHandler(currentRow);
    }
}
window.onload = addRowHandlers();
</script>
</body>
</html> 

答案 7 :(得分:0)

我是这样做的。我创建了一个带有thead和tbody标签的表。 然后通过id向tbody元素添加click事件。

<script>
    document.getElementById("mytbody").click = clickfunc;
    function clickfunc(e) {
        // to find what td element has the data you are looking for
        var tdele = e.target.parentNode.children[x].innerHTML;
        // to find the row
        var trele = e.target.parentNode;
    }
</script>
<table>
    <thead>
        <tr>
            <th>Header 1</th>
            <th>Header 2</th>
        </tr>
    </thead>
    <tbody id="mytbody">
        <tr><td>Data Row</td><td>1</td></tr>
        <tr><td>Data Row</td><td>2</td></tr>
        <tr><td>Data Row</td><td>3</td></tr>
    </tbody>
</table>

答案 8 :(得分:0)

简单的方法是按以下方式生成代码:

<!DOCTYPE html>
<html>
<head>

<style>
  table, td {
      border:1px solid black;
  }
</style>

</head>
<body>
<p>Click on each tr element to alert its index position in the table:</p>
<table>
  <tr onclick="myFunction(this)">
    <td>Click to show rowIndex</td>
  </tr>
  <tr onclick="myFunction(this)">
    <td>Click to show rowIndex</td>
  </tr>
  <tr onclick="myFunction(this)">
    <td>Click to show rowIndex</td>
  </tr>
</table>

<script>
  function myFunction(x) {
      alert("Row index is: " + x.rowIndex);
  }
</script>

</body>
</html>

答案 9 :(得分:0)

虽然大多数答案是SolutionYogi答案的副本,但它们都错过了一项重要检查,以查看'cell'是否不为null,如果单击标题,将返回错误。 因此,这是包含支票的答案:

function addRowHandlers() {
  var table = document.getElementById("tableId");
  var rows = table.getElementsByTagName("tr");
  for (i = 0; i < rows.length; i++) {
    var currentRow = table.rows[i];
    var createClickHandler = function(row) {
      return function() {
        var cell = row.getElementsByTagName("td")[0];
        // check if not null
        if(!cell) return; // no errors! 
        var id = cell.innerHTML;
        alert("id:" + id);
      };
    };
    currentRow.onclick = createClickHandler(currentRow);
  }
}

答案 10 :(得分:0)

selectRowToInput();
function selectRowToInput(){
var table = document.getElementById("table");
var rows = table.getElementsByTagName("tr");
for (var i = 0; i < rows.length; i++)
{
    var currentRow = table.rows[i];
    currentRow.onclick = function() {

       rows=this.rowIndex;
        console.log(rows);  
    };
}

}

答案 11 :(得分:0)

我试图弄清楚如何使用纯JS获得更好的结果,并且得到以下结果:

演示https://jsfiddle.net/f5r3emjt/1/

const tbody = document.getElementById("tbody");
let rowSelected;

tbody.onclick = (e) => {
  for (let i = 0; i < e.path.length; ++i) {
    if (e.path[i].tagName == "TR") {
      selectRow(e.path[i]);
      break;
    }
  }
};

function selectRow(r) {
  if (rowSelected !== undefined) rowSelected.style.backgroundColor = "white";

  rowSelected = r;
  rowSelected.style.backgroundColor = "dodgerblue";
}

现在您可以在所需的其他函数中使用变量 rowSelected 或在设置样式后调用另一个函数