Foros del Web » Programando para Internet » Javascript »

onChange en filas dinámicas no funciona

Estas en el tema de onChange en filas dinámicas no funciona en el foro de Javascript en Foros del Web. Bueno, acudo a ustedes a ver si me pueden dar una mano, ya que estoy trabado y no veo el error. Tengo un formulario con ...
  #1 (permalink)  
Antiguo 19/05/2009, 09:58
Avatar de educlon  
Fecha de Ingreso: octubre-2003
Ubicación: Buenos Aires
Mensajes: 35
Antigüedad: 20 años, 6 meses
Puntos: 0
Exclamación onChange en filas dinámicas no funciona

Bueno, acudo a ustedes a ver si me pueden dar una mano, ya que estoy trabado y no veo el error.

Tengo un formulario con una fila de controles. Cada fila está compuesta por 1 select y dos inputs.

Cuando pulso el botón "Agregar Producto" se van agregando filas dinámicamente, y en cada fila aparecen los 3 controles que me permiten seleccionar un producto, ingresar la cantidad y el precio.

El select se llena con los productos desde una BD. Necesito que al seleccionar un producto, se ejecute onChange y me muestre el precio en el tercer input. Estuve tratando pero el código no me funciona.

El javascript que utilizo es este:


Código Javascript:
Ver original
  1. var indiceFilaForm=1;
  2. function agregarProducto()
  3. {
  4.     myNewRow = document.getElementById("tablaProducto").insertRow(-1);
  5.     myNewRow.id=indiceFilaForm;
  6.     myNewCell=myNewRow.insertCell(-1);
  7.     myNewCell.innerHTML="<select name='vid_producto["+indiceFilaForm+"]' onchange='cambia_precio("+indiceFilaForm+")' >{/literal}{$marprod_list}{literal}</select>";
  8.     myNewCell=myNewRow.insertCell(-1);
  9.     myNewCell.innerHTML="Cant.<input type=text name='vcantidad["+indiceFilaForm+"]' size='3' value='1' style='text-align:center;' />";
  10.     myNewCell=myNewRow.insertCell(-1);
  11.     myNewCell.innerHTML="u$s<input type=text name='vprecio["+indiceFilaForm+"]' id='vprecio' size='6' style='text-align:right;' />";
  12.     myNewCell=myNewRow.insertCell(-1);
  13.     myNewCell.innerHTML="<input type='button'  value='Quitar' onclick='quitarProducto(this)'>";
  14.     myNewCell=myNewRow.insertCell(-1);
  15.     myNewCell.innerHTML="";
  16.     myNewCell=myNewRow.insertCell(-1);
  17.     myNewCell.innerHTML="";
  18.     indiceFilaForm++;
  19. }
  20.  
  21. function quitarProducto(obj)
  22. {
  23.     var oTr = obj;
  24.     while(oTr.nodeName.toLowerCase()!='tr')
  25.     {
  26.         oTr=oTr.parentNode;
  27.     }
  28.     var root = oTr.parentNode;
  29.     root.removeChild(oTr);
  30. }
  31.  
  32. // Precios de los productos
  33. var precio_1 = "45.00";
  34. var precio_2 = "90.00";
  35. var precio_3 = "75.00";
  36. var precio_5 = "220.00";
  37. ...
  38. var precio_35 = "200.00";
  39.  
  40. function cambia_precio(indice)
  41. {
  42.     var id_producto;
  43.     id_producto = document.f1.vid_producto[indice][document.f1.vid_producto[indice].selectedIndex].value;
  44.     if (id_producto != "")
  45.     {
  46.         mi_precio = eval("precio_" + id_producto);
  47.         document.f1.vprecio[indice].value = mi_precio;
  48.         document.f1.vprecio[indice].text = mi_precio;
  49.     }
  50.     else
  51.     {
  52.         document.f1.vprecio[indice].value = "";
  53.         document.f1.vprecio[indice].text = "";
  54.     }
  55. }

Los var precio_1 a precio_35 se arman desde PHP.
Los
Código:
{literal}{/literal}
aparecen porque utilizo SMARTY, y el el javascript me imprimen los option del select con los productos, eso esta andando bien.

En definitiva, las filas se agregan bien, y los controles quedan bien indexados, pero no logro hacer que aparezca el precio dentro del tercer input.

Si alguien me puede decir donde está el error, se lo voy a agradecer, ya que yo no lo puedo ver aun.

Desde ya mil gracias...

Eduardo

Última edición por educlon; 19/05/2009 a las 11:07
  #2 (permalink)  
