Foros del Web » Programando para Internet » Javascript »

Echadme una manita...

Estas en el tema de Echadme una manita... en el foro de Javascript en Foros del Web. veréis.... tengo algún fallo en el siguiente script, y llevo días siendo incapaz de solucionarlo... Tampoco estoy muy metido en javascript. Os pongo en materia ...
  #1 (permalink)  
Antiguo 29/11/2009, 10:03
 
Fecha de Ingreso: noviembre-2009
Mensajes: 19
Antigüedad: 14 años, 5 meses
Puntos: 1
Echadme una manita...

veréis.... tengo algún fallo en el siguiente script, y llevo días siendo incapaz de solucionarlo... Tampoco estoy muy metido en javascript.

Os pongo en materia para que os sea más facil entenderlo:

Dos frames:
-En el primero tenemos un botón desactivado que hace submit a un formulario del otro frame.
-En el segundo, un formulario formado por X checkbox, de nombres "títuloN" (donde N es un número entre 1 y X -el num_rows de consulta-). Al pinchar sobre un checkbox el boton del primer frame se activa. Si todos los checkbox vuelven a estar desactivados, el boton se desactiva.

Os paso el código relativo a esto, espero que encontréis las soluciones que yo no puedo.

<!-- La llamada a la función javascript: j=mysql_num_rows i=numero actual-->
<input type="checkbox" value="<?php echo $row['titulo'];?>" name="titulo<?php echo $i;?>" onClick="cambiar_boton(<?php echo $j;?>;<?php echo $i;?>)">


function cambiar_boton(numtot, numact)
{

var desactivar = true;
//PARA ACTIVAR
if(window.document.formu1.titulo+numact+.checked == true){
window.parent.izq.document.formu.botoncomprar.disa bled= false;
window.parent.izq.document.formu.botoncomprar.colo r= 0x000000;
}

//PARA DESACTIVAR CUANDO SE QUITA SELECCION A UN CHECKBOX
for (var i=0; i<=numtot; i++){

if(window.document.formu1.titulo+i+.checked == true){
desactivar= false;
}
}
if(desactivar==true){
window.parent.izq.document.formu.botoncomprar.disa bled= true;
window.parent.izq.document.formu.botoncomprar.colo r= 0x848484;
}
}

//PARA DESACTIVAR CUANDO ENTRA A VISTAS ESPECÍFICAS
function desactivar_boton()
{
window.parent.izq.document.formu.botoncomprar.disa bled= true;
}

</script>




En imagen, que se ve mejor:
img6.imageshack.us/img6/8826/javascriptz.jpg
  #2 (permalink)  
Antiguo 29/11/2009, 12:18
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: Echadme una manita...

opino que hay que rehacer todo tu codigo porque tu codigo no se puede corregir con pocos cambios. basicamente lo que se necesita es verificar el estado de todos los checkbox, si al menos uno esta marcado se habilita el boton, de lo contrario se inhabilita. en la siguiente funcion le pasas dos argumentos: la coleccion de checkbox y la referencia del boton.
Código:
function enableDisable(collection, control){
for(var i = 0; collection[i]; i++) if(collection[i].checked){ // si al menos uno esta marcado;
control.disabled = false;
return; // salir del bucle y funcion ya que no es necesario verificar el resto de los checkbox;
}
control.disabled = true;
}
para implementarlo, la forma mas facil es tener todos los checboxes en un elemento contenedor, en este elemento defines el evento onclick. a la misma vez de este elemento vas a obtener la coleccion de checkboxes. el siguiente ejemplo muestra como se implementa.
Código:
<div onclick="enableDisable(this.getElementsByTagName('input'), document.getElementById('button'))">
<input type="checkbox" ... />
<!-- mas de un checkbox -->
</div>
con este ejemplo no tienes que repetir la funcion en cada checkbox. la porcion en rojo varia segun como debes obtener la referencia del boton. por ejemplo en tu caso podria ser algo como parent.document.form_name.submit_name.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 29/11/2009, 14:30
 
Fecha de Ingreso: noviembre-2009
Mensajes: 19
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Echadme una manita...

Bien bien, he captado perfectamente el script JS y el envío de la info desde el div (que nunca había usado así), pero aún me queda una duda: cómo acoto los checkbox con el div? Es decir, donde lo ubico?

mi código html-php es algo así....

Cita:
while ($row= mysql_fetch_assoc($consulta)){
...
<input type="checkbox" ...>
...
...
...
}
No sé si he entendido bien, pero creo que me estás diciendo que lo ponga así:

