Pregunta

Vamos a decir que tengo un escenario en el que tengo un plugin global (o, al menos, un plugin que se une a una gama más amplia de eventos).

Este plugin tiene un selector, y se une un clic en directo a ella. Algo en pseudo-jquery que podría tener este aspecto:

$.fn.changeSomething = function(){
     $(this).live("change", function(){ alert("yo");});
}

En otra página, tengo un adicional de algo vivo vinculante de esta manera:

$("input[type='checkbox']").live("click", function(){alert("ho");});

Dentro de este escenario, la casilla de verificación lo ideal sería llegar a ser obligados a ambos eventos.

Lo que estoy viendo es que los incendios de evento de cambio como debe ser, y estoy alertado "yo". Sin embargo, el uso de este evento click en vivo, nunca lo desencadenan. Sin embargo, el uso de unirse a un clic explícita, yo lo golpeó.

La solución es fácil para desencadenar un evento de clic al final del manipulador de cambio en vivo, pero esto parece janky a mí. ¿Algunas ideas?

Tenga en cuenta que esto es usar jQuery 1.4.2 y sólo se produce en IE8 (I supuesta 6/7 también lo haría, pero no los he probado).

un ejemplo (que necesitará jquery-1.4.2.min.js):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script src="jquery-1.4.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $.fn.changeSomething = function(){
        var t = $(this);
        t.live("change", function(){
            alert("yo");
        }); 
    };

    $(document).ready(function(){
    $("input[type='checkbox']").changeSomething();
    $("#special").live("click", function(){
      alert("ho");
    });
    });
</script>
</head>
<body>
<form>
  <input type="checkbox" id="cbx" />
  <input type="checkbox" id="special" />
  </form>
</body>
</html>
¿Fue útil?

Solución

Usted sabe que el IE no se disparará el evento "cambio" hasta la casilla pierde el foco, ¿verdad?

editar , mientras que yo creo que es cierto, el efecto de esa página de prueba es bastante extraño. Todavía estoy jugando con él. El mecanismo de "en vivo" me confunde y me hace un poco nervioso, aunque entiendo completamente su valor.

He puesto la página de prueba (ligeramente modificado y aclarado) hacia arriba: http://gutfullofbeer.net/clicks .html y voy a empezar a hacer algunas depuración jQuery

zona de penumbra: Como se ha señalado en los comentarios, cuando se unen a un "cambio" ficticia manejador al elemento del cuerpo:

$('body').bind('change', function() { return true; });

entonces las cosas empiezan a trabajar normalmente. Estoy seguro de que @Alex es correcto, de que hay algo que hacer con la forma en jQuery está haciéndose pasar por el burbujeo del evento "cambio". sin embargo, todavía espeluznante. La página de prueba es en http://gutfullofbeer.net/clicks-body.html y que pueda ver la rareza haciendo clic en el "programa de instalación con controlador de cambio de primera", a continuación, haga clic en las casillas de verificación y observe que el "clic" manejador en el segundo sólo se activa una vez, a continuación, haga clic en el "atar un controlador al cuerpo" y ver cómo las casillas de verificación comportarse después de eso.

Otros consejos

Trate de usar $.delegate con un ancestro común en lugar de $.live

La clave para recordar con live es que el evento es no unido al elemento que seleccione. Está destinado a document y luego una vez que el evento se propaga al documento, se comprueba contra el selector que ha pasado en el destino del evento.

La clave para aprender de ello es que en el IE - el evento de cambio no lo hace, naturalmente, de la burbuja, al igual que en la mayoría de los navegadores. En IE el evento "burbujas", basado en una heurística que funciona de la misma en todas las pruebas de jQuery como el evento real en otros navegadores. No es probable que algo en su otra función que se detiene esta heurística de trabajo. Así que tiene sentido que es IE específica. No es que eso es una buena cosa ...

Puede utilizar el jquery.livequery complemento

$("select[name='majorsList']").livequery("change",function()
{
alert('in');
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top