2 Reaktionen

jQuery autocomplete Problem mit Version 1.5 und jQuery-UI

Geschätzte Lesedauer:

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.

Dieser Artikel wurde von Marius Burkard verfasst.

Marius Burkard ist Diplom-Wirtschaftsinformatiker und arbeitet seit 2006 als selbstständiger Software-Entwickler und Linux-Server-Administrator mit der Firma pixcept KG. Er ist unter anderem mitverantwortlich für die Projekte Was-lese-ich.de und ISPProtect.

2 Kommentare - bis jetzt!

Eigenen Kommentar verfassen
  1. sbauer
    schrieb am :

    danke für den beitrag! hat mir viel zeit gespart!

  2. Michael
    schrieb am :

    OMG, Danke! Dieses Problem hat mich den ganzen Tag gekostet! Warum steht sowas nirgendwo in der Doku?

Und jetzt du! Deine Meinung?

Erforderliche Felder sind mit einem Asterisk (*) gekennzeichnet. Die E-Mail-Adresse wird nicht veröffentlicht.
  1. Nach Absenden des Kommentar-Formulars erfolgt eine Verarbeitung der von Ihnen eingegebenen personenbezogenen Daten durch den datenschutzrechtlich Verantwortlichen zum Zweck der Bearbeitung Ihrer Anfrage auf Grundlage Ihrer durch das Absenden des Formulars erteilten Einwilligung.
    Weitere Informationen