¿Es posible usar jQuery .on y hover?

331

Tengo un <ul>que se rellena con javascript después de la carga inicial de la página. Actualmente estoy usando .bindcon mouseovery mouseout.

El proyecto acaba de actualizarse a jQuery 1.7, así que tengo la opción de usar .on, pero parece que no puedo hacerlo funcionar hover. ¿Es posible usar .oncon hover?

EDITAR : los elementos a los que me estoy vinculando se cargan con javascript después de que se carga el documento. Es por eso que estoy usando ony no solo hover.

Ryre
fuente
3
De un comentario a continuación: el soporte para eventos flotantes en On () se desactivó en jQuery 1.8 y se eliminó en jQuery 1.9 . Pruebe con una combinación de mouseentery mouseleave, como lo sugiere calebthebrewer.
SexyBeast

Respuestas:

677

( Mire la última edición en esta respuesta si necesita usar .on()elementos rellenados con JavaScript )

Use esto para elementos que no se completan con JavaScript:

$(".selector").on("mouseover", function () {
    //stuff to do on mouseover
});

.hover()tiene su propio controlador: http://api.jquery.com/hover/

Si desea hacer varias cosas, encadénelas en el .on()controlador de la siguiente manera:

$(".selector").on({
    mouseenter: function () {
        //stuff to do on mouse enter
    },
    mouseleave: function () {
        //stuff to do on mouse leave
    }
});

De acuerdo con las respuestas proporcionadas a continuación se puede utilizar hovercon .on(), pero:

Aunque se desaconseja encarecidamente el nuevo código, es posible que vea el pseudo-evento-nombre "hover" usado como una forma abreviada de la cadena "mouseenter mouseleave". Adjunta un único controlador de eventos para esos dos eventos, y el controlador debe examinar event.type para determinar si el evento es mouseenter o mouseleave. No confunda el nombre de pseudo-evento "hover" con el método .hover (), que acepta una o dos funciones.

Además, no hay ventajas de rendimiento al usarlo y es más voluminoso que solo usar mouseentero mouseleave. La respuesta que proporcioné requiere menos código y es la forma correcta de lograr algo como esto.

EDITAR

Ha pasado un tiempo desde que se respondió esta pregunta y parece haber ganado algo de tracción. El código anterior sigue en pie, pero quería agregar algo a mi respuesta original.

Si bien prefiero usar mouseentery mouseleave(me ayuda a comprender lo que está sucediendo en el código) con .on()él, es igual que escribir lo siguientehover()

$(".selector").hover(function () {
    //stuff to do on mouse enter
}, 
function () {
    //stuff to do on mouse leave
});

Dado que la pregunta original hizo preguntan cómo podrían utilizar adecuadamente on()con hover(), pensé que iba a corregir el uso de on()y no nos pareció necesario añadir el hover()código en el momento.

EDITAR 11 DE DICIEMBRE DE 2012

Algunas nuevas respuestas proporcionadas a continuación detallan cómo .on()debería funcionar si la divpregunta en cuestión se completa con JavaScript. Por ejemplo, supongamos que llena un evento divusando jQuery .load(), de esta manera:

(function ($) {
    //append div to document body
    $('<div class="selector">Test</div>').appendTo(document.body);
}(jQuery));

El código anterior para .on()no se mantendría. En cambio, debe modificar su código ligeramente, así:

$(document).on({
    mouseenter: function () {
        //stuff to do on mouse enter
    },
    mouseleave: function () {
        //stuff to do on mouse leave
    }
}, ".selector"); //pass the element as an argument to .on

Este código funcionará para un elemento poblado con JavaScript después de .load()que haya ocurrido un evento. Simplemente cambie su argumento al selector apropiado.

Sethen
fuente
1
@ Scott, tenga en cuenta que la respuesta de JonMcIntosh no responde a mi pregunta porque solo está utilizando la mitad de la funcionalidad de desplazamiento.
Ryre
1
Esto no funciona para elementos que se han agregado al DOM. Como @Nik Chankov señala a continuación, aquí está el uso correcto de .on () para adjuntar múltiples controladores stackoverflow.com/questions/8608145/…
soupy1976
1
@ soupy1976 Editó mi respuesta, ahora tiene en cuenta elementos poblados con JavaScript.
Sethen
1
@SethenMaleno, exactamente, y su .on()solución funciona eliminando el evento pseudo hover y utilizando los reales. Me gusta el primero que ilustraste con mouseenter / mouseleave +1 para eso
Mark Schultheiss
1
¡Esa edición cambió mi voto de un voto negativo a un voto positivo, bien jugado, Sethen, bien jugado!
Sean Kendle
86

