2013-04-02 4 views
12

私はDjangoでWebアプリケーションを構築しています。 JavascriptでAjax(jQuery v1.8.3)経由でAPIコールがたくさんあります。Firefoxの例外 'JavaScriptコンポーネントに「available」という名前のメソッドがありません

働くそれらのほとんどが、STATUSTEXTとしてステータス0このメッセージをリターン・オブジェクトの特定の一つの結果:

[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]

はjQueryの内の対応する行が、しかしxhr.send((s.hasContent && s.data) || null);

ありますこれはFirefoxでのみ発生します。 Chromeは正常に動作します。もう一度、他のリクエストが機能します。これを別に設定するのは、DELETE httpメソッドだけです。

要求は以下の通りです(Chromeで示したHTTPネットワークデータ - Firebugのは、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 

、私はすべての要求を受信しません。

JSコードは(ブレークポイントでFirebugのウォッチから直接取得)です:

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

私もFF内のすべての拡張機能を無効にしてみました。私はv20.0を走らせる。

+0

あなたのjsコードは便利です。 – ZippyV

+0

* "リクエストのタイプ(" POST "または" GET ")、デフォルトは" GET "注:ここでは、PUTやDELETEなどの他のHTTPリクエストメソッドも使用できますが、すべてのブラウザでサポートされていない***。 "* FirefoxがAJAX経由のDELETEをサポートしていない可能性はありますか? – Zeta

+0

これはjQueryの問題ですか? [この回答](http://stackoverflow.com/a/166501/700283)は、すべての主要なブラウザがDELETEを実行できなければならないと言います(それは数年前でした)。 – graup

答えて

27

問題は、FirefoxとjQuery/XMLHttpRequestとの組み合わせであり、はHTTP DELETEを介してオブジェクトを送信していました。 JSON.stringify()でオブジェクトをJSONにすると、すべてが機能しました。

まだ、Firefoxがスローするための奇妙な例外です。

その考えのためにfreddybに感謝します。

+0

[私の答え](http://stackoverflow.com/a/26007157/8946)を参照してください。これはGETではなく、空のオブジェクトを提供するリクエストで私にとって起こります。 –

0

あなたはXMLHttpRequestのデータを検討しようとして失敗しているFirefoxの拡張機能をインストールバギーを持っているようですね....

私はあなたがhttp://support.mozilla.org/en-US/kb/troubleshoot-firefox-issues-using-safe-modeを試すか、単にFirefoxの拡張機能が関与しているものは何でも無効に示唆しています。

+0

拡張機能を無効にすることも、セーフモードで起動することも役に立ちませんでした。 – graup

8

$.ajax機能内でprocessDataというプロパティが問題でした。このプロパティが「偽」(なぜわからない)として提供されると、Firefoxはそれを気に入らず、その結果、ブラウザはJSONリクエスト/レスポンスパッケージをダイジェストしません。 ChromeとSafariは正常に動作します。

+0

"data":サーバーに送信するデータ。まだ文字列でない場合は、クエリ文字列に変換されます。これはGETリクエストのURLに追加されています。この自動処理を防ぐには、processDataオプションを参照してください。 [リンク](http://api.jquery.com/jquery.ajax/) – Jorj

+0

これも私の経験ですが、POSTメソッドのみです。 POSTでx-www-form-urlencodedを使用すると、processData:falseはFirefoxエラーを引き起こします。 – wbdarby

1

これは要求dataオブジェクトは{}ように、空のオブジェクトである任意の非GET AJAXリクエストで(FireFoxの32と2014年のように)起こります。私はMithril.jsを使用しており、Mithrilは常に非GETリクエストのContent-Typeを設定しているという事実に関連している可能性があります。トリガーが分かれば、これは絶対に繰り返すことができました。

(「非 GET」の部分は完全に正確ではないかもしれないことに注意してください - それは GETはそうも同じように失敗する可能性が根底にあるAJAXオブジェクトを使用してGETして、空のオブジェクトを送信するかどうミスリルは、データオブジェクトを無視します。)

対話直感的には、dataを空の文字列""に設定しても直感的には失敗しません。これが私の回避策です。私は実際にはデータが一切設定されていないときにはデータを設定しません。リクエスト(AJAXラッパー)を送信する時刻に設定されていない場合、デフォルト値は""になります。

+0

FYI、mithril.jsは空の文字列への変換を行うようになりました。 0.1.23現在、間違っていると強制的に(例えば、不正なシリアライズオプションを使用して)友好的なエラーが発生します。 – LeoHorie

関連する問題