Cita:
<div ...>
while ($row= mysql_fetch_assoc($consulta)){
...
<input type="checkbox" ...>
...
...
...
}
</div>
(esto no lo veo... el onclick afectaría practicamente a toda la pagina, y solo queremos sobre los checkbox)

Igual es una burrada, pero es posible meterlo dentro del loop poniendole id al div?

Cita:
while ($row= mysql_fetch_assoc($consulta)){
...
<div id="xxx"...>
<input type="checkbox" ...>
</div>
...
...
...
}
Gracias por tu pronta respuesta, por la anterior y por la siguietne, si la hay, de antemano. Quiero acabar ya con este sufrimiento llamado Proyecto de Fin de Carrera ^^
  #4 (permalink)  
Antiguo 29/11/2009, 14:58
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: Echadme una manita...

Cita:
No sé si he entendido bien, pero creo que me estás diciendo que lo ponga así:
Código:
<div ...>
while ($row= mysql_fetch_assoc($consulta)){
...
<input type="checkbox" ...>
...
}
</div>
es correcto, asi es como debe quedar.

Cita:
(esto no lo veo... el onclick afectaría practicamente a toda la pagina, y solo queremos sobre los checkbox)
no necesariamente a toda la pagina pero si a todo lo que esta contenido dentro del DIV. en todo caso, tambien se puede determinar donde se hizo click, de esa forma la funcion procede solo si fue "cliqueado" sobre un checkbox. esta vez necesitamos un tercer parametro para el objeto evento.
Código:
function enableDisable(collection, control, evt){
var evt = evt || event, elem = evt.target || evt.srcElement; // DOM or IE;
if(!(/^input$/i.test(elem.nodeName))) return; // si el elemento no es un INPUT abandonamos la funcion;
for(var i = 0; collection[i]; i++) if(collection[i].checked){
control.disabled = false;
return;
}
control.disabled = true;
}
al invocar la funcion, el tercer parametro literalmente tiene que ser event. algunos pensaran que dara error en todos los navegadores con excepcion de iexplorer. lo cierto es que no produce error debido al modelo de evento en los navegadores que soportan el modelo estandar. de todos modos, si produce problema la otra alternativa es arguments[0].

Cita:
Igual es una burrada, pero es posible meterlo dentro del loop poniendole id al div?
no me hace sentido el tener un DIV para cada INPUT. no se de que forma lo estes pensando, pero el ID tambien se lo puedes dar al INPUT por lo que no es explicitamente necesario crear un DIV para cada INPUT. aun asi, creo que estarias volviendo a la misma metodologia que inicialmente te planteabas, asignar el evento por cada elemento. si quieres hacerlo asi, pues no hay problema pero la forma de invocar la funcion es un tanto diferente.

la forma que te estoy planteando evita tener que crear multiples eventos para una cantidad de elementos que comparten una similitud, y al mismo tiempo le saco ventaja a las habilidades del DOM. el resultado es, menos codigo y mas facil de depurar.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 29/11/2009, 15:46
 
Fecha de Ingreso: noviembre-2009
Mensajes: 19
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Echadme una manita...

de todas formas.... me estoy dando cuenta de que da igual que el div afecte a toda la pantalla. tal y como tú lo pusiste, lo importante es si están activados o no los checkbox, no el click en sí.

Por eso mismo, voy a dejar lo del evento de lado... que entre que no me he enterado qué tengo que mandar de salida, que has dicho algo de compatibilidad de Exploradores (voy a presentar el proyecto en Chrome) y que la solución del principio es válida...

Me pongo a probarlo ya. Muchas gracias. Comento luego con los resultados.
  #6 (permalink)  
Antiguo 29/11/2009, 18:28
 
Fecha de Ingreso: noviembre-2009
Mensajes: 19
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Echadme una manita...

Hecho!!!!! Muchísimas gracias te debo una.


PDDDDDD:

Eyeyeyeyeyyyy una cosita de nada:

Tengo además, en esta pag, unas imagenes-link, las cuales al pinchar se abre otra pantalla en el frame y el botón debe volver al estado inactivo.

function disable(boton){

boton.disabled = true;
boton.style.color = "#848484";
}

<a href=... onclick="disable(parent.izq.document.formu.botonco mprar)"> ......... </a>

El tema es que he comprobado que no es un problema de fallos en el código, sino que es un problema de evento, porque he estado probando y funciona con onMouseOver. ¿Qué pasa? Onclick debería valer para links....

Última edición por roski; 29/11/2009 a las 19:42
  #7 (permalink)  
Antiguo 30/11/2009, 03:33
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: Echadme una manita...