Antiguo 19/05/2009, 11:24
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: onChange en filas dinámicas no funciona

el problema es que los nombre de los inputs estan compuesto de la forma "vprecio[1]", "vprecio[2]", etc. luego en javascript no se puede usar el nombre en la sintaxis de punto como en la siguiente linea document.f1.vprecio[indice].value = mi_precio; javascript interpreta la porcion en azul como un objeto indexado, es decir, un array o coleccion de nodos o coleccion de elementos. sin embargo, ese no es tu caso.

para solucionarlo tienes que cambiar la sintaxis a la siguiente forma: document.f1['vprecio' + indice].value = mi_precio; es decir, f1[nombre_input] donde nombre_input es un string.
  #3 (permalink)  
Antiguo 19/05/2009, 12:11
Avatar de educlon  
Fecha de Ingreso: octubre-2003
Ubicación: Buenos Aires
Mensajes: 35
Antigüedad: 20 años, 6 meses
Puntos: 0
Respuesta: onChange en filas dinámicas no funciona

Excelente, muchas gracias ZEROKILLED, hice lo que me comentaste y funcionó, la verdad no sabía que no se podía usar el índice en este caso. Voy a investigar mas este asunto. Para el que lo desee, dejo el codigo completo con tres items de menu:

Código javascript:
Ver original
  1. var indiceFilaForm=1;
  2. function agregarProducto()
  3. {
  4.     myNewRow = document.getElementById("tablaProducto").insertRow(-1);
  5.     myNewRow.id=indiceFilaForm;
  6.     myNewCell=myNewRow.insertCell(-1);
  7.     myNewCell.innerHTML="<select name='vid_producto_"+indiceFilaForm+"' onchange='cambia_precio("+indiceFilaForm+")' ><option value=1>AirLink - PCI AIR LINK N (u$s 45.00)</option><option value=2>American Tourister - FUNDAS TELA AVION (u$s 8.00)</option><option value=3>Case Logic - CASE LOGIC (u$s 36.00)</option></select>";
  8.     myNewCell=myNewRow.insertCell(-1);
  9.     myNewCell.innerHTML="Cant.<input type=text name='vcantidad_"+indiceFilaForm+"' size='3' value='1' style='text-align:center;' />";
  10.     myNewCell=myNewRow.insertCell(-1);
  11.     myNewCell.innerHTML="u$s<input type=text name='vprecio_"+indiceFilaForm+"' id='vprecio' size='6' style='text-align:right;' />";
  12.     myNewCell=myNewRow.insertCell(-1);
  13.     myNewCell.innerHTML="<input type='button'  value='Quitar' onclick='quitarProducto(this)'>";
  14.     myNewCell=myNewRow.insertCell(-1);
  15.     myNewCell.innerHTML="";
  16.     myNewCell=myNewRow.insertCell(-1);
  17.     myNewCell.innerHTML="";
  18.     indiceFilaForm++;
  19. }
  20.  
  21. function quitarProducto(obj)
  22. {
  23.     var oTr = obj;
  24.     while(oTr.nodeName.toLowerCase()!='tr')
  25.     {
  26.         oTr=oTr.parentNode;
  27.     }
  28.     var root = oTr.parentNode;
  29.     root.removeChild(oTr);
  30. }
  31.  
  32. // Precios de los productos
  33.  
  34. var precio_1="23.00";
  35. var precio_2="120.00";
  36. var precio_3="54.00";
  37.  
  38. function cambia_precio(indice)
  39. {
  40.     var id_producto;
  41.     id_producto = document.f1['vid_producto_' + indice][document.f1['vid_producto_' + indice].selectedIndex].value;
  42.     if (id_producto != "")
  43.     {
  44.         mi_precio = eval("precio_" + id_producto);
  45.         document.f1['vprecio_' + indice].value = mi_precio;
  46.         document.f1['vprecio_' + indice].text = mi_precio;
  47.     }
  48.     else
  49.     {
  50.         document.f1['vprecio_' + indice].value = "";
  51.         document.f1['vprecio_' + indice].text = "";
  52.     }
  53. }


Código HTML:
<table>
<tr class="tablerow1">
	<td width="10%"><b>Articulos</b></td>
	<td width="90%">
		<table cellpadding='3' cellspacing='3' style='border:#999999' id="tablaProducto">
			<tr bgColor='#CCCCCC'></tr>
		</table>
		<input type="button" onClick="agregarProducto()" value="Agregar Producto" >
	</td>
</tr>
<table> 
Espero que les sirva

Mil gracias y saludos...

Eduardo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:17.