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 组件没有名为:“可用”的方法'的主要内容,如果未能解决你的问题,请参考以下文章