Foros del Web » Programando para Internet » Javascript »

Array de objetos de formulario..

Estas en el tema de Array de objetos de formulario.. en el foro de Javascript en Foros del Web. Gente, perdon si esto que pregunto ya esta posteado, pero no lo pude encontrar todavia... El tema es que tengo que mostrar un listado de ...
  #1 (permalink)  
Antiguo 02/03/2006, 08:13
 
Fecha de Ingreso: enero-2003
Mensajes: 25
Antigüedad: 21 años, 4 meses
Puntos: 0
Pregunta Array de objetos de formulario..

Gente, perdon si esto que pregunto ya esta posteado, pero no lo pude encontrar todavia...

El tema es que tengo que mostrar un listado de productos, y por cada uno, debo habilitar 2 textfile, para que sea posible ingresar el precio y la cotizacion de la moneda.. (todo tiene que aparecer deshabilitado, y con un check debe habilitarse ese producto); de esta forma:

Código HTML:
<input type="checkbox" name="checkItem" value="checkbox" onClick="habilitarLinea()">
<input name="cotizacion" type="text" class="INPUT1" size="10" maxlength="10" onKeypress="validarSoloNros()" disabled="enabled" >
<input name="precio" type="text" class="INPUT1" value="0" size="10" maxlength="10" onKeypress="validarSoloNros()" disabled="enabled"> 
pero mi tema, que no lo pude encontrar aca, es como hago referencia en el metodo js a que quiero habilitar "esa" linea de producto (ya que ese codigo se va a repetir, ya que esta dentro de un bucle de codigo java..) y no otra.. para ello deberia manejar los campos con [] pero no tengo donde poder buscar material de referencia para hacerlo..

Código:
function habilitarLinea() {
	if (document.formulario.checkItem[].checked) {
		alert("mensaje");
		document.formulario.moneda.disabled=true;
		document.formulario.cotizacion[].disabled=true;
		document.formulario.precio[].disabled=true;        
	}
}
Quizas seria mas claro si pudiera adjuntar el archivo.. se puede?

gracias y saludos!!

Última edición por cgpampa; 02/03/2006 a las 08:27
  #2 (permalink)  
Antiguo 02/03/2006, 09:37
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola cgpampa:

Lo de adjuntar un archivo, tendrías que buscarlo en tu panel de control, pero dudo de que puedas... de todos modos, tendría que ser suficiente el código.

