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

Posted

技术标签:

【中文标题】Firefox 异常 \'JavaScript 组件没有名为:“可用”的方法\'【英文标题】:Firefox exception 'JavaScript component does not have a method named: "available"'Firefox 异常 'JavaScript 组件没有名为:“可用”的方法' 【发布时间】:2013-03-24 06:25:00 【问题描述】:

我正在使用 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 中。铬工作正常。同样,其他请求确实有效。唯一让这个与众不同的是 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。

【问题讨论】:

你的 js 代码会很方便。 "发出请求的类型("POST" 或 "GET"),默认为"GET"。注意:其他HTTP请求方法,如PUT和DELETE,也可以是此处使用,*但并非所有浏览器都支持它们。"* 也许 Firefox 不支持通过 AJAX 删除? 那么这是一个 jQuery 问题吗? This answer 表示所有主流浏览器都应该能够执行删除操作(那是几年前的事了)。 看起来你正试图发送一个对象,而 jQuery 把它搞砸了。你试过 JSON.stringify 了吗? 是的,就是这样!我在大多数情况下使用 JSON.stringify 但可能在这里忘记了。如果您将其发布为答案,我很乐意接受。 【参考方案1】:

问题在于 Firefox 与 jQuery/XMLHttpRequest 的组合以及通过 HTTP DELETE 发送对象。一旦通过 JSON.stringify() 对对象进行 JSON 化,一切正常。

不过,Firefox 会抛出一个奇怪的异常。

感谢 freddyb 的这个想法。

【讨论】:

见my answer;任何不是 GET 且提供空对象的请求都会发生这种情况。【参考方案2】:

问题出在$.ajax 函数中名为processData 的属性上。当这个属性被提供为“假”(不知道为什么)时,Firefox 不喜欢它,因此,浏览器不会消化 JSON 请求/响应包。 Chrome 和 Safari 运行良好。

【讨论】:

"data":要发送到服务器的数据。如果还不是字符串,则将其转换为查询字符串。它附加到 GET 请求的 url。请参阅 processData 选项以防止此自动处理。 link 这也是我的经验,但仅适用于 POST 方法。在 POST 中使用 x-www-form-urlencoded,processData: false 会导致 Firefox 错误。【参考方案3】:

request data 对象为空对象(如 @ 987654323@。我正在使用Mithril.js,这可能与 Mithril 总是为非GET 请求设置 Content-Type 的事实有关。一旦我知道触发器,这绝对是可重复的。

(请注意,“非GET”部分可能并不完全准确——如果它是GET,Mithril 会忽略数据对象,因此使用底层 AJAX 对象发送带有 GET 的空对象也可能在同样的方式。)

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

【讨论】:

仅供参考,mithril.js 现在将转换为空字符串。从 0.1.23 开始,如果你强迫它出错(例如通过错误的序列化选项),它也会抛出一个更友好的错误【参考方案4】:

听起来你安装了一个有问题的 Firefox 扩展,它试图检查 XMLHttpRequest 数据并且失败了......

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

【讨论】:

禁用扩展程序或以安全模式启动都没有帮助。

以上是关于Firefox 异常 'JavaScript 组件没有名为:“可用”的方法'的主要内容,如果未能解决你的问题,请参考以下文章