Firefox异常'JavaScript组件没有名为的方法:“available”'

时间:2013-04-02 19:41:03

标签: javascript http firefox xmlhttprequest

我正在使用Django构建一个Web应用程序。我通过Ajax(jQuery v1.8.3)在Javascript中进行了一堆API调用。

它们中的大多数都有效,但是特定的一个会导致状态为0的返回对象,并且此消息为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]

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 Watch获取):

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。

4 个答案:

答案 0 :(得分:27)

问题是Firefox与jQuery / XMLHttpRequest和通过HTTP DELETE发送对象的组合。一旦JSON通过JSON.stringify()确认对象,一切正常。

仍然是Firefox抛出的奇怪例外。

感谢freddyb的想法。

答案 1 :(得分:8)

问题在于processData函数中名为$.ajax的属性。当此属性以“false”(不知道原因)提供时,Firefox不喜欢它,因此,浏览器不会消化JSON请求/响应包。 Chrome和Safari的工作正常。

答案 2 :(得分:1)

请求 GET对象为空时,会发生这种情况(截至2014年,使用FireFox 32)和任何非data AJAX请求对象,如{}。我正在使用Mithril.js,这可能与Mithril总是为非GET请求设置Content-Type这一事实有关。一旦我知道触发器,这绝对是可重复的。

(请注意,“非GET”部分可能不完全准确 - 如果数据对象是GET,则Mithril会忽略数据对象,因此使用基础AJAX对象发送带有GET的空对象可能也以同样的方式失败。)

反直觉地,将data设置为空字符串"",不会以这种方式失败,所以这是我的解决方法。实际上,当没有数据时,我根本不设置数据,如果我发送请求时没有设置数据(在我的AJAX包装器中),我将其默认为""

答案 3 :(得分:0)

听起来你安装了一个有bug的Firefox扩展程序,试图检查XMLHttpRequest数据并失败....

我建议你尝试http://support.mozilla.org/en-US/kb/troubleshoot-firefox-issues-using-safe-mode或者只是禁用所涉及的任何Firefox扩展程序。