2013-04-03 4 views
5

Ich habe ein jQuery UI Autocomplete-Textfeld mit einer Remote-Datenquelle. Die select Veranstaltung zur automatischen Vervollständigung macht drei Dinge:Soll das Änderungsereignis ausgelöst werden, wenn der Wert des Textfelds sowohl manuell als auch programmgesteuert geändert wird?

  1. aktualisiert den Wert des Textfelds mit dem aus der Autocomplete-Liste ausgewählt
  2. macht einen AJAX-Aufruf einige weitere Daten in die Seite
  3. Positioniert auf einen anderen Text zu konzentrieren laden Feld (in dem vorhergehenden Schritt erstellte)

Das Textfeld hat auch ein change Ereignis, das die Daten geladen in Schritt 2 oben und löst die search Ereignis der automatische Vervollständigung entfernt.

Dies funktioniert perfekt im IE (getestet mit Version 9 und 10), aber nicht in Firefox. Wenn ich eine Auswahl aus der Autocomplete-Liste mache, werden die zusätzlichen Daten nie angezeigt (obwohl die Analyse des Netzwerkverkehrs zeigt, dass der AJAX-Aufruf durchgeführt wird) und das Ereignis search des Autocomplete ausgelöst wird. Ich habe es geschafft, das Problem bis herunter zu Firefox zu triggern, das das 10 Ereignis des Tisches nach Schritt 3 oben offenbar, weil ich etwas in das Textfeld eingab, um die Autocomplete-Liste auszulösen, und trotz der Tatsache, dass das Textfeld später programmgesteuert aktualisiert wurde.

Schnell Beispiel: http://jsfiddle.net/2umrJ/1
(Aus Gründen der Kürze dieses Beispiel verwendet nur ein keyup Ereignis auf dem Textfeld.)

Ausgabe in IE10:

input1.focus() ausgelöst
input1.blur() ausgelöst
input2.focus() ausgelöst

Output in Firefox 20:

input1.focus() ausgelöst
input1.change() ausgelöst
input1.blur() ausgelöst
input2.focus()

Wie ausgelöste gesehen werden, feuert Firefox das Ereignis, während IE nicht tut. Jetzt weiß ich, dass standardmäßig (dh ohne zusätzlichen Code) das change Ereignis nur ausgelöst wird, wenn der Wert manuell geändert wurde, aber was ist das richtige Verhalten, wenn der Wert sowohl manuell als auch programmgesteuert geändert wird, ohne das Feld den Fokus dazwischen verlieren ?

Noch wichtiger für meinen speziellen Fall, wenn das Verhalten von Firefox richtig ist (oder zumindest nicht falsch), was ist der beste Weg, es zu verhindern? Ich möchte nicht, dass das change-Ereignis ausgelöst wird, wenn der Fokus programmgesteuert geändert wird, nachdem ich etwas aus der Autocomplete-Liste ausgewählt habe.

+0

Kurioserweise feuert Firefox das 'change' Ereignis nur einmal. Im obigen JSFiddle lösen nachfolgende Tastendrücke im ersten Textfeld nur 'input1.blur() 'und' input2.focus() 'aus. Das kann nicht stimmen, oder? – Indrek

+0

Ich habe auch die Geige in der Oper und Chrom überprüft - feuern Sie das Änderungsereignis nicht ab. – Zach

+1

http://jsfiddle.net/2umrJ/2/ Schau dir meine aktualisierte Geige an und du wirst verstehen, warum sie nur einmal gefeuert hat. (Hint - bar == bar) – Zach

Antwort

3

Um zu verhindern, dass das Änderungsereignis in Firefox ausgelöst wird, würde ich etwas in Ihrer Logik haben, das eine Variable setzt, die besagt, dass es programmatisch geändert wird und in der Change Event Logik, sollten Sie diese Variable überprüfen, führen Sie die Änderungslogik nicht aus wenn es programmgesteuert ausgelöst wird, und die Variable vor dem Beenden zurücksetzen.

+0

Das war, was ich getan habe. Ich hatte gehofft, dass es einen eleganteren Weg gibt, dies zu tun, oder vielleicht einen besseren Weg, um die Ereignisse zu verkabeln, aber das funktioniert gut genug. Vielen Dank! – Indrek

Verwandte Themen