Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Problema con eventos en JSPlus

Estas en el tema de Problema con eventos en JSPlus en el foro de Frameworks JS en Foros del Web. Buenas noches amigos, estoy tratando de hacer un slider muy sencillo para un proyecto y lo estoy haciendo con mi intento de librería pero tengo ...
  #1 (permalink)  
Antiguo 22/07/2011, 14:26
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Problema con eventos en JSPlus

Buenas noches amigos, estoy tratando de hacer un slider muy sencillo para un proyecto y lo estoy haciendo con mi intento de librería pero tengo problemas con los eventos. De momento dejo aquí el enlace al ejemplo (pongo bordes para que se vean bien las dimensiones).
Al contrario de lo que cabría pensar, no es que no funcione, si no que funciona demasiado El código es este:
Código HTML:
Ver original
  1. <div id="JSPlus-slider">
  2.  <img src="http://findicons.com/files/icons/99/office/128/back.png" alt="Anterior" title="Anterior" class="slider-prev" />
  3.  <div class="slider-container">
  4.   <!-- Contenido -->
  5.  </div>
  6.  <img src="http://findicons.com/files/icons/99/office/128/forward.png" alt="Siguiente" title="Siguiente" class="slider-next" />
  7. </div>
Y el JS:
Código Javascript:
Ver original
  1. P('#JSPlus-slider').hover(function(){
  2.  P('.slider-prev, .slider-next').entrada(200);
  3. });
  4.  
  5. P('#JSPlus-slider').out(function(){
  6.  P('.slider-prev, .slider-next').salida(200);
  7. });

