¿Ineficiente? Tampoco es para tanto ¿no? Bueno, si es una tabla interminable podrías recorrerla al principio poco a poco (controlando con setInterval) e ir asignando a cada celda un atributo donde guardes el número de fila. Así será mas "eficiente" (no, pero será más relajado).
No se me ocurre ninguna manera de saber el número de fila sin utilizar un bucle para saber el nodo en el que nos encontramos.
He intentado una cosa que se basa en encontrar el contenido de la celda en el innerHTML de la tabla. Entonces coger el segmento de código antes de la celda, y contar el número de tr que aparecen. El problema es que si hay dos celdas con el mismo contenido, hay que hacer más comprobaciones (se puede hacer...):
Código PHP:
<table border="1">
<tbody>
<tr>
<td onclick="alert( queFilaSoy(this) );">lorem</td>
<td onclick="alert( queFilaSoy(this) );">ipsum</td>
<td onclick="alert( queFilaSoy(this) );">dolor</td>
<td onclick="alert( queFilaSoy(this) );">sit</td>
</tr>
<tr>
<td onclick="alert( queFilaSoy(this) );">amet</td>
<td onclick="alert( queFilaSoy(this) );">consteteur</td>
<td onclick="alert( queFilaSoy(this) );">hola</td>
<td onclick="alert( queFilaSoy(this) );">que</td>
</tr>
<tr>
<td onclick="alert( queFilaSoy(this) );">tal</td>
<td onclick="alert( queFilaSoy(this) );">mañana</td>
<td onclick="alert( queFilaSoy(this) );">como</td>
<td onclick="alert( queFilaSoy(this) );">muy</td>
</tr>
<tr>
<td onclick="alert( queFilaSoy(this) );">pronto</td>
<td onclick="alert( queFilaSoy(this) );">el</td>
<td onclick="alert( queFilaSoy(this) );">cardillo</td>
<td onclick="alert( queFilaSoy(this) );">que</td>
</tr>
</tbody>
</table>
<script type="text/javascript">
function queFilaSoy( celda ) {
// innerHTML de la tabla
tablaInnerHTML = celda.parentNode.parentNode.innerHTML;
// parte de innerHTML de la tabla antes de nuestra celda
antesInnerHTML = tablaInnerHTML.substring(0, tablaInnerHTML.indexOf(">"+celda.innerHTML+"</"));
// partimos ese string por <tr>, así tendremos la cantidad de partes (cantidad de "<tr>" que hay)
soyFila = antesInnerHTML.split(/<tr>/i).length;
// devolvemos soyFila menos una unidad porque queremos que la primera fila sea 0
return soyFila-1;
}
</script>
Como ves funciona, pero si se repite el contenido (como en la última celda) habría que buscar más inteligentemente
. Y eso nos llevaría más código y más complejidad... De rendimiento con una tabla de 10000 filas no sé cómo andaría, pero yo no se si te merece la pena.
¿De qué problema hablamos?