Запросы 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.