Firefox exception "JavaScript-компонент не имеет метода с именем:" available "

Я создаю веб-приложение с Django. У меня есть куча вызовов API в Javascript через Ajax (jQuery v1.8.3).

Большинство из них работают, но конкретный результат приводит к возврату объекта со статусом 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.

Запрос выглядит следующим образом (сетевые данные HTTP, показанные в Chrome - 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.

Ответ 1

Проблема заключалась в сочетании Firefox с jQuery/XMLHttpRequest и с отправкой объекта через HTTP DELETE. После того, как JSON'описывает объект через JSON.stringify(), все сработало.

Тем не менее, странное исключение для Firefox.

Благодаря freddyb для этой идеи.

Ответ 2

Проблема заключалась в свойстве processData в функции $.ajax. Когда это свойство предоставляется как "ложное" (не знаю почему) Firefox не нравится, и, как следствие, браузер не переваривает пакет запроса/ответа JSON. Chrome и Safari работают отлично.

Ответ 3

Это происходит (начиная с 2014 года с FireFox 32) с любым запросом без GET AJAX, когда объект запрос data является пустым объектом, например {}. Я использую Mithril.js, и это может быть связано с тем, что Mithril всегда задает запросы Content-Type для non GET. Это было абсолютно повторяемо, как только я узнал о спусковом крючке.

(Обратите внимание, что часть "не GET" может быть не совсем точной. Мифрил игнорирует объект данных, если он GET, поэтому отправка пустого объекта с помощью GET с использованием базового объекта AJAX также может завершиться неудачей таким же образом.)

Контр-интуитивно, установка data пустой строки, "", не прерывается таким образом, так что это была моя работа. На самом деле я не устанавливаю данные вообще, когда их нет, и если они не были удалены к моменту отправки запроса (в моей обертке AJAX), я по умолчанию нажимаю "".

Ответ 4

Похоже на то, что у вас установлено баггированное расширение Firefox, которое пытается проверить данные XMLHttpRequest и сбой....

Я предлагаю вам попробовать http://support.mozilla.org/en-US/kb/troubleshoot-firefox-issues-using-safe-mode или просто отключить все расширения Firefox.