Para empezar, deberías evitar repetir elementos con el mismo
id
. El ejemplo de
mpozo te puede servir de guía ya que utiliza nombres a manera de arreglos de elementos. También puedes utilizar clases, pues, pueden repetirse. Fíjate, además, que estás intentando mostrar el contenido de un arreglo como texto de un elemento del DOM; eso no va a funcionar como esperas porque primero necesitas extraer la información y asignarla a cada elemento, lo cual también sería ineficiente puesto que repetirías el proceso para todas las filas cuando debería suceder solo en la fila en la que está ocurriendo el proceso.
Una forma en la cual haría esto sería, primero; agrupando a cada
tresillo de elementos (el del primer valor, el del segundo y el que mostrará el resultado) en filas, teniendo cada elemento una clase distinta a la de los otros dos pero igual a la de sus equivalentes en las demás filas. Enseguida, asociaría el evento
input
(se produce al ocurrir un cambio en el valor de un elemento
<input>
o
<textarea>
) al listado, de tal forma que, cuando se produzca, busquemos, mediante el
objeto del evento, a los tres elementos que necesitamos para realizar la operación. En el ejemplo adjunto, utilizo el método
.parentNode
para obtener a la fila entera. Finalmente, ya obtenidos los elementos, procedo a tomar el valor numérico que contengan (o cero, si no existe), para lo cual utilizo el operador
+
(puedes utilizar
otros operadores o métodos), y, por último, los sumo y asigno el resultado como valor del tercer elemento.
Código Javascript
:
Ver original"use strict";
var Sumas = {
load: function(){
!Sumas.list && (Sumas.list = this.querySelector("#list")); //Tomamos al listado si no se lo ha hecho antes
Sumas.list.addEventListener("input", Sumas.add, false); //Registramos el evento "input" en el listado
},
add: function(e){
var fila = e.target.parentNode.parentNode, //La fila en la cual está ocurriendo el proceso
d1 = fila.querySelector(".d1"), //El primer elemento
d2 = fila.querySelector(".d2"), //El segundo elemento
d3 = fila.querySelector(".d3"); //El elemento en donde se mostrará la respuesta
d3.value = +(d1.value || 0) + +(d2.value || 0); //Sumamos los valores y mostramos la suma
}
};
//Se ejecutará el método "Sumas.load" al terminar de cargar el árbol de elementos del documento
document.addEventListener("DOMContentLoaded", Sumas.load, false);
DEMO
El número de filas puede variar; incluso funcionará si añades o quitas filas en tiempo de ejecución.