Ninguna de estas soluciones funcionó para mí al pasar el mouse sobre / fuera de los objetos creados después de que el documento se haya cargado como lo solicita la pregunta. Sé que esta pregunta es antigua pero tengo una solución para aquellos que todavía buscan:

$("#container").on('mouseenter', '.selector', function() {
    //do something
});
$("#container").on('mouseleave', '.selector', function() {
    //do something
});

Esto vinculará las funciones al selector para que los objetos con este selector realizado después de que el documento esté listo aún puedan llamarlo.

cazzer
fuente
55
Este tiene la solución adecuada: stackoverflow.com/questions/8608145/…
Nik Chankov
Así es como lo hice funcionar también, encontré la respuesta aceptada poniendo el selector antes del .on no funcionó después de un evento .load (), pero esto sí.
MattP
@calebthebrewer Editó mi respuesta, ahora tiene en cuenta los elementos poblados con JavaScript.
Sethen
55
El uso de mouseovery mouseouteventos aquí hará que el código se active continuamente mientras el usuario mueve el mouse dentro del elemento. Creo mouseentery soy mouseleavemás apropiado ya que solo se disparará una vez al entrar.
johntrepreneur
1
El uso de documentos como elemento raíz no es la mejor práctica, ya que su rendimiento es hambriento. está monitoreando el documento, mientras que con load () manipula la mayor parte del tiempo solo una parte del sitio web (por ejemplo, #contenido). así que es mejor tratar de reducirlo al elemento, eso es manipulado ..
honk31
20

No estoy seguro de cómo se ve el resto de su Javascript, por lo que no podré saber si hay alguna interferencia. Pero .hover()funciona bien como un evento con .on().

$("#foo").on("hover", function() {
  // disco
});

Si desea poder utilizar sus eventos, use el objeto devuelto del evento:

$("#foo").on("hover", function(e) {
  if(e.type == "mouseenter") {
    console.log("over");
  }
  else if (e.type == "mouseleave") {
    console.log("out");
  }
});

http://jsfiddle.net/hmUPP/2/

Jon McIntosh
fuente
¿Cómo maneja esto las funciones separadas para activar / desactivar que utiliza el desplazamiento? Ej: $('#id').hover(function(){ //on }, function(){ //off});
Ryre
Para mí, esto no es necesario .. No es necesario para el uso .on()con hovercuando se puede tan fácilmente deshacerse de .on()y reemplazarla con la .hover()función y obtener los mismos resultados. ¿No es jQuery sobre escribir menos código?
Sethen
@Toast no lo hace, mira mi respuesta a continuación para ver cómo realizar mouseentery mouseleavefunciones con.on()
Sethen
He actualizado mi respuesta para incluir la utilización de ambos tipos de eventos. Esto funciona igual que la respuesta de Sethen pero tiene un sabor diferente.
Jon McIntosh
24
hoverEl soporte de eventos en On()se desactivó en jQuery 1.8 y se eliminó en jQuery 1.9.
Se fue la codificación el
9

La función de desplazamiento de jQuery proporciona funcionalidad de mouseover y mouseout.

$ (selector) .hover (inFunction, outFunction);

$(".item-image").hover(function () {
    // mouseover event codes...
}, function () {
    // mouseout event codes...
});

Fuente: http://www.w3schools.com/jquery/event_hover.asp

Tigin
fuente
3
Definitivamente funciona. tienes un voto negativo porque algunas personas están volcadas! Gracias amigo
Kareem
8

Acabo de navegar desde la web y sentí que podía contribuir. Noté que con el código anterior publicado por @calethebrewer puede resultar en múltiples llamadas sobre el selector y un comportamiento inesperado, por ejemplo: -

$(document).on('mouseover', '.selector', function() {
   //do something
});
$(document).on('mouseout', '.selector', function() {
   //do something
});

Este violín http://jsfiddle.net/TWskH/12/ ilustra mi punto. Al animar elementos como los complementos, descubrí que estos disparadores múltiples provocan un comportamiento no deseado que puede provocar que la animación o el código se invoquen más de lo necesario.

Mi sugerencia es simplemente reemplazar con mouseenter / mouseleave: -

$(document).on('mouseenter', '.selector', function() {
   //do something
});
$(document).on('mouseleave', '.selector', function() {
   //do something
});

Aunque esto evitó que se llamaran varias instancias de mi animación, eventualmente fui con mouseover / mouseleave, ya que necesitaba determinar cuándo se cernían los hijos de los padres.

KryptoniteDove
fuente
Esta respuesta en realidad proporcionó una solución de trabajo para agregar un evento de desplazamiento para un selector de documentos. +1
Rich Davis el
5

Se puede utilizar .on()con hoverhaciendo lo que la sección adicional Notas dice:

Aunque se desaconseja encarecidamente el nuevo código, es posible que vea el pseudo-evento-nombre "hover" usado como una forma abreviada de la cadena "mouseenter mouseleave". Adjunta un único controlador de eventos para esos dos eventos, y el controlador debe examinar event.type para determinar si el evento es mouseenter o mouseleave. No confunda el nombre de pseudo-evento "hover" con el método .hover (), que acepta una o dos funciones.

Eso sería hacer lo siguiente:

$("#foo").on("hover", function(e) {

    if (e.type === "mouseenter") { console.log("enter"); }
    else if (e.type === "mouseleave") { console.log("leave"); }

});

EDITAR (nota para usuarios de jQuery 1.8+):

Desaprobado en jQuery 1.8, eliminado en 1.9: el nombre "hover" se usa como una forma abreviada de la cadena "mouseenter mouseleave". Adjunta un único controlador de eventos para esos dos eventos, y el controlador debe examinar event.type para determinar si el evento es mouseenter o mouseleave. No confunda el nombre de pseudo-evento "hover" con el método .hover (), que acepta una o dos funciones.

Code Maverick
fuente
1
Esto es solo más trabajo cuando se puede hacer fácilmente usando mouseentery mouseleave... Lo sé, esto no responde la pregunta original de OP, pero aún así, usar hoverde esta manera, no es sabio.
Sethen
Hacerlo de esta manera sigue exactamente cómo el equipo de jQuery sugiere que lo haga de acuerdo con la pregunta del OP. Sin embargo, como sugiere el equipo de jQuery, se desaconseja encarecidamente el nuevo código. Pero, sigue siendo la respuesta correcta a la pregunta del OP.
Código Maverick
1
@ Scott: fuiste más rápido que yo :-). @Sethen: ambas formas funcionarán, pero el autor de la pregunta solicitó la funcionalidad con .hover().
Jon McIntosh
Lo cual es comprensible, pero aún así, creo que la OP estaba buscando una solución para una mouseentery mouseleaveen lugar de hacer que funcione con hover. Si no hay una razón real para usar hoverpor razones de rendimiento, ¿por qué usarla cuando se desaconseja encarecidamente el nuevo código?
Sethen
55
hoverEl soporte de eventos en On()se desactivó en jQuery 1.8 y se eliminó en jQuery 1.9.
Se fue la codificación el
5
$("#MyTableData").on({

 mouseenter: function(){

    //stuff to do on mouse enter
    $(this).css({'color':'red'});

},
mouseleave: function () {
    //stuff to do on mouse leave
    $(this).css({'color':'blue'});

}},'tr');
webmaster01
fuente
2

Puede proporcionar uno o varios tipos de eventos separados por un espacio.

Entonces hoveres igualmouseenter mouseleave .

Esta es mi sugestión:

$("#foo").on("mouseenter mouseleave", function() {
    // do some stuff
});
usuario2386291
fuente
Me gusta la decisión de jQ de depreciar este parámetro. La versión anterior 1.8, que usaba para desplazarse como un espacio de nombres no coincidía con el evento DOM, desplazarse, sin relación
Jim22150
1

Si necesita que tenga como condición en otro evento, lo resolví de esta manera:

$('.classname').hover(
     function(){$(this).data('hover',true);},
     function(){$(this).data('hover',false);}
);

Luego, en otro evento, puede usarlo fácilmente:

 if ($(this).data('hover')){
      //...
 }

(Veo algunos usando is(':hover')para resolver esto. Pero esto no es (todavía) un selector jQuery válido y no funciona en todos los navegadores compatibles)

Sanne
fuente
-2

El complemento jQuery hoverIntent http://cherne.net/brian/resources/jquery.hoverIntent.html va mucho más allá de los enfoques ingenuos enumerados aquí. Si bien ciertamente funcionan, es posible que no se comporten necesariamente como esperan los usuarios.

La razón más poderosa para usar hoverIntent es la función de tiempo de espera . Le permite hacer cosas como evitar que se cierre un menú porque un usuario arrastra el mouse un poco demasiado a la derecha o izquierda antes de hacer clic en el elemento que desea. También proporciona capacidades para no activar eventos de desplazamiento en un aluvión y espera un desplazamiento centrado.

Ejemplo de uso:

var config = {    
 sensitivity: 3, // number = sensitivity threshold (must be 1 or higher)    
 interval: 200, // number = milliseconds for onMouseOver polling interval    
 over: makeTall, // function = onMouseOver callback (REQUIRED)    
 timeout: 500, // number = milliseconds delay before onMouseOut    
 out: makeShort // function = onMouseOut callback (REQUIRED)
};
$("#demo3 li").hoverIntent( config )

Se puede encontrar una explicación más detallada de esto en https://stackoverflow.com/a/1089381/37055

Chris Marisic
fuente