Cuando usas un campo con corchetes (supongo que por el CGI para recoger datos, puedes usar un índice... Tendrías que poner el nombre entre corchetes y entrecomillado, y detrás usar los corchetes del índice...

document.forma.tuFormulario["campo[]"][i]...

Si la explicación es insuficiente, pon algo más de código.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 02/03/2006, 09:58
 
Fecha de Ingreso: enero-2003
Mensajes: 25
Antigüedad: 21 años, 4 meses
Puntos: 0
hola Caricatos, gracias por responder!!
el tema es asi.. estoy programansdo en java, con jsp´s y servlets, y tengo que hacer un listado de presupuestos, donde "si se aprueba" el item (se clickea el checkbox de ese item) se debe poder ingresar el costo del mismo .. y pense en utilizar array de elementos, ya que me dijeron que era mas "facil" de controlarlos.......

ahora intente con esto, pero sigue sin funcionar..

Código:
function habilitarLinea() {
var x = 0;
for (x = 0; x <document.formulario; x++) {
	if (document.formulario.checkItem[x].checked) {
		alert("mensaje");
		document.formulario.moneda[x].disabled=true;
		document.formulario.cotizacion[x].disabled=true;
		document.formulario.precio[x].disabled=true;        
	}
}
}
y en el jsp tengo esto.. que se repite por cada producto..

Cita:
<TR>
<TD width=8% colspan="1" rowspan="2" align="center" valign="middle" class="lineaDetalle">
<input type="checkbox" name="checkItem" value="checkbox" onClick="habilitarLinea()">
</TD>
<TD width=15% colspan="1" class="lineaDetalle"><%=pr.getRubro()%></TD>
<TD width=26% colspan="1" class="lineaDetalle"><%=pr.getNombre()%></TD>
<TD width=23% colspan="1" class="lineaDetalle"><%=pr.getDescripcion()%></TD>
<TD colspan="2" class="lineaDetalle">
<%=cant%>
<input type="hidden" name="cantidad" value="<%=cant%>">
</TD>

</TR>
<TR>
<TD width=15% colspan="1" valign="middle" class="lineaDetalle">Moneda:
<select name="moneda[]" size=1 class="SELECT1" >
<option value="Euro">Euro</option>
<option value="Dolar">Dolar</option>
<option value="Peso">Peso</option>
</select>
<input type="hidden" name="moneda">
</TD>
<TD width=26% colspan="1" class="lineaDetalle" align="right">Cotizacion:
<input name="cotizacion[]" type="text" class="INPUT1" size="10" maxlength="10" onKeypress="validarSoloNros()" >
<input name="cotizacion[]" type="hidden">
</TD>
<TD width=23% colspan="1" class="lineaDetalle" align="right">Precio:
<input name="precio[]" type="text" class="INPUT1" value="0" size="10" maxlength="10" onKeypress="validarSoloNros()" >
<input name="precio" type="hidden">
</TD>
<TD colspan="2" class="lineaDetalle" align="right">SubTotal:
<input name="subtotal[]" type="text" class="INPUT1" value="0" size="10" maxlength="10">
<input name="subtotal" type="hidden">
</TD>
</TR>
  #4 (permalink)  
Antiguo 02/03/2006, 13:14
 
Fecha de Ingreso: enero-2003
Mensajes: 25
Antigüedad: 21 años, 4 meses
Puntos: 0
hola... al que lo lea..

ahora, con este codigo:

Código:
function habilitarLinea() {
var x = 0;
for (x = 0; x < document.formulario.checkItem.length; x++) {
	if (document.formulario.checkItem[x].checked ) {
		alert("x " +x);
		document.formulario.moneda[x].disabled=false;
		document.formulario.cotizacion[x].disabled=false;
		document.formulario.precio[x].disabled=false;        
	} else {
		document.formulario.moneda[x].disabled=true;
		document.formulario.cotizacion[x].disabled=true;
		document.formulario.precio[x].disabled=true;     
	}
}
}
me habilita deshabilita la linea, como yo lo deseo (de primera los campos aparecen deshabilitados) pero el tema es que si hay mas de una linea (varios precios,cotizaciones, etc) para el segundo que clickee, no me lo habilita/deshabilita.. porque???
  #5 (permalink)  
Antiguo 03/03/2006, 01:42
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Hola qué tal

te sugiero que para hacerlo accedas a los elementes mediante un id único que esté asociado con el checkbox.

Prueba con algo así

Código:
<% 
contador = 0 
//aquí comienza el bucle
%>
<TR>
<TD width=8% colspan="1" rowspan="2" align="center" valign="middle" class="lineaDetalle">
<input type="checkbox" name="checkItem" id="checkItem_<%=contador%>" value="checkbox" onClick="habilitarLinea(<%=contador%>)">
</TD> 
<TD width=15% colspan="1" class="lineaDetalle"><%=pr.getRubro()%></TD>
<TD width=26% colspan="1" class="lineaDetalle"><%=pr.getNombre()%></TD>
<TD width=23% colspan="1" class="lineaDetalle"><%=pr.getDescripcion()%></TD>
<TD colspan="2" class="lineaDetalle">
<%=cant%>
<input type="hidden" name="cantidad" value="<%=cant%>">
</TD>

</TR>
<TR>
<TD width=15% colspan="1" valign="middle" class="lineaDetalle">Moneda:
<select name="moneda[]" size=1 class="SELECT1" id="moneda_<%=contador%>>
<option value="Euro">Euro</option>
<option value="Dolar">Dolar</option>
<option value="Peso">Peso</option>
</select>
<input type="hidden" name="moneda">
</TD>
<TD width=26% colspan="1" class="lineaDetalle" align="right">Cotizacion:
<input name="cotizacion[]" id="cotizacion_<%=contador%>" type="text" class="INPUT1" size="10" maxlength="10" onKeypress="validarSoloNros()" >
<input name="cotizacion[]" type="hidden">
</TD>
<TD width=23% colspan="1" class="lineaDetalle" align="right">Precio:
<input name="precio[]"  id="precio_<%=contador%>" type="text" class="INPUT1" value="0" size="10" maxlength="10" onKeypress="validarSoloNros()" >
<input name="precio" type="hidden">
</TD>
<TD colspan="2" class="lineaDetalle" align="right">SubTotal: 
<input name="subtotal[]" type="text" class="INPUT1" value="0" size="10" maxlength="10">
<input name="subtotal" type="hidden">
</TD>
</TR>
<% contador++ %> 
y tu función js que quede así

Código:
function habilitarLinea(v) {
	if (document.getElementById('checkItem_ '+ v).checked ) {
		document.getElementById('moneda_' + v).disabled = false;
		document.getElementById('cotizacion_' + v).disabled = false;
		document.getElementById('precio_' + v).disabled = false;        
	} else {
		document.getElementById('moneda_' + v).disabled = true;
		document.getElementById('cotizacion_' + v).disabled = true;
		document.getElementById('precio_' + v).disabled = true;        
    
	}
}
No lo he probado pero debería funcionar
  #6 (permalink)  
Antiguo 03/03/2006, 07:10
 
Fecha de Ingreso: enero-2003
Mensajes: 25
Antigüedad: 21 años, 4 meses
Puntos: 0
De acuerdo

hola tunait y gracias por la ayuda!!! tu codigo solo tenia un errorcito, que era un espacio en blanco nomas!.. eso es saber!

ahora, unas consultas en relacion a lo que anda ahora.. veo que no trabajas con el name, sino con el id.. no es lo mismo?...
como es el trabajo con el elementbyid ese? qie he buscado en internet y no he podido encontrar una "definicion" de lo que hace..
otra, en el codigo yo "oculto" el valor de ese campo, para mandarlo al servlet de java.. entonces, a ese campo, lo debo llamar con name[] ? ..... aahhh no!.. al hidden tambien le sumo el valor del bucle!.. cierto!

----------------------------------
ahora agrego esto..
de que forma puedo hacer que con cada dato agregado, me vaya calculando el total?.. para una mejor idea, pongo el diseño actual..



yo habia pensado que al darle Enter en el precio, llamara a otra fuhncion, que calculara el subtotal.. pero el tema es que tambien debo sumarle el costo de envio al total general.. como se puede hacer eso sin agregar algun boton mas? siendo el que costo de envio se suma una sola vez al total general?

gracias por la ayuda!
saludos
Juan Pablo.

Última edición por cgpampa; 03/03/2006 a las 07:54
  #7 (permalink)  
Antiguo 03/03/2006, 09:38
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola:

Con el permiso de tunait (¡Hola !) voy a tratar de explicarte la diferencia entre name e id... "name es name" e "id es id"... ¡Je, je!

Verás id = identificador tiene que ser único en una página, pero el atributo name puede ser parte de una colección o array, y detrás puede llevar un índice si hay más de uno... pero fundamentalmente debes tener presente que los valores que se envían de un formulario tienen que tener definido un atributo name... solo existe la excepción de los input type=image que al ser del tipo submit (aunque sea una imagen) envían datos del posicionamiento del ratón (de esto no estoy muy seguro, pero casi)

Con los id's se usa para su referencia el método getElementBuId, cuyo parámetro es el propio id (hay que respetar la sintaxis)... y para los name's, solo valen los que forman parte de colecciones (imágenes, frames, formularios, elementos de formularios...)

Bueno... aunque no hayas encontrado referencias, en estos mismos foros podrás encontrar muchísimos ejemplos sobre su uso.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #8 (permalink)  
Antiguo 03/03/2006, 12:48
 
Fecha de Ingreso: enero-2003
Mensajes: 25
Antigüedad: 21 años, 4 meses
Puntos: 0
bueno gente.. se va aclarando un poco el camino.. gracias a todos!!
ahora, todo quedo asi:
Código:
<script language="JavaScript1.2"> 
<!--
function aprobPresup(pag){ 
    document.formulario.action= pag 
    document.formulario.submit() 
} 

function habilitarLinea(v) { 
	if (document.getElementById('checkItem_'+ v).checked ) { 
		document.getElementById('moneda_' + v).disabled = false; 
		document.getElementById('cotizacion_' + v).disabled = false; 
		document.getElementById('precio_' + v).disabled = false; 
		CalcularPrecio(v);
	} else { 
		document.getElementById('moneda_' + v).disabled = true; 
		document.getElementById('cotizacion_' + v).disabled = true; 
		document.getElementById('precio_' + v).disabled = true; 
		RestarSubtotal(v);
	} 
}

function CalcularPrecio(v) { 
	var valor1 = document.getElementById('cotizacion_' + v).value;
	var valor2 = document.getElementById('precio_' + v).value;
	var valor3 = document.getElementById('cantidad_' + v).value;
	var sum = (valor1 * valor2 * valor3);
	document.getElementById('subtotal_' + v).value = sum;
	document.getElementById('totalPresup').value = eval(document.getElementById('totalPresup').value) + sum;
}

function RestarSubtotal(v) { 
	var valor1 = document.getElementById('cotizacion_' + v).value;
	var valor2 = document.getElementById('precio_' + v).value;
	var valor3 = document.getElementById('cantidad_' + v).value;
	var sum = (valor1 * valor2 * valor3);
	document.getElementById('subtotal_' + v).value = sum;
	document.getElementById('totalPresup').value = eval(document.getElementById('totalPresup').value) - sum;
}

function SumarCostoEnvio() { 
	document.getElementById('totalPresup').value = eval(document.getElementById('totalPresup').value) + eval(document.getElementById('costoEnvio').value);
}

function RestarCostoEnvio() { 
	document.getElementById('totalPresup').value = eval(document.getElementById('totalPresup').value) - eval(document.getElementById('costoEnvio').value);
	document.getElementById('costoEnvio').value = 0;
	
}
function habilitarCosto() { 
	if (document.getElementById('checkCosto').checked ) { 
		document.getElementById('costoEnvio').disabled = false; 
//		CalcularPrecio(v);
	} else { 
		document.getElementById('costoEnvio').disabled = true; 
		RestarCostoEnvio();
	} 
}

function validarSoloNros(){
	var tecla = window.event.keyCode; 	// codigo de tecla.
	if ((tecla < 46 || tecla > 57) ||  	// si no es numero 
		(tecla == 47 )) {
		window.event.keyCode = 0; 		// anula la entrada de texto.
	}
}

function validardatos(formulario) {
//	var w = <%//=%>;
	for (var w = 0; w < formulario.checkAgItem.length; w++)
		if (formulario.checkAgItem[w].checked == true) {
	}
}

function validar() {
	if (reconfirmar() == true){ //((validardatos() == true) && 
		return true;
	} else {
		return false;
	}
}

function reconfirmar() {
	respuesta = confirm ("Registra el Presupuesto.\n¿Esta seguro?")
       if (respuesta) {     
            return true;
        }
        else {return false; }
}
-->
</script>
y en la parte del codigo html asi:

Código:
                      	for (int x = 0; iter.hasNext(); x++) {
                      	    PresupuestoItem lis = (PresupuestoItem) iter.next();
                      	    Item lis1 = lis.getUnItem();
		                    Producto pr = (Producto) lis1.getProducto();
		                    int cant = lis1.getCantidad();
					        monto = lis1.getProducto().getPrecio() + monto;
			          %>
			              <TR>
					        <TD width=8% colspan="1" rowspan="2" align="center" valign="middle" class="lineaDetalle">
								<input type="checkbox" name="checkItem_<%=x%>" id="checkItem_<%=x%>" value="checkbox" onClick="habilitarLinea(<%=x%>)">
							</TD>			              
					      	<TD width=15% colspan="1" class="lineaDetalle"><%=pr.getRubro()%></TD>
						    <TD width=26% colspan="1" class="lineaDetalle"><%=pr.getNombre()%></TD>
					        <TD width=23% colspan="1" class="lineaDetalle"><%=pr.getDescripcion()%></TD>
					        <TD colspan="2" class="lineaDetalle">
					        	<%=cant%>
					        	<input type="hidden" name="cantidad" id="cantidad_<%=x%>" value="<%=cant%>">
					        </TD>

					     </TR>
						 <TR>
					      	<TD width=15% colspan="1" valign="middle" class="lineaDetalle">Moneda:
                                <select name="moneda" size=1 class="SELECT1" id="moneda_<%=x%>" disabled="enabled">
                                    <option value="Euro">Euro</option>
                                    <option value="Dolar">Dolar</option>
                                    <option value="Peso">Peso</option>
                                </select>
                                <input type="hidden" name="monedagg">
                           </TD>
						    <TD width=26% colspan="1" class="lineaDetalle" align="right">Cotizacion:
                                <input name="cotizacion" id="cotizacion_<%=x%>" value="0" type="text" class="INPUT1" size="10" maxlength="10" onKeypress="validarSoloNros()" disabled="enabled">
                                <input name="cotizaciongg" type="hidden">
                           </TD>
					        <TD width=23% colspan="1" class="lineaDetalle" align="right">Precio:
					            <input name="precio" id="precio_<%=x%>" type="text" class="INPUT1" value="0" size="10" maxlength="10" onKeypress="validarSoloNros()" onblur="CalcularPrecio(<%=x%>)" disabled="enabled">
					            <input name="preciogg" type="hidden">
					       </TD>
					        <TD colspan="2" class="lineaDetalle" align="right">SubTotal: 
					            <input name="subtotal" id="subtotal_<%=x%>" type="text" class="INPUT1" value="0" size="10" maxlength="10" readonly="readonly">
					            <input name="subtotalgg" type="hidden">
					        </TD>
					      </TR>
					   <% } %>
						 <TR>
					      	<TD colspan="3" class="lineaDetalle"><div align="right"><strong class="encabezado1">Costo de Envío:</strong>
					      	        <input type="checkbox" name="checkCosto" id="checkCosto" onclick="habilitarCosto()">
					      	        <input name="costoEnvio" type="text" class="INPUT1" value=0 size="15" maxlength="15" onKeypress="validarSoloNros()" onblur="SumarCostoEnvio()" disabled="enabled">
					      	    </div>
					       </TD>
					 
					      	<TD colspan="2" class="lineaDetalle"><div align="right"><strong class="encabezado1">Importe Total:</strong>
					      	        <input name="totalPresup" id="totalPresup" type="text" class="INPUT1" value=0 size="15" maxlength="15">
					      	    </div></TD>
						    </TR>
                      </TABLE>
el tema ultimo ahora, son en realidad dos cosas..
1.) del lado del servlet, en java, d eque forma tomo los valores cuando tengo que recuperar los valores de la linea? Ya que al ser un SET de productos, estos no vendran ordenados.. en el orden en que se mostraron en la pagina.. AUXILIIIIIIIIOOOO!!!...

