Почему этот jQuery.ajax не выдает ошибку?

#javascript #ajax #jquery

#javascript #ajax #jquery

Вопрос:

Сегодня утром у нас была интересная проблема — детали самой проблемы здесь неуместны, и я уже исправил это, но я столкнулся с чем-то странным, для меня, в jQuery.

Сайт, который я создаю внутри, работает только на https, поэтому Apache настроен на перенаправление любого входящего http-запроса на его эквивалент https. Это перенаправление работает нормально. Но у меня была ошибка в моем программном обеспечении, когда я пытался отправить следующий ajax-запрос:

 jQuery.ajax({  type:       "PUT",
           url:        "http://somewhere.com/cmdt/todo_lists/8457/toggle",
           data:       { deployment_id: 827},
           dataType:   "script"});
  

Я понимаю, что это приведет к сбою — я согласен с тем, что jQuery не хочет следовать перенаправлению. Но фактическое поведение еще более странное: я никогда не вижу, чтобы запрос xhr отправлялся вообще! И ошибки javascript нет! Это просто завершается сбоем, беззвучно. Если я изменяю URL на https или на относительный путь, он работает нормально, без проблем. Мой вопрос в том, почему он не пытался отправить запрос раньше? И почему это не вызвало ошибку?

Комментарии:

1. Вероятно, это срабатывает политика единого источника, которая беззвучно завершается сбоем. Вы должны получить ошибку в браузере, таком как Chrome, хотя

2. Это не jQuery, желающий следовать перенаправлению, это действие междоменной политики: вы не можете запросить (с помощью Ajax) https ресурс со http страницы, и наоборот.

Ответ №1:

Причина, по которой вы не получаете сбой, заключается в том, что это межсайтовый запрос, и поэтому вместо использования XMLHttpRequest он фактически генерирует HTML <script> тег и помещает его в DOM, и использует этот механизм для загрузки файла.

Это работает достаточно хорошо (учитывая, что это полный взлом ошибочных представлений о «безопасности» браузера), но, к сожалению, у jQuery нет способа перехватить ошибки на этом этапе. Скорее всего, вы получите сообщение об ошибке браузера, если у вас включен режим разработчика, но это все.

Комментарии:

1. Вы уверены, что он будет использовать тег script, если обнаружит, что он междоменный? Это кажется странным, я бы подумал, что он просто попытается отправить его и позволит браузеру отклонить его. Я полагаю, что jsonp работает так, как вы описали, но я не думал, что он автоматически сделает то же самое для междоменного запроса, отличного от jsonp.

2. @kingjiv: Я почти уверен, что для script jQuery избавляет разработчика от боли и обнаруживает. Для json / jsonp вы должны быть явными.

Ответ №2:

Если вы запустите это с URL, который https и попытаетесь открыть эквивалентную http страницу, вы столкнетесь с междоменными проблемами из-за разных протоколов, которые они используют. Взгляните на ту же политику происхождения.