2009-07-30 30 views
22

Estoy tratando de agregar un evento onclick a una fila de la tabla a través de Javascript.Agregar un evento onclick a una fila de la tabla

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); 
         }; 
    } 
} 

Esto funciona como se esperaba en Firefox, pero en Internet Explorer (IE8) que no puede acceder a las celdas de la tabla. Creo que de alguna manera está relacionado con el hecho de que "esto" en la función onclick se identifica como "Ventana" en lugar de "Tabla" (o algo así).

Si pudiera acceder a la fila actual podría realizar un getElementById en la función onclick por no puedo encontrar una manera de hacerlo. ¿Alguna sugerencia?

Gracias!

+0

Usted debe comenzar con el índice 0 (var i = 0;) y no 1. – SolutionYogi

Respuesta

30

Algo como esto.

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); 
    } 
} 

EDITAR

Trabajando demo.

+2

que no funciona debido a esto http://stackoverflow.com/questions/454517/javascript-onclick-problem- with-table-rows –

+0

¿Estás seguro? Funciona. Verifique el enlace de demostración de trabajo en mi respuesta actualizada. Además, en su código, comenzó el índice con 1 en lugar de 0. No adjuntará el controlador a la primera fila. – SolutionYogi

+0

Funciona, pero cuando vi tu solución fue un poco diferente de lo que es ahora ... = P Estoy muy agradecido, ¡me he estado dando vueltas toda la tarde! –

1

Cabeza atascada en jq durante demasiado tiempo. Esto funcionará

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); 
    } 
} 
+0

¿Esto funcionaría? Publiqué el mismo ejemplo pero creo que la 'fila' dentro del onlcick siempre se referirá a la última fila. ¿No es así? [JavaScript solo tiene un alcance de función, sin ámbito de bloques.] – SolutionYogi

+0

Sí, eso no funciona debido al alcance, la fila es una variable global ... –

+0

Lo sé, jQuery hace todo esto tan fácil, cuando te quedas sin jQuery, ¡comete todos los errores tontos! :) – SolutionYogi

2

pienso para IE que tendrá que utilizar la propiedad srcElemento del Event object. si jQuery es una opción para usted, le recomendamos que la use, ya que abstrae la mayoría de las diferencias de navegador para usted. Ejemplo jQuery:

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

Simplemente devuelve el primer elemento (primer td) .. –

0

Intente cambiar la línea this.getElementsByTagName("td")[0]) para leer row.getElementsByTagName("td")[0];. Eso debería capturar la referencia row en un cierre, y debería funcionar como se esperaba.

Editar: Lo anterior es incorrecto, ya que la fila es una variable global, como han dicho otros, asigne una nueva variable y luego use ESO en el cierre.

+0

Eso no funcionaría. fila solo se referirá a la última fila. – SolutionYogi

+0

Tiene toda la razón, no noté que la fila era global. –

0

Mi mesa está en otro iframe por lo modifiqué SolutionYogi respuesta a trabajar con eso:

<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> 
1

Aquí es un compacto y una versión poco más limpia de la misma pura Javascript (no es un jQuery) solución como se discutió anteriormente por @redsquare y @SolutionYogi (re: agregar controladores de eventos onclick a todas las filas de tablas HTML) que funciona en todos los principales navegadores web, incluido el último 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(); 

Trabajando DEMO

Nota: con el fin de hacer que funcione en IE8, así, en lugar de this uso puntero del identificador explícito como function(myrow) según lo sugerido por @redsquare. Saludos cordiales,

0

Estaba tratando de seleccionar una fila de la tabla, para que se pueda copiar fácilmente en el portapapeles y luego pegarla en Excel. A continuación hay una pequeña adaptación de su solución.

Referencias:

<!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> 
0

Aquí es cómo hacer esto. Creo una tabla con etiquetas thead y tbody. Y luego agregue un evento de clic al elemento tbody mediante id.

<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> 
Cuestiones relacionadas