2.) Tenia el cursor en precio, y cambie de ventana a otro programa, cuando vengo.. me sumo ese mismo precio al total!!! porque el calculo lo mande a hacer en el onblur.. y despues lo hice a proposito.. y por cada vez que lo hacia.. seguia sumando el muy desgrac....!!!!
como puedo solucionar eso??

gracias a todos por la inmensa ayuda!!
buen fin de semana!!
JP.
  #9 (permalink)  
Antiguo 03/03/2006, 14:47
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 20 años, 9 meses
Puntos: 21
como recorrer el array atravez de name si el id lo ocupo para otras cosas

Hola amigos comom podria recorrer un array de un componete si en el name
tengo algo asi name="productos[]" y el id esta puesto pero tienen nombres difrentes en los componentes que se crean con dom como podria yo recorrer el array para hacer mis validaciones de que no vayan en blanco,etc

saludos
__________________
gerardo
  #10 (permalink)  
Antiguo 06/03/2006, 06:40
 
Fecha de Ingreso: enero-2003
Mensajes: 25
Antigüedad: 21 años, 4 meses
Puntos: 0
Cita:
Iniciado por chalchis
Hola amigos comom podria recorrer un array de un componete si en el name
tengo algo asi name="productos[]" y el id esta puesto pero tienen nombres difrentes en los componentes que se crean con dom como podria yo recorrer el array para hacer mis validaciones de que no vayan en blanco,etc

saludos
?
  #11 (permalink)  
Antiguo 06/03/2006, 09:22
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 20 años, 9 meses
Puntos: 21
recorrer el array del componente pero atravez del name

me refiero a recorrer el array del componente pero atravez del name
no usuando el id pero en el name tengo algo asi name="minombre[]"
Cita:
Iniciado por cgpampa
?
__________________
gerardo
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 21:08.