12

我正在用 Django 构建一个网络应用程序。我通过 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。

4

4 回答 4

27

问题是 Firefox 与 jQuery/XMLHttpRequest 的组合并通过 HTTP DELETE发送对象。一旦 JSON'ifying 对象通过JSON.stringify()一切工作。

尽管如此,Firefox 还是会抛出一个奇怪的异常。

感谢 freddyb 的这个想法。

于 2013-04-05T22:05:50.200 回答
8

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

于 2013-07-23T07:13:31.080 回答
1

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

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

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

于 2014-09-24T01:33:08.907 回答
0

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

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

于 2013-04-03T04:43:57.540 回答