jQuery autocomplete Problem mit Version 1.5 und jQuery-UI
Manchmal ist das Update auf ein neues Release einer Software nicht ganz so unproblematisch wie man es gerne hätte.
Bis zu jQuery 1.5b1 lief folgender Code problemlos:
[pastacode lang=“javascript“ message=“JavaScript“ highlight=““ provider=“manual“]
$('.autocomplete').autocomplete({
source: function(request, response) {
$.getJSON('system/autocomplete.user.php', {
term: extractLast(request.term)
}, response);
},
search: function() {
var term = extractLast(this.value);
if (term.length < 2) {
return false;
}
},
focus: function() {
return false;
},
select: function(event, ui) {
var terms = split(this.value);
terms.pop();
terms.push(ui.item.label);
terms.push('');
this.value = terms.join(', ');
return false;
}
});
[/pastacode]
Ab 1.5RC1 allerdings nicht mehr – ohne einen JavaScript Fehler zu verursachen kommt nun einfach keine Auswahl für das Autocomplete mehr.
Nach langem (langem, langem….) Suchen konnten wir die folgende Codestelle im jQuery Framework ausmachen, die „verantwortlich“ ist.
In Version 1.5 ist das etwa Zeile 6930 gewesen.
[pastacode lang=“javascript“ message=“JavaScript“ highlight=““ provider=“manual“]
// Detect, normalize options and install callbacks for jsonp requests
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString /* internal */ ) {
dataIsString = ( typeof s.data === "string" );
if ( s.dataTypes[ 0 ] === "jsonp" ||
originalSettings.jsonpCallback ||
originalSettings.jsonp != null ||
s.jsonp !== false && ( jsre.test( s.url ) ||
dataIsString && jsre.test( s.data ) ) ) {
[/pastacode]
Diese Codestelle und der danach folgende Code sorgen dafür, dass auch bei der Angabe von dataType json der Request unseres Autocompletes in jsonp geändert wird.
Folgender Code schafft Abhilfe, wenn er vor dem Aufruf des Autocomplete integriert wird:
[pastacode lang=“javascript“ message=“JavaScript“ highlight=““ provider=“manual“]
$.ajaxSetup({
jsonp: null,
jsonpCallback: false
});
[/pastacode]
Der Grund dafür ist, dass im jQuery Framework als neuer Standard folgendes steht:
[pastacode lang=“javascript“ message=“JavaScript“ highlight=““ provider=“manual“]
// Default jsonp settings
jQuery.ajaxSetup({
jsonp: "callback",
jsonpCallback: function() {
return jQuery.expando + "_" + ( jsc++ );
}
});
[/pastacode]
Das führt dazu, dass die weiter oben genannte Abfrage
if ( s.dataTypes[ 0 ] === „jsonp“ || originalSettings.jsonpCallback || originalSettings.jsonp != null || …. usw
immer zutrifft, wenn man die Standard-Angaben nicht überschreibt.
Warum kommt dann keine Ausgabe?
Das liegt einfach daran, dass der Server via php mit json_encode() ein JSON Objekt erzeugt. Das sieht zum Beispiel so aus: [{’name‘:’xyyyyy‘,’num‘:2}]
Wird nun aber von jQuery ein jsonp als Rückgabe angenommen, so versucht jQuery den Code als Javascript auszuführen (bzw. in die Seite einzubetten) statt das JSON Objekt zu verarbeiten und dies schlägt natürlich fehl.
Nachtrag: Seit jQuery 1.6 ist der Aufruf von $.ajaxSetup() nicht mehr länger notwendig. Aber er schadet auch nicht, wenn der Code möglichst mit allen Versionen kompatibel sein soll.
danke für den beitrag! hat mir viel zeit gespart!
OMG, Danke! Dieses Problem hat mich den ganzen Tag gekostet! Warum steht sowas nirgendwo in der Doku?