Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Problema con evento: tengo que dar 2 clic para que funcione!

Estas en el tema de Problema con evento: tengo que dar 2 clic para que funcione! en el foro de Javascript en Foros del Web. Hola, hola! Tengo un pequeño script que hace que cuando le das clic a un div A , aparece un div A-bis . Y cuando ...
  #1 (permalink)  
Antiguo 26/06/2014, 06:02
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Problema con evento: tengo que dar 2 clic para que funcione!

Hola, hola!

Tengo un pequeño script que hace que cuando le das clic a un div A, aparece un div A-bis. Y cuando le das clic a un div B, aparece un div B-bis y se esconde el div A-bis.

La cosa funciona bien la primera vez que das clic en los div A y B. Pero si vuelves a dar clic en A ó B, la cosa ya no funciona con un solo clic, hay que dar otro.

Ver script aquí.

¿Por qué?

Saludos!

Última edición por berkeleyPunk; 26/06/2014 a las 06:08
  #2 (permalink)  
Antiguo 26/06/2014, 07:07
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Problema con evento: tengo que dar 2 clic para que funcione!

berkeleyPunk: amigo sin el codigo dificil ayudarte (colocalo por favor)


EDIT: no vi tu enlace.... no me los muestra mi personalizacion del browser
__________________
Salu2!
  #3 (permalink)  
Antiguo 26/06/2014, 07:20
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema con evento: tengo que dar 2 clic para que funcione!

Te complicas mucho la vida no???

Código Javascript:
Ver original
  1. function mostrar_ocultar(ID){
  2. var divs = Array("div1","div2");
  3. var IDa=ID;
  4. var IDb="";
  5. if(divs[0]==ID){
  6.    IDb=divs[1];
  7. }else{
  8.    IDb=divs[0];
  9. }
  10. if(document.getElementById(IDa+"b").style.display==""){
  11.      document.getElementById(IDa+"b").style.display="none";
  12. }else{
  13.      document.getElementById(IDa+"b").style.display="";
  14. }
  15.     document.getElementById(IDb+"b").style.display="none";
  16. }


Código HTML:
Ver original
  1. <div id="div1" onclick='mostrar_ocultar(this.id)' style="clear:both">
  2.                 Click aquí 1
  3.         </div>
  4.         <div id="div1b" style="display:none">
  5.             Lorem ipsum ad his scripta blandit partiendo, eum fastidii accumsan euripidis in, eum liber hendrerit an. Qui ut wisi vocibus suscipiantur, quo dicit ridens inciderint id. Quo mundi lobortis reformidans eu, legimus senserit definiebas an eos.
  6.         </div>
  7.  
  8. <!-- ............................. -->
  9.  
  10.         <div id="div2" onclick="mostrar_ocultar(this.id)" style="clear:both">
  11.                 Click aquí 2
  12.         </div>
  13.         <div id="div2b" style="display:none">
  14.             Lorem ipsum ad his scripta blandit partiendo, eum fastidii accumsan euripidis in, eum liber hendrerit an. Qui ut wisi vocibus suscipiantur, quo dicit ridens inciderint id. Quo mundi lobortis reformidans eu, legimus senserit definiebas an eos.
  15.         </div>

Mi ejemplo lo hace cambiando el style, pero lo podrias hacer cambiando el class (usando un visible y otro no visible)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #4 (permalink)  
Antiguo 26/06/2014, 08:10
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Problema con evento: tengo que dar 2 clic para que funcione!

Ya... y con respetando las "transiciones" que con display:none no se respetan:

http://jsfiddle.net/boctulus/gg3Az/2/

