Question

Disons que j'ai un scénario où j'ai mondiale plugin (ou au moins d'un plugin qui se lie à un plus large éventail d'événements).

Ce plugin prend un sélecteur, et se lie à un live cliquez pour elle.Quelque chose dans la pseudo-jquery qui pourrait ressembler à ceci:

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

Sur une autre page, j'ai plus de liaison en direct à quelque chose comme ceci:

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

Dans ce scénario, la case à cocher devraient, idéalement, être lié à la fois à des événements en direct.

Ce que je constate, c'est que l'événement de changement de feux comme il se doit, et je suis alerté "yo".Cependant, l'utilisation de ce live cliquez sur l'événement, je n'ai jamais déclencher.Cependant, l'utilisation explicite cliquez sur la liaison, je NE le frapper.

Le simple solution de contournement est de déclencher un événement click à la fin du live de changement de gestionnaire, mais cela semble janky pour moi.Des idées?

Notez que c'est à l'aide de jquery 1.4.2 et ne se produit que dans IE8 (je suppose 6/7 serait trop, mais je ne les ai pas testés).

un exemple (vous aurez besoin 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>
Était-ce utile?

La solution

Vous savez que IE ne se déclenche pas l'événement « changement » jusqu'à ce que la case à cocher perd le focus, droit?

modifier alors que je pense que c'est vrai, l'effet de cette page de test est assez bizarre. Je suis toujours à jouer avec elle. Le mécanisme « live » me trouble et me fait un peu nerveux, mais je comprends bien sa valeur.

J'ai mis la page de test (légèrement modifiée et clarifiée) vers le haut: http://gutfullofbeer.net/clicks .html et je vais commencer à faire du débogage jQuery

zone d'ombre: Comme indiqué dans les commentaires, lorsque je lie un gestionnaire factice "changement" de l'élément de corps:

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

alors les choses commencent à travailler normalement. Je suis sûr que est juste @ Alex, qu'il ya quelque chose à faire avec la façon dont jQuery tente de simuler le bouillonnement de l'événement « changement ». fantasmagorique cependant encore. La page de test est http://gutfullofbeer.net/clicks-body.html et vous pouvez voir la bizarrerie en cliquant sur le « Setup avec gestionnaire de premier changement », puis cliquez sur les cases à cocher et notez que le « clic » gestionnaire sur le second ne se déclenche une fois, puis cliquez sur le « liez un gestionnaire au corps » et montre comment les cases se comporter après.

Autres conseils

Essayez d'utiliser $.delegate avec un ancêtre commun au lieu de $.live

La clé à retenir avec live c'est que l'événement est pas lié à l'élément que vous sélectionnez.Il est lié à document et puis, une fois l'événement bulles dans le document, il vérifie contre le sélecteur vous passé sur la cible de l'événement.

La clé pour tirer de cela est que, dans IE - le changement de l'événement n'a pas naturellement de la bulle, comme dans la plupart des navigateurs.Dans IE cas de "bulles", basé sur une heuristique qui fonctionne de la même dans tous les jquery tests que l'événement réel dans d'autres navigateurs.Il est probable que quelque chose dans votre autre fonction qui est l'arrêt de cette heuristique de travail.Il est donc logique que c'est IE.Pas que c'est une bonne chose...

Vous pouvez utiliser le jquery.livequery plug-in

$("select[name='majorsList']").livequery("change",function()
{
alert('in');
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top