Запросы jQuery Ajax отменяются без отправки


87

Я пытаюсь подключить сценарий к приложению Microsoft World-Wide Telescope. Последний прослушивает порт 5050 для команд. Он работает на том же компьютере, что и браузер (сейчас Chrome, но, насколько я могу судить, поведение такое же, как в Firefox 7 и IE 9).

Я отправляю заголовок «Access-Control-Allow-Origin: *» с исходным файлом html, чтобы попытаться устранить ограничения XSS как мою проблему.

Мой код для доступа к WWT следующий:

$.ajax({
    type: 'POST',
    url: url,
    data: data,
    crossDomain: true,
    success: success,
    dataType: dataType
});

url в данном случае - «http: //127.0.0.1: 5050 / layerApi.aspx? cmd = new & ...» (очевидно ... здесь сокращенное обозначение некоторых дополнительных параметров).

Посмотрев сетевую диагностику в Chrome, я вижу следующее:

Request URL:http://127.0.0.1:5050/layerApi.aspx?cmd=new&...
Request Headersview source
Accept:application/xml, text/xml, */*; q=0.01
Content-Type:application/x-www-form-urlencoded
Origin:http://gwheeler4
Referer:http://gwheeler4/conceptconnect.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1

Запрос уходит - вижу, WWT создает новый слой. Однако я не получаю обратного звонка. Если я добавляю обратный вызов ошибки, который вызывается, но свойство error в объекте jqXHR просто "error", а статус равен 0. Если я смотрю сетевой запрос в Chrome, я вижу "(отменен)" в качестве статуса и никакого ответа .

Если я возьму тот же URL и вставлю его в новую вкладку браузера, я увижу, что ответ является ожидаемым XML.

Конечно, разница здесь в том, что это GET, а не POST, но я пробовал это в своем скрипте, и это не имеет значения.

Я очень озадачен этим и буду благодарен за любые свежие идеи.


Вы пытались обработать errorобратный вызов, чтобы увидеть, возвращается ли он с ошибкой?
— StriplingWarrior

1
«Я отправляю заголовок« Access-Control-Allow-Origin: * »с исходным файлом html, чтобы попытаться устранить ограничения XSS как мою проблему». Вы имеете в виду, что сервер отправляет обратно заголовок Access-Control-Origin? Или вы отправляете его вместе с запросом Ajax?
— Джейсон Дин

попробуйте получить доступ к странице напрямую через URL-адрес и посмотрите, получаете ли вы какие-либо
— выходы

1
Да, я получаю обратный вызов об ошибке с текстом состояния "" и кодом 0. Это не проблема jQuery; Я переписал код, используя прямой XHR, и получил тот же результат - т.е. состояние готовности 4 с нулевым запросом.status и пустым request.responseText. Заголовок Access-Control-Allow-Origin отправляется сервером. Доступ к странице напрямую через URL возвращает ожидаемый ответ XML.
— Грэм Уиллер,

Ответы:


134

Если кто-то еще сталкивается с этим, проблема, которая у нас была, заключалась в том, что мы выполняли запрос ajax из ссылки и не препятствовали переходу по ссылке. Поэтому, если вы делаете это в onclickатрибуте, обязательно сделайте return false;это.


Это сработало и для меня. Спасибо. Я забыл, почему я возвращал false в своем обработчике onClick, и изменил его на true, и после прочтения вашего сообщения меня внезапно осенило.
— Shiprack

4
Кроме того, если вы используете форму, вам необходимо добавить return falseв конец onsubmitатрибута.
— Джейсон Аксельсон

8
@VincentClyde "return false;"сообщает формам и ссылкам прервать действие. Первоначально это было предназначено для проверки формы javascript, где функция проверки возвращала бы false, если форма была недопустимой, останавливая отправку формы.
— Tyzoid

13
Вы также можете использовать e.preventDefault();, где e- onclickпараметр события.
— Hannele

1
@Hannele Большое спасибо за то, что поделились event.preventDefault. Мне это так было нужно. Я не вижу другого ответа на это. Вы должны опубликовать это как отдельный ответ.
— Mohit

112

Если вы используете Chrome, вы не видите достаточно информации на стандартной сетевой панели Chrome, чтобы определить основную причину (canceled)запроса.

Вам необходимо использовать, chrome://net-internals/#eventsкоторый покажет вам кровавые детали отправляемого вами запроса, включая скрытые перенаправления / информацию о безопасности об отправленных файлах cookie и т. Д.

например, следующее показывает перенаправление, которое я не видел в трассировке сети, вызванное тем, что мои файлы cookie не отправляются через поддомен:

t=1374052796448 [st=  1]   +URL_REQUEST_START_JOB  [dt=261]
                            --> load_flags = 143540481 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VALIDATE_CACHE | VERIFY_EV_CERT)
                            --> method = "GET"
                            --> priority = 2
                            --> url = "https://...."
...
t=1374052796708 [st=261]        HTTP_TRANSACTION_READ_RESPONSE_HEADERS
                                --> HTTP/1.1 302 Moved Temporarily
                                    Content-Type: text/html
                                    Date: Wed, 17 Jul 2013 09:19:56 GMT
...
t=1374052796709 [st=262]     +URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=0]
t=1374052796709 [st=262]        CANCELLED
t=1374052796709 [st=262]   -URL_REQUEST_START_JOB
                            --> net_error = -3 (ERR_ABORTED)

У меня тоже есть (отмененная) проблема. @Ben, было круто узнать об этом следе, к сожалению, он не предоставил никакой информации. Сервер в моем случае - S3, и на моем ведре настроен cors. Все, что я делаю, - это простой GET для изображения. Я вижу в сетевой панели запрос с заголовком Origin, но без ответа. Видимо Chrome отменяет запрос перед отправкой на сервер. Ни перенаправлений, ни https, ни длины контента 0. Целый день бить головой, все еще загадка.
— Джин Вайнгриб

@GeneVayngrib Попробуйте Firefox - сетевой отладчик напрямую покажет дополнительную информацию - вы можете решить проблему там, а затем заставить ее работать в Chrome.
— Бен Уолдинг,

@BenW, спасибо, но у Firefox нет проблем с этим изображением, которое подается из Amazon S3.
— Джин Вайнгриб

YUPP. Это очень помогло!
— rubmz 06

21

В моем случае у меня было type='submit'это, когда я отправлял форму, страница перезагружалась до того, как произошло попадание ajax, поэтому было простое решение type="button". Если вы не укажете тип, он будет submitпо умолчанию, поэтому вам необходимо указатьtype="button"

type='submit' => type='button'

ИЛИ

Нет типа => type='button'


3
некро размещение здесь, подайте в суд на stackoverflow. Я весь день искал повсюду, почему мой запрос работает с консоли, а не скрипт, и это был ответ .. спасибо !!!
— pcort

1
Я вошел в систему и снова нашел эту ветку, чтобы проголосовать за этот ответ !!, это очень помогло. часами
— ломал

Джай Шри Кришна, надеюсь, это поможет многим прийти. И они выясняют раньше.
— Black Mamba

6

У меня была аналогичная проблема. В моем случае я пытаюсь использовать веб-сервис на сервере apache + django (сервис был написан мной). У меня был тот же результат, что и у вас: Chrome говорит, что он был отменен, а FF делает это нормально. Если бы я попытался получить доступ к сервису непосредственно в браузере вместо ajax, он тоже сработал бы. Погуглил, я обнаружил, что некоторые новые версии apache неправильно устанавливали длину ответа в заголовках ответов, поэтому я сделал это вручную. С django все, что мне нужно было сделать, это:

response['Content-Length'] = len(content)

Если у вас есть контроль над службой, к которой вы пытаетесь получить доступ, узнайте, как изменить заголовок ответа на платформе, которую вы используете, в противном случае вам придется связаться с поставщиком услуг, чтобы решить эту проблему. Судя по всему, FF и многие другие браузеры могут правильно справиться с этой ситуацией, но дизайнеры Chrome решили сделать это, как указано.


Я попытался установить заголовок длины содержимого, но проблема все еще та же, что и в исходном вопросе. Я использую PHP 5.3.8 и Apache 2.2.21 (использую WAMP в Windows 7)
— rodrigo-silveira

4

У меня была аналогичная проблема. Используя события chrome: // net-internals / #, я смог увидеть, что моя проблема связана с каким-то тихим перенаправлением. Мой запрос на получение запускался в сценарии загрузки. URL-адрес имел форму « http://example.com/inner-path », а 301 постоянно перенаправлял на «/ inner-path». Чтобы решить эту проблему, я просто изменил URL-адрес на «/ inner-path», и это устранило проблему. Я до сих пор не знаю, почему скрипт, который работал неделю назад, внезапно вызвал у меня проблемы ... Надеюсь, это кому-то поможет.


3

(Использование веб-форм ASP.NET)

Моя проблема заключалась в том, что я пытался запустить Ajax из события щелчка кнопки отправки, у которой была настройка события щелчка на стороне сервера. Мне пришлось сделать кнопку простой кнопкой (т.е. <input type="button">)


Большое спасибо.
— Фархин Нилофер 01

3

У меня была такая же проблема, для меня я создавал iframe для временного использования, и я удалял iframe до завершения ajax, поэтому браузер отменил мой запрос ajax.


Как вы решили эту проблему? Мой сайт встраивается в iFrame, не контролируемый мной. Я хочу, чтобы мой вызов был завершен, поскольку он выполняет некоторые настройки фоновых данных
— Rips

@Rips, это 4 года назад, в любом случае, я думаю, что решил это с помощью Promises
— Реза

3

Расширяя ответ @ Kazetsukai, вы можете столкнуться с этой проблемой, если вы делаете запрос AJAX от пользователя, нажимающего на ссылку.

Если вы настроите свою ссылку так:

<a href="#" onclick="soAjax()">click me!</a>

А затем обработчик javascript, подобный следующему:

soAjax() {
    $.ajax({ ... all your lovely parameters ... });       
}

Чтобы ваш браузер не переходил по ссылке и отменял любые выполняющиеся запросы, вы должны добавить return falseили e.preventDefault()остановить распространение события click:

soAjax() {
   $.ajax({ ... etc ... });
   return false;
}

Или:

soAjax(e) {
   $.ajax({ ... etc ... });
   e.preventDefault();
}

2

Когда запрос AJAX отбрасывается (если не запрос Cross-Origin), есть две возможности:

  1. Вы не препятствуете поведению элемента по умолчанию для события.
  2. Вы установили слишком малое время ожидания AJAX, или внутренний сервер сети / приложения работает медленно.

Решение для 1) : Добавить return false;или e.preventDefault();в обработчике событий.

Решение для 2) : Добавить параметр тайм-аута при формировании запроса AJAX. Пример ниже.

$.ajax({
    type: 'POST',
    url: url,
    timeout: 86400,
    data: data,
    success: success,
    dataType: dataType
});

Для запросов из разных источников проверьте заголовки HTTP для совместного использования ресурсов между источниками (CORS).


1

Я получил эту ошибку при выполнении запроса с использованием http на URL-адрес, для которого требуется https. Я предполагаю, что вызов ajax не обрабатывает перенаправление. Это так, даже если для параметра crossDomain ajax установлено значение true (в JQuery 1.5.2).


0

В моем случае мод-перезапись Apache соответствовала URL-адресу и перенаправляла запрос на https.

Посмотрите запрос в chrome: // net-internals / # events.

Он покажет внутренний журнал запроса. Проверить перенаправления.


0

У меня была такая же проблема, но в моем случае это была проблема с файлами cookie. Ребята, работающие над серверной частью, изменили путь к файлу cookie JSESSIONID, который устанавливается при входе в наше приложение, и на моем компьютере был старый файл cookie с таким именем, но со старым путем. Поэтому, когда я попытался войти в браузер (Chrome), отправил на сервер два файла cookie с именем JSESSIONID с разными значениями, что, по понятным причинам, смутило его, поэтому он отменил запрос. Это исправило удаление файлов cookie с моего компьютера.


0

У меня была эта ошибка более жутким образом: вкладка сети и события chrome: // net-internals / # не отображали запрос после завершения js. При приостановке js в callcack ошибки на вкладке сети отображался запрос как (отменен). Постоянно вызывался ровно один (всегда один и тот же) из нескольких похожих запросов на веб-странице. После перезапуска Chrome ошибка больше не возникала!


0

У меня был отменен в Firefox . Некоторые ajax-вызовы у меня работают отлично, но у коллеги, которому действительно пришлось его использовать, не получилось.

Когда я проверил это с помощью упомянутых выше приемов Chrome, я не обнаружил ничего подозрительного. При проверке в firebug он показывал анимацию загрузки после двух малозначительных вызовов и без вкладки результатов.

Решение было мега простым: зайти в историю, найти сайт, щелкнуть правой кнопкой мыши -> забыть сайт.
Забудьте, а не удалите.

После этого проблем больше нет. Я предполагаю, что это как-то связано с .htaccess.


0

В моем случае это была отсутствующая косая черта в конце URL. Добавление косой черты в конце решило мою проблему.


0

Для случая Dropzone.js. В моем случае это было вызвано тем, что значение timeoutпараметра по умолчанию было слишком низким. Так что увеличивайте его по своим потребностям.

{
// other dropzone options
timeout: 60000 * 10, // 10 minutes
...
}

-1

У меня была эта проблема с конкретной сетью 3G.
Он всегда терпел неудачу при запросах DELETE сnet_error = -101 событиями chrome: // net-internals / #.

Другие сети работали нормально, поэтому я предполагаю, что это был неисправный прокси-сервер или что-то в этом роде.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.