2010-02-14 28 views
162

Estoy usando el siguiente código jquery para mostrar un botón de eliminación contextual solo para las filas de la tabla que estamos moviendo con nuestro mouse. Esto funciona pero no para las filas que se han agregado con js/ajax sobre la marcha ...jquery live hover

¿Hay alguna manera de hacer que esto funcione con eventos en vivo?

$("table tr").hover(
    function() {}, 
    function() {} 
); 
+0

excelente pregunta! – emaillenin

Respuesta

244

jQuery 1.4.1 ahora soporta "flotar" para eventos en vivo(), pero sólo con una función de controlador de eventos:

$("table tr").live("hover", 

function() { 

}); 

Alternativamente, se puede proporcionar dos funciones, una para MouseEnter y uno para mouseleave:

$("table tr").live({ 
    mouseenter: function() { 

    }, 
    mouseleave: function() { 

    } 
}); 
+0

Sin embargo, todavía no funciona para mí. Intenté hacer esto: ¿Dónde me estoy equivocando? > $ ('tabla tr'). live ('hover', función() { \t \t $ (this) .find ('. deletebutton'). toggle(); \t}); –

+1

esto es incorrecto y no funciona. vea el encabezado "Eventos múltiples" en la documentación de 'live': http://api.jquery.com/live/ – Jason

+34

A partir de jQuery 1.4.2, .live (" hover ") es equivalente a .live (" mouseover ") mouseout "), NOT .live (" mouseenter mouseleave ") - vea http://bugs.jquery.com/ticket/6077 Entonces, haga .live (" mouseenter mouseleave ", function() {...}), o .live ("mouseenter", function() {...}). live ("mouseleave", function() {...}) – aem

5

A partir de jQuery 1.4.1, el evento activable trabaja con live(). Es, básicamente, sólo se une a los eventos MouseEnter y MouseLeave, que se pueden hacer con las versiones anteriores a 1.4.1 igual de bien:

$("table tr") 
    .mouseenter(function() { 
     // Hover starts 
    }) 
    .mouseleave(function() { 
     // Hover ends 
    }); 

Esto requiere dos se une, pero funciona igual de bien.

5

Este código funciona:

$(".ui-button-text").live(
     'hover', 
     function (ev) { 
      if (ev.type == 'mouseover') { 
       $(this).addClass("ui-state-hover"); 
      } 

      if (ev.type == 'mouseout') { 
       $(this).removeClass("ui-state-hover"); 
      } 
     }); 
+2

¿Qué es "ui-state-hover"? ¿Cómo se aplica eso a la pregunta original del usuario? –

+1

él solo está usando las clases predeterminadas de Jquery UI cuando el evento toma medidas. –

110
$('.hoverme').live('mouseover mouseout', function(event) { 
    if (event.type == 'mouseover') { 
    // do something on mouseover 
    } else { 
    // do something on mouseout 
    } 
}); 

http://api.jquery.com/live/

+0

También funcionó para mí. +1 Intenté hacer la versión de Philippe, ambos con mouseover y mouseenter, ninguno funcionó. Pero este lo hizo. ¡Gracias! – eduncan911

+0

'.live' está en desuso ahora, vea la respuesta de Andre para el método de reemplazo ahora. – johntrepreneur

+1

El uso de los eventos 'mouseover' y' mouseout' hará que el código se active continuamente a medida que el usuario mueve el mouse dentro del elemento. Creo que 'mouseenter' y' mouseleave' son más apropiados ya que solo se disparan una vez que se ingresa. – johntrepreneur

2

ADVERTENCIA: la versión en vivo del vuelo estacionado tiene una penalización de rendimiento significativa. Es especialmente notable en una página grande en IE8.

Estoy trabajando en un proyecto donde cargamos menús de varios niveles con AJAX (tenemos nuestros motivos :). De todos modos, utilicé el método en vivo para el vuelo estacionario que funcionó muy bien en Chrome (IE9 lo hizo bien, pero no genial). Sin embargo, en IE8 no solo disminuyó la velocidad de los menús (tenía que pasar un par de segundos antes de que cayera), pero todo en la página era muy lento, incluido el desplazamiento e incluso la comprobación de casillas de verificación simples.

Al vincular los eventos directamente después de cargarlos se obtuvo un rendimiento adecuado.

+2

útil, pero más un comentario que una respuesta. – mikemaccana

59

.live() está en desuso a partir de jQuery 1.7

Uso .on() lugar y especificar un selector descendiente

http://api.jquery.com/on/

$("table").on({ 
    mouseenter: function(){ 
    $(this).addClass("inside"); 
    }, 
    mouseleave: function(){ 
    $(this).removeClass("inside"); 
    } 
}, "tr"); // descendant selector 
+6

esto funciona sin problemas a partir de jquery 1.9. ¡todas las soluciones en vivo y delegadas están DEJADAS! sería genial si alguien pudiera dejar de aceptar la respuesta aceptada y aceptarla. – jascha