Código Javascript:
Ver original
  1. <style>
  2. .testWrapper {
  3.     width: 400px;
  4.     height: auto;
  5.     background: #272727;
  6.     overflow: visible;
  7.     padding: 50px;
  8.     color: white;
  9. }
  10. .div_1b_y2b {
  11.     position: relative;
  12.     left: 10.3%;
  13.     width: 79%;
  14.     border: 1px solid white;
  15.     overflow: hidden;
  16.     -webkit-transition: all ease 1s;
  17. }
  18.  
  19. #div1b,#div2b {height: 0px;}
  20.  
  21. </style>
  22.  
  23. <div class="testWrapper">
  24.  
  25.         <div id="div1a" onclick="toogle(this,'div2a');">
  26.             <div>
  27.                 Click aquí 1
  28.             </div>
  29.         </div>
  30.        
  31.         <div id="div1b" class="div_1b_y2b">
  32.             Lorem ipsum ad his scripta blandit partiendo, eum fastidii accumsan euripidis in, eum liber hendrerit an. Qui ut wisi vocibus suscipiantur, quo dicit ridens inciderint id. Quo mundi lobortis reformidans eu, legimus senserit definiebas an eos.
  33.         </div>
  34.  
  35. <!-- ............................. -->
  36.  
  37.         <div id="div2a" onclick="toogle(this,'div1a');">
  38.             <div>
  39.                 Click aquí 2
  40.             </div>
  41.         </div>
  42.        
  43.         <div id="div2b" class="div_1b_y2b">
  44.             Lorem ipsum ad his scripta blandit partiendo, eum fastidii accumsan euripidis in, eum liber hendrerit an. Qui ut wisi vocibus suscipiantur, quo dicit ridens inciderint id. Quo mundi lobortis reformidans eu, legimus senserit definiebas an eos.
  45.         </div>
  46.  
  47.     </div>
  48.  
  49. <script type="text/javascript">
  50.  
  51.     function toogle(me,other)
  52.     {      
  53.         other   = document.getElementById(other.replace(/a/, "b"));
  54.         me      = document.getElementById(me.id.replace(/a/, "b"));
  55.                        
  56.         if (me.clientHeight==0 && other.clientHeight==0){
  57.             me.setAttribute("style","height: 160px");
  58.         }else{ 
  59.             me.setAttribute("style","height: 160px");
  60.             other.setAttribute("style","height: 0px");     
  61.         }
  62.  
  63.     }
  64.  
  65. </script>


HISTORIAL DE CAMBIOS (que me acuerde)


- Se rehizo el JS acomodandose a los "estandares" de hacer una funcion llamada toogle()

- Se agrego a los CSS: #div1b,#div2b {height: 0px;}

- Se cambio el onclick concistentemente con la nueva funcion en JS


Seguramente llegaran a decirme que DEBO registrar el evento onclick en vez de usar onclick inline y tienen razon! solo que como es un caso tan particular de toogle() y el HTML ya venia con un onclick inline... pues lo deje asi
__________________
Salu2!

Última edición por Italico76; 26/06/2014 a las 08:45
  #5 (permalink)  
Antiguo 26/06/2014, 11:41
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con evento: tengo que dar 2 clic para que funcione!

Otra alternativa de solución:

Código Javascript:
Ver original
  1. var divs = document.querySelectorAll(".div_1b_y2b"),
  2.     buttons = document.querySelectorAll(".disparador");
  3. Array.prototype.forEach.call(buttons, function(button){
  4.     button.addEventListener("click", function(){
  5.         Array.prototype.forEach.call(divs, function(div){
  6.             var numDiv = div.id.substr(div.id.length - 2, 1),
  7.                 numBut = button.id.substr(button.id.length - 2, 1),
  8.                 altura = div.style.height || "0px";
  9.             if (numDiv == numBut) div.style.height = altura != "0px" ? "0px" : "100px";
  10.             else div.style.height = "0px";
  11.         });    
  12.     }, false);
  13. });

Asigno una clase a los <div> en los que se darán los clics, los tomo junto con los <div> que se mostrarán/ocultarán y a cada <div> que clickearé, le asigno una función cuando se produzca el evento click. Cuando esto suceda, recorro al conjunto de elementos <div> a mostrar/ocultar y obtengo el número que se encuentra en su id una posición antes del final y lo mismo hago con el <div> disparador. Además, obtengo la altura del <div> a mostrar/ocultar o le asigno el valor "0px" si es que no se le ha definido dicho valor. Si los números obtenidos de los id de los elementos en cuestión son iguales, realizo otra condición; si la altura es distinta a "0px", lo cual quiere decir que ya es visible, le asigno el valor "0px" como altura, ocultándolo, caso contrario, le asigno "100px" de altura, mostrándolo. Si los números son diferentes, le asigno el valor "0px", ocultándolo.



Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #6 (permalink)  
Antiguo 26/06/2014, 12:02
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Problema con evento: tengo que dar 2 clic para que funcione!

Excelente generalizacion
__________________
Salu2!
  #7 (permalink)  
Antiguo 26/06/2014, 21:37
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: Problema con evento: tengo que dar 2 clic para que funcione!

Uh, caray, bien hecho, señores.

Como dice italico76, el script de quimfv resultó no jalar las transiciones. Además, si no veo mal, el código se haría inmanejable en caso que hubieran múltiples divs a mostrar (aunque, ciertamente, éste no era el problema y yo tenía el código inicialmente así).

Los scripts de italico76 y alexis88, bien, no, bien no, excelente .

Me despido y feliz mundial Brasil 2014 !
(Yo le voy a cualquier país americano, -excepto México , por ejemplo Costa Rica, que va muy bien.)


Saludos!

Etiquetas: Ninguno
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 09:28.