2011-01-09 15 views
6

¿Hay alguna forma de que la función de desplazamiento solo se ejecute una vez? Esto es lo que estoy intentando actualmente:jQuery - Usar .one() con el control deslizante

$('#ask').live('hover', function() { 

    $('#homesearch-after').hide(300); 

    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 

}); 

Pero eso no está funcionando. ¿Cómo solo puedo activar este vuelo estacionario para activarlo una vez?

He intentado cambiar .live con .one y .bind ... resultando en nada.

+2

Sin relación con su pregunta, pero usted puede deshacerse del tiempo de espera añadiendo el código dentro de él directamente como devolución de llamada después de que 'hide' finalice: '$ ('# homesearch-after'). hide (300, función() {/ ** código aquí ** /});' –

Respuesta

10

Ya se ha respondido a sí mismo, use .one() (no .live()).

Pero como lasseespeholt acaba de señalar en un comentario, .hover() es la abreviatura de unión a mouseenter y mouseleave, y no es un acontecimiento en sí mismo.

Prueba esto:

$('#ask').one('mouseenter', function() { 

    $('#homesearch-after').hide(300); 

    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 

}); 

Si aún así no funciona, intente usar sólo el buen ol' .hover() y luego .unbind() ing inmediatamente después de que haya terminado.

$('#ask').hover(function() { 

    $('#homesearch-after').hide(300); 

    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 

    // Again taking into account what lasseespeholt said 
    $(this).unbind('mouseenter mouseleave') 

}); 
+1

Por alguna razón cuando uso este código, no hace nada. =/ – Jared

+0

@Jared: ¿Su '' ask' está siendo agregado dinámicamente a su página por JS? – BoltClock

+0

No, se muestra con HTML estático. – Jared

8

hover no es un pero un método abreviado verdadero event que se une controladores para dos eventos, mouseenter y mouseleave, y como tal no funciona con .one (como se muestra here). Para replicar el comportamiento de hover que tendría que tener dos se une que a la vez se activa una sola vez, así:

$("#foo").one("mouseenter mouseleave", function(e){ 
    $(this).toggleClass("bar"); 
}); 

Lo anterior sería el mismo que el siguiente, con la excepción de que se dispara una sola vez :

$("#foo").hover(function(){ 
    $(this).toggleClass("bar"); 
}); 

Si quieres hacer cosas diferentes en mouseenter y mouseleave, es necesario unir manejadores diferentes:

$("#foo").one("mouseenter", function(e){ 
    $(this).addClass("bar").text("Over"); 
}).one("mouseleave", function(e){ 
    $(this).removeClass("bar").text("Out"); 
}); 

W sombrero puedo leer a partir del código es que sólo se busca para unirse al evento mouseenter, así:

$('#ask').one('mouseenter', function() { 
    $('#homesearch-after').hide(300); 
    $.doTimeout(300, function() { 
     hideClosedSearchLink(); 
     showHomeSearch(); 
    }); 
}); 
+1

Alternativamente, '.one ('mouseenter mouseleave', función (e) {...)' – BoltClock

+0

@BoltClock, eso es incluso mejor si está buscando hacer un 'alternar' de algún tipo, como en mi ejemplo. ¡Lo agregaré! – mekwall

Cuestiones relacionadas