es correcto, onclick tambien funciona para enlaces, en realidad para cualquier elemento. lo que sucede es que tu elemento es un enlace. cuando presionas sobre el suceden dos cosas: el evento onclick, y lo mas natural seguir la ruta de href. tienes que cancelar la accion por defecto, como ya se menciono, seguir la ruta href. para ello, al final del evento onclick agregas la sentencia return false; para cancelar la redireccion. supongo que de eso trata tu tema porque indicas que con onmouseover funciona bien.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #8 (permalink)  
Antiguo 30/11/2009, 08:43
 
Fecha de Ingreso: noviembre-2009
Mensajes: 19
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Echadme una manita...

He probado a meter la redirección dentro de la función JS y no tira.

Creo que el problema es otro: Estos links con imágenes están dentro del bucle y, por lo tanto, del div. Por un lado se ejecuta un onclick que ordena deshabilitar el boton a pesar de que haya checkbox activos y por otro el onclick que habilita el botón cada vez que pinchas dentro del div siemrpe y cuando haya algún checkbox activo. Creo que se mandan órdenes opuestas.
  #9 (permalink)  
Antiguo 30/11/2009, 09:44
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: Echadme una manita...

parece que habia leido mal . en ese caso, usa la segunda opcion que te ofreci, determinar en que elemento ocurre el evento onclick. de esa manera no te afecta el evento de las imagenes.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #10 (permalink)  
Antiguo 30/11/2009, 10:44
 
Fecha de Ingreso: noviembre-2009
Mensajes: 19
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Echadme una manita...

Cita:
Iniciado por zerokilled Ver Mensaje
parece que habia leido mal . en ese caso, usa la segunda opcion que te ofreci, determinar en que elemento ocurre el evento onclick. de esa manera no te afecta el evento de las imagenes.
claro!!!! aunque bueno, ayher la descarté por complejo.... ahora no me queda otro remedio que intentarlo. luego comento ;)
  #11 (permalink)  
Antiguo 01/12/2009, 03:23
 
Fecha de Ingreso: noviembre-2009
Mensajes: 19
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Echadme una manita...

He estado trasteando por internet, y he visto que los scripts JS se pueden poner en el body. (Lamento ser tan zopenco en el tema, pero hasta hace un par de semanas que he intentado eludir usarlo para el proyecto, hasta que fué simplemente ineludible).

Bueno, el tema es que se me ha ocurrido, a ver si es posible y no es una metedura máxima de pata, que cuando haga click en el enlace, no haya evento JS ni nada, que tan solo ejecute la redirección. Luego en el código de la página a la que ha redirigido (recordemos que sigue dentro del frame), poner como código lo siguiente:

<body>
<script language=JavaScript>
window.parent.izq.document.formu.botoncomprar.disa bled= true;
window.parent.izq.document.formu.botoncomprar.styl e.color = "#848484";
</script>

//CODIGO

</body>

De ser posible es reducir a lo más simple, dado que quiero que en al entrar ahí el botón compra se inhabilite de todas todas. Ojalá me confirmes que se puede, porque lo de meter parámetro evento no soy capaz de agarrarlo.


5 minutos después: Jojojooooo hecho! No sé por qué le tenía tanto miedo a JS, me lo voy a comer con patatas!!!!

Muchas gracias Zerokilled. Es más fácil programar que entender los planteamientos de los demás, y me parece que tú haces ambas genial. te daría más puntos de karma pero parece ser que tengo que esparcir más karma por el mundo antes jejeje.

Espero que sea la última vez que acudo desesperado aquí. Saludos!!!!!!!

Última edición por roski; 01/12/2009 a las 03:42
  #12 (permalink)  
Antiguo 01/12/2009, 03:29
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: Echadme una manita...

si, se puede, y no es necesario que el codigo esté en el BODY, puede incluso ir en el HEAD y no habra problema. ahora bien, tendras que poner ese codigo en todas las paginas que dirigen los enlaces.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #13 (permalink)  
Antiguo 01/12/2009, 04:02
 
Fecha de Ingreso: noviembre-2009
Mensajes: 19
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Echadme una manita...

Cita:
Iniciado por zerokilled Ver Mensaje
si, se puede, y no es necesario que el codigo esté en el BODY, puede incluso ir en el HEAD y no habra problema. ahora bien, tendras que poner ese codigo en todas las paginas que dirigen los enlaces.
es 1, ya que todos los enlaces dirigen al mismo lugar, salvo que bajo distintos parámetros de entrada. muchas gracias de nuevo;)
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 05:40.