Одна из причин, по которой это так запутанно, заключается в том, что jQuery API путает проблему вызовов Ajax с вызовами JSONP. При использовании $.ajax
с dataType: 'jsonp'
это не делает Ajax-вызов (не используется связь XHR), вместо этого он использует динамическое внедрение сценария с обратным вызовом. Это означает, что type: 'POST'
не будет иметь смысла (поскольку динамическое внедрение сценария работает только так, как будет работать GET), и что все data
будут закодированы в URL запроса, а не отправлены как сообщение тело. Если это действительно предназначено для «POST» данных, то JSONP не должен использоваться (поскольку конфиденциальные данные будут отправлены в виде открытого текста).
Как упоминалось в одном из комментариев, этот вопрос был решен в этом ответе в отношении запросов JSONP из сценариев содержимого Chrome и использования XHR из сценария содержимого.
Запрос JSONP в расширении Chrome, функция обратного вызова не существует?
Что касается расширений Chrome, они заставляют вывести вас в песочницу при использовании «сценариев conten» в расширении Chrome. Вы можете удалить запрос формы dataType: 'jsonp'
в скрипте содержимого Chrome Extension, и этот вызов должен работать. Если это не сработает, вы можете попытаться сделать вызов напрямую, используя XHRHttpRequest:
var xhr = new XMLHttpRequest();
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
xhr.open("POST", $(this).attr('action'), true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
alert("A");
}
}
xhr.send($(this).serialize());
Что касается других браузеров, я не уверен, как каждая из их специфических сред плагинов обрабатывает междоменные вызовы XHR (или вообще разрешают ли они это). Это то, что НЕ допускается в обычных браузерах (если только не используется что-то вроде easyXDM ).