2013-04-02 17 views
12

Sto costruendo un'app Web con Django. Ho un sacco di chiamate API in Javascript tramite Ajax (jQuery v1.8.3).eccezione Firefox 'Componente JavaScript non ha un metodo denominato: "disponibile"'

maggior parte lavora, ma una particolare risultato in un oggetto ritorno con stato 0 e questo messaggio come statusText:

[Exception... "'JavaScript component does not have a method named: "available"' when calling method: [nsIInputStream::available]" nsresult: "0x80570030 (NS_ERROR_XPC_JSOBJECT_HAS_NO_FUNCTION_NAMED)" location: "JS frame :: http://127.0.0.1:8000/media/js/jquery.js :: .send :: line 8434" data: no]

La linea corrispondente jQuery è xhr.send((s.hasContent && s.data) || null);

Tuttavia, questo si verifica solo in Firefox. Chrome funziona bene. Ancora, altre richieste funzionano. L'unica cosa che lo distingue è il metodo DELETE http.

La richiesta è la seguente (dati di rete HTTP mostrati in Chrome - Firebug non mostra nulla in Firefox):

Request URL: http://127.0.0.1:8000/api/reservation/13/ 
Request Method: DELETE 
Status Code: 400 BAD REQUEST (This is expected) 

Request Headers 
Accept: application/json, text/javascript, */*; q=0.01 
Content-Length: 15 
Content-Type: application/json 
Origin: http://127.0.0.1:8000 
Referer: http://127.0.0.1:8000/reservation/ 
X-Requested-With: XMLHttpRequest 

Request Payload 
[object Object] 

Response Headers 
Cache-Control: no-cache 
Content-Type: text/html; charset=utf-8 
Date: Tue, 02 Apr 2013 19:18:35 GMT 
Server: WSGIServer/0.1 Python/2.7.2 

Sul server, non ricevo alcuna richiesta.

Il codice JS è (presa direttamente da Firebug Guarda al punto di interruzione):

options = { 
    contentType: "application/json", 
    data: Object {}, 
    dataType: "json", 
    processData: false, 
    type: "DELETE", 
    url: "/api/reservation/13/", 
    error: function(), 
    success: function() 
}; 
$.ajax(options); 

Ho anche provato a disattivare tutte le estensioni in FF. Corro v20.0.

+0

Il tuo codice js sarebbe utile. – ZippyV

+0

* "Il tipo di richiesta da rendere (" POST "o" GET "), il valore predefinito è" GET ". Nota: Altri metodi di richiesta HTTP, come PUT e DELETE, possono anche essere usati qui, *** ma sono non supportato da tutti i browser ***. "* Forse è possibile che Firefox non supporti DELETE tramite AJAX? – Zeta

+0

Questo è un problema jQuery? [Questa risposta] (http://stackoverflow.com/a/166501/700283) dice che tutti i principali browser dovrebbero essere in grado di fare DELETE (e che era anni fa). – graup

risposta

27

Il problema era una combinazione di Firefox con jQuery/XMLHttpRequest e invio di un oggetto tramite HTTP DELETE. Una volta che JSON stava visualizzando l'oggetto tramite JSON.stringify(), tutto funzionava.

Ancora, una strana eccezione per Firefox da lanciare.

Grazie a freddyb per questa idea.

+0

Vedere [risposta] (http://stackoverflow.com/a/26007157/8946); questo accade per me con qualsiasi richiesta che non sia GET e che fornisca un oggetto vuoto. –

0

Suona come si dispone di un buggy installato un'estensione per Firefox che sta cercando di esaminare i dati XMLHttpRequest e non riuscendo ....

Vi suggerisco di provare http://support.mozilla.org/en-US/kb/troubleshoot-firefox-issues-using-safe-mode o semplicemente disabilitando qualsiasi estensioni di Firefox sono coinvolte.

+0

Né la disattivazione delle estensioni né l'avvio in modalità provvisoria sono state d'aiuto. – graup

8

Il problema era con la proprietà chiamata processData all'interno della funzione $.ajax. Quando questa proprietà viene fornita come "false" (non so perché) a Firefox non piace e, di conseguenza, il browser non digerisce il pacchetto di richiesta/risposta JSON. Chrome e Safari funzionano bene.

+0

"dati": dati da inviare al server. Viene convertito in una stringa di query, se non già una stringa. Viene aggiunto all'URL per le richieste GET. Vedere l'opzione processData per impedire questa elaborazione automatica. [link] (http://api.jquery.com/jquery.ajax/) – Jorj

+0

Questa è anche la mia esperienza, ma solo per il metodo POST. Usando x-www-form-urlencoded in un POST, processData: false causa un errore di Firefox. – wbdarby

1

Questo accade (dal 2014 con FireFox 32) con qualsiasi non GET richiesta AJAX quando la richiestadata oggetto è un oggetto vuoto, come {}. Sto usando Mithril.js e potrebbe essere correlato al fatto che Mithril imposta sempre un tipo di contenuto per le richieste non GET. Questo è stato assolutamente ripetibile una volta saputo il grilletto.

(Si noti che la parte "non GET" potrebbe non essere del tutto accurato - Mithril ignora l'oggetto dati se è un GET così l'invio di un oggetto vuoto con GET utilizzando l'oggetto AJAX sottostante può anche sicuro nello stesso modo.

In modo intuitivo, l'impostazione di su una stringa vuota, "", non ha esito negativo in questo modo, quindi è stato il mio intervento. In realtà non imposto affatto i dati quando non ce n'è, e se non è impostato entro la data in cui invio la richiesta (nel mio wrapper AJAX), lo imposto come predefinito su "".

+0

FYI, mithril.js ora esegue la conversione nella stringa vuota. A partire da 0.1.23 verrà anche generato un errore più amichevole se si impone che sia errato (ad esempio tramite un'opzione serialize errata) – LeoHorie

Problemi correlati