Frage

Lassen Sie sich sagen, ich habe ein Szenario, in dem ich ein globales Plugin (oder zumindest ein Plugin, das auf ein breiteres Spektrum von Veranstaltungen bindet).

Dieses Plugin nimmt einen Selektor, und bindet einen Live-Klick darauf. Etwas in pseudo-jquery, die wie folgt aussehen:

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

Auf einer anderen Seite, ich habe eine zusätzliche Live-Bindung etwas wie folgt aus:

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

In diesem Szenario würde das Kontrollkästchen im Idealfall am Ende wird an beiden Live-Events gebunden.

Was ich sehe ist, dass die Änderung Ereignis ausgelöst wird, wie es sollte, und ich „yo“ aufmerksam gemacht. Doch dieses Live-Klick-Ereignis verwenden, ich auslösen es nie. Um jedoch einen expliziten Klick mit Bindung, mache ich es getroffen.

Die einfache Abhilfe ist ein Click-Ereignis am Ende der Live-Wechsel-Handler auszulösen, aber dies scheint janky mir. Irgendwelche Ideen?

Beachten Sie, dass dies mit Jquery 1.4.2 und tritt nur in IE8 (I sollte 6/7 würde auch, aber ich habe sie nicht getestet).

ein Beispiel (Sie jquery-1.4.2.min.js benötigen):

<!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>
War es hilfreich?

Lösung

Sie wissen, dass IE die „change“ -Ereignis nicht ausgelöst, bis das Kontrollkästchen den Fokus verliert, nicht wahr?

Bearbeiten , während ich denke, das ist wahr, die Wirkung von dieser Testseite ist ziemlich bizarr. Ich spiele immer noch mit ihm. Der „live“ Mechanismus verwirrt mich und macht mich ein wenig nervös, obwohl ich durchaus seinen Wert verstehen.

Ich habe die (leicht modifiziert und präzisiert) Testseite setzen: http://gutfullofbeer.net/clicks .html und ich werde dabei einige jQuery Debuggen

starten

Grauzone: Wie in den Kommentaren erwähnt, wenn ich einen Dummy "change" Handler an das Körperelement binden:

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

dann Dinge anfangen zu arbeiten normal. Ich bin sicher, dass @ Alex richtig ist, dass es etwas los mit der Art und Weise ist jQuery das Sprudeln des „change“ -Ereignis zu fälschen versucht. aber immer noch gespenstisch. Die Testseite ist unter http://gutfullofbeer.net/clicks-body.html und Sie können finden Sie in der Seltsamkeit durch die „Setup mit Wechsel-Handler zuerst“ klicken, dann die Kontrollkästchen klicken und beachten Sie, dass das „Klick“ Handler auf dem zweiten nur einmal ausgelöst, dann auf die Schaltfläche „Binden Sie einen Handler für den Körper“ und beobachten, wie die Kontrollkästchen verhalten sich danach.

Andere Tipps

Versuchen $.delegate mit einem gemeinsamen Vorfahren statt $.live mit

Der Schlüssel mit live zu erinnern ist, dass das Ereignis nicht gebunden an das Element, das Sie wählen. Es ist verpflichtet document und dann, sobald das Ereignis zu dem Dokument Blasen, überprüft er gegen den Selektor Sie auf dem Ereignis-Ziel übergeben.

Der Schlüssel von dem zu lernen, ist, dass in IE - das Änderungsereignis nicht natürlich Blase der Fall ist, wie in den meisten Browsern. Im IE der Veranstaltung „Blasen“ auf der Basis eine Heuristik, die die gleiche in alle der jquery Tests als das eigentliche Ereignis in anderen Browsern funktioniert. Es ist wahrscheinlich etwas in der anderen Funktion, die diese Heuristik von der Arbeit hindert. So macht es Sinn, dass es IE spezifisch ist. Nicht, dass das eine gute Sache ...

Sie können mit der jquery.livequery Plugin

$("select[name='majorsList']").livequery("change",function()
{
alert('in');
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top