#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
страницу, вы столкнетесь с междоменными проблемами из-за разных протоколов, которые они используют. Взгляните на ту же политику происхождения.