2010-12-03 4 views
2

Ok, es dauerte eine Weile, nur um einen Titel für diese Frage zu kommen.jQuery ändern Ereignis nicht feuern in IE beim Freigeben der Maus außerhalb von mehreren wählen

Nehmen wir an, Sie haben eine Mehrfachauswahlliste und verwenden jQuery, um das Änderungsereignis zu erkennen. Dies funktioniert unter Firefox und IE unter normalen Bedingungen. Wenn Sie in IE jedoch etwas in der Liste auswählen und die Maus erst freigeben, nachdem sich der Cursor außerhalb der Auswahl befindet, wird das Ereignis nicht ausgelöst. Das funktioniert in Firefox.

HTML:

<select size="4" name="ListBox" multiple="multiple" id="ListBox"> 
    <option value="32">32</option> 
    <option value="48">48</option> 
</select> 

Javascript:

$(ListBox).change(function() 
{ 
    alert("Change fired"); 
}); 

Sie das Beispiel hier testen: http://jsfiddle.net/as7EN/1/

FF 3.6.12: WORKS
IE8: FUNKTIONIERT NICHT

Danke für jeden Vorschlag n.

+1

Was Sie oben erwähnt, funktioniert nicht für mich in FF entweder http://jsfiddle.net/as7EN/1/ – Raynos

+0

Vielleicht könnten Sie ein Ereignis auf den Fokus tun - sobald es den Fokus verliert überprüfen Sie es. – Bob

+0

Danke Raynos für dieses Live-Beispiel, ich kannte diese Website nicht. Tolle. Ich werde Ihren Link zu der Hauptfrage veröffentlichen. Ich bin unter FF 3.6.12 und es funktioniert für mich. Was ist deine Version? – md1337

Antwort

2

Stellt sich heraus, es ist ein jQuery 1.4. * Fehler!

Ich testete die Fiddle erneut mit einer früheren Version von jQuery, 1.3.2, und es funktioniert wirklich!

Ich schrieb einen Fehlerbericht an jQuery, bitte dort meinen Bericht stimmen, wenn Sie sie es (über dem Ticket für die „Zurück Ticket“ Link neben sehr kleine Pfeile) beheben möchten:

http://bugs.jquery.com/ticket/7698

0

A hackish Lösung

[Bearbeitet Lösung]

var clickDown = false; 
var currentlySelected = null; 

$("#ListBox").mousedown(function (event) 
{ 
    clickDown = this; 
}); 

$(document).mouseup(function() { 
    setTimeout(function() { 
     if (clickDown) { 
      if (currentlySelected != clickDown.selectedIndex) { 
       alert("change"); 
       currentlySelected = clickDown.selectedIndex; 
      } 
      clickDown = false; 
     } 
    }, 0); 
}); 

Grundsätzlich auf mouseDown- haben wir eine Fahne sagen Sie auf das Listenfeld klicken.

Dann überprüfen wir alle MouseUp im gesamten Dokument. Wir wickeln die gesamte Funktion in eine Zeitüberschreitung ein, um sicherzustellen, dass IE8 den ausgewähltenIndex korrekt setzt. Und wenn das clickDown-Flag gesetzt ist, wissen wir, dass das clickUp aus einer Listbox kam. Für Convience speicher ich auch das Listbox-Objekt in der Flagge seit (Objekt === wahr) in Javascript.

Dann überprüfen wir einfach, ob sich unsere Variable mit dem aktuellen Index geändert hat. Wenn dies der Fall ist, aktualisieren wir diese Variable, um den neuen Index widerzuspiegeln.

Endlich müssen wir clickDown auf false wieder extern setzen andere klick ups in das Dokument würde dort aus der Listbox denken.

Dies beinhaltet keineswegs jeden Klick und ist die Überprüfung bedeutet eine elegante Lösung

http://jsfiddle.net/as7EN/37/

[Bearbeiten] Dass es nur für Chrom festgelegt. Nicht für IE8. Arbeiten daran.

Ich habe es auf die Tatsache eingegrenzt, dass IE den selectedIndex ändert, nachdem das MouseUp-Ereignis ausgelöst wurde.

Dieser Fehler kann vermieden werden, indem Sie ihn in einen timeOut einfügen, so dass die Funktion aufgerufen wird, nachdem IE8 selectedIndex auf den tatsächlichen Wert gesetzt hat. Ich interessiere mich nicht für IE6/7, das selbst zu beheben.

Auch wenn Sie Multiselect mir arbeiten sagen, und ich werde hacken, dass rund aswell

+0

schwebt, schätze ich Ihre Bemühung, mir zu helfen. Siehe jedoch meine andere Antwort. Ich habe festgestellt, dass es sich um einen jQuery-Fehler handelt, der in der 1.4-Verzweigung eingeführt wurde. – md1337

Verwandte Themen