Como veis no tiene mucho misterio, sólo quiero que al salir del div del slider las flechas hagan un fadeOut, y viceversa. Pero hay dos problemas: el primero es que a veces, cuando entro en el div "ventana" (#JSPlus-slider), se hace un entrada-salida-entrada, sobre todo cuando se entra lentamente. El segundo es que, cuando entro en una de las flechas, se ejecuta el evento out, y luego el hover.
Para colmo, no sé cómo, pero jQuery no tiene este problema:
Código Javascript:
Ver original
  1. $('#JSPlus-slider').hover(function(){
  2.  $('.slider-prev, .slider-next').fadeIn(200);
  3. }, function(){
  4.  $('.slider-prev, .slider-next').fadeOut(200);
  5. });
No sé qué puede ser, pero me está dando un buen dolor de cabeza Espero que me podáis ayudar.
Saludos y gracias (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #2 (permalink)  
Antiguo 22/07/2011, 16:22
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: Problema con eventos en JSPlus

¡que tal, cronos!

estoy casi seguro que debe ser el problema común donde registras dos eventos, mouseover y mouseout. sin embargo, no significa que sea un problema tonto. es un efecto que sucede debido a la forma que trabaja ambos eventos. dichos eventos se inician cuando el puntero entra o sale del elemento, sea cual sea independientemente de su relación estructural (parent, child, sibling). en alguna ocasión alguien expuso una consulta similar, http://www.forosdelweb.com/showthread.php?t=866467. revisa el tema. ahí expuse una explicación, un ejemplo para demostrarlo y una posible solución.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 23/07/2011, 08:03
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema con eventos en JSPlus

Gracias por contestar!
He revisado el tema y he probado el código (que por cierto me volví loco hasta que no me di cuenta de que el firstChild era un textNode y tuve que usar firstElementChild ), bastante gráfico y explicativo. He tratado de ver cómo lo hace jQuery, pero como usa bind y trigger y son dos funciones bastante complejas (o por lo menos largas) no me he enterado.
Se me ocurre imitar el estilo de jQuery, usar una función para hover y out, pasándole dos funciones, y cada vez que ocurra el evento comprobar si alguna propiedad de event (ahora mismo no sé cuál) es hijo del elemento en cuestión. Creo que aquí está toda la información que necesito, voy a ver qué saco en claro
Saludos y gracias de nuevo (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #4 (permalink)  
Antiguo 24/07/2011, 11:34
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema con eventos en JSPlus

Creo que he acabado de estropearlo. Antes por lo menos tenía un comportamiento predecible, ahora hace lo que quiere
Este es el código actual:
Código Javascript:
Ver original
  1. hover : function(toDo){
  2.             return this.evento('mouseover', function(e){
  3.                 var from = e.relatedTarget || e.fromElement;
  4.                 !this.esPadre(from) && toDo.call(this, e);
  5.             });
  6.         },
  7. out : function(toDo){
  8.             return this.evento('mouseout', function(e){
  9.                 var to = e.relatedTarget || e.toElement;
  10.                 !this.esPadre(to) && toDo.call(this, e);
  11.             });
  12.         },
  13. esPadre : function(hijo){
  14.          var padre = hijo.parentNode;
  15.             while(this != padre){
  16.              if(padre.tagName.toLowerCase() == 'html'){ return false; }
  17.                 padre = padre.parentNode;
  18.             }
  19.             return true;
  20.         }
El ejemplo sigue estando en el mismo sitio, por favor échale un vistazo
Saludos y gracias :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #5 (permalink)  
Antiguo 25/07/2011, 16:39
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema con eventos en JSPlus

Bueno parece que uno de los problemas ya se ha solucionado. Ahora el contenedor se comporta como un bloque, y sólo responde cuando realmente se entra y se sale de él (no acaba de funcionar en el ejemplo pero en el slider real sí).
Ahora falta el otro problema, cuando salgo/entro lentamente, ocurre algo muy raro. Por ejemplo, si entro en el contenedor (despacio), las flechas se muestran, se ocultan, y hacen el fadeIn (las "primeras dos veces" es como si cambiara el visibility a visible y después a hidden). Sin embargo este problema no sucede en el ejemplo Realmente no sé qué puede estar pasando, y me gustaría solucionar esto del slider cuanto antes.
Saludos y gracias :D
Edit: Siento si he dicho/hecho algo que haya podido disgustar a la persona que ha "votado en contra" de este tema, de verdad que no sé qué puedo haber dicho para molestar, pero no era mi intención
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red

Última edición por _cronos2; 26/07/2011 a las 07:48
  #6 (permalink)  
Antiguo 26/07/2011, 15:51
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años
Puntos: 343
Respuesta: Problema con eventos en JSPlus

Este metodo

Código Javascript:
Ver original
  1. esPadre : function(hijo){
  2.    var padre = hijo.parentNode;
  3.    while(this != padre){  
  4.     if(padre.tagName.toLowerCase() == 'html'){ return false; }
  5.     padre = padre.parentNode;
  6.    }
  7.    return true;
  8.   }

Deberia chequear primero que el parentNode no sea el document:

Código Javascript:
Ver original
  1. esPadre : function(hijo){
  2.    var padre = hijo.parentNode;
  3.    while(this != padre){  
  4.     if(padre.nodeType == 9 || padre.tagName.toLowerCase() == 'html'){ return false; }
  5.     padre = padre.parentNode;
  6.    }
  7.    return true;
  8.   }

Ya con eso deja de llenarme la consola de errores.
__________________
blog | @aijoona
  #7 (permalink)  
Antiguo 26/07/2011, 16:24
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema con eventos en JSPlus

Gracias por contestar @Aijoona!
Y gracias también por el bug fix, pero el problema principal es lo que ya he descrito, que al entrar/salir lentamente ocurre algo muy raro. ¿Crees que sabes de dónde puede venir el problema?
Saludos y gracias otra vez :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #8 (permalink)  
Antiguo 26/07/2011, 16:36
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años
Puntos: 343
Respuesta: Problema con eventos en JSPlus

Por lo que vi hay veces que disparas el evento más de una vez:

Código Javascript:
Ver original
  1. P('#JSPlus-slider').hover(function(){
  2.     console.log('EVENT HOVER');
  3.  P('.slider-prev, .slider-next').entrada(200);//.opacity(0).css('display', 'block')
  4. });
  5.  
  6. P('#JSPlus-slider').out(function(){
  7.     console.log('EVENT OUT');
  8.  P('.slider-prev, .slider-next').salida(200)//, function(){ this.css('display', 'none'); });
  9. });
__________________
blog | @aijoona
  #9 (permalink)  
Antiguo 26/07/2011, 17:34
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Problema con eventos en JSPlus

Hmmm, por lo que parece se debe al border, porque si lo quito no se producen los eventos dos veces seguidas. Realmente el border no creo que lo necesite en la versión final, sino que lo tengo puesto para controlar las dimensiones de los contenedores, pero sí me gustaría arreglar el asunto para futuras ocasiones.
No estoy seguro, pero creo que jQuery no tenía este problema (el otro sí que no lo tenía).
¿Se os ocurre por qué el border está interfiriendo de esta manera en los eventos?
Saludos y muchas gracias por dar con la raíz del problema, ahora sólo queda la solución
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red

Etiquetas: eventos, javascript, jquery, js, php
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 10:06.