JavaScript XMLHttpRequest с использованием JsonP
Я хочу отправить параметры запроса в другой домен
Я уже знаю, что Cross Scripting нужен JsonP, и я использовал JsonP с Jquery ajax
но я не понимаю, как сделать Cross Scripting как использование XMLHttpRequest
следующий код моего базового кода XMLHttpRequest.
Думаю, мне нужно chage xhr.setRequestHeader()
, и мне нужно добавить код разбора
пожалуйста, дайте мне любую идею
var xhr;
function createXMLHttpRequest(){
if(window.AtiveXObject){
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}else{
xhr = new XMLHttpRequest();
}
var url = "http://www.helloword.com";
}
function openRequest(){
createXMLHttpRequest();
xhr.onreadystatechange = getdata;
xhr.open("POST",url,true);
xhr.setRequestHeader("Content-Type",'application/x-www-form-urlencoded');
xhr.send(data);
}
function getdata(){
if(xhr.readyState==4){
if(xhr.status==200){
var txt = xhr.responseText;
alert(txt);
}
}
}
Ответы
Ответ 1
JSONP не использует XMLHttpRequests.
Причиной использования JSONP является преодоление ограничений XHR с кросс-началом.
Вместо этого данные извлекаются через script.
function jsonp(url, callback) {
var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());
window[callbackName] = function(data) {
delete window[callbackName];
document.body.removeChild(script);
callback(data);
};
var script = document.createElement('script');
script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName;
document.body.appendChild(script);
}
jsonp('http://www.helloword.com', function(data) {
alert(data);
});
В интересах простоты это не включает обработку ошибок, если запрос терпит неудачу. Используйте script.onerror
, если вам это нужно.
Ответ 2
Я знаю, что вы уже получили ответ на этот вопрос, но если кто-то еще здесь хотел бы получить пример использования обещаний.
function jsonp(url) {
return new Promise(function(resolve, reject) {
let script = document.createElement('script')
const name = "_jsonp_" + Math.round(100000 * Math.random());
//url formatting
if (url.match(/\?/)) url += "&callback="+name
else url += "?callback="+name
script.src = url;
window[name] = function(data) {
resolve(data);
document.body.removeChild(script);
delete window[name];
}
document.body.appendChild(script);
});
}
var data = jsonp("https://www.google.com");
data.then((res) => {
console.log(res);
});
Ответ 3
function JsonpHttpRequest(url, callback) {
var e = document.createElement('script');
e.src = url;
document.body.appendChild(script); // fyi remove this element later /assign temp class ..then .remove it later
//insetead of this you may also create function with callback value and use it instead
window[callback] = (data) => {
console.log(data); // heres you data
}
}
// heres how to use
function HowTouse(params) {
JsonpHttpRequest("http://localhost:50702/api/values/Getm?num=19&callback=www", "www")
}
Ответ 4
Для Google API я был вынужден использовать callback
а также параметр v=1.0
- вот версия обещания. Без параметра v = 1.0 я получаю ошибку CORB (для моей версии, а также для другого кода ответов - однако jQuery $.ajax
с dataType: "jsonp"
добавляют этот параметр - поэтому я тоже его добавляю и начинаю работать)
Блокировка чтения из разных источников (CORB) заблокировала ответ из нескольких источников в https://ajax.googleapis.com/ajax/services/feed/load?callback=jsonp1555427800677 с текстом MIME text/javascript. См. Https://www.chromestatus.com/feature/5629709824032768 для получения дополнительной информации.
function jsonp(url) {
return new Promise(function(resolve, reject) {
var s = document.createElement('script');
var f="jsonp"+(+new Date()), b=document.body;
window[f] = d=>{ delete window[f]; b.removeChild(s); resolve(d); };
s.src='${url}${url.includes('?')?'&':'?'}callback=${f}&v=1.0';
b.appendChild(s);
})
}
async function send() {
let r = await jsonp("http://ajax.googleapis.com/ajax/services/feed/load");
console.log(r);
}
<button onclick="send()">Send JSONP</button>
Ответ 5
Вы не можете выполнить Cross Scripting с помощью XMLHttpRequest. Если вы хотите перекрещиваться с доменом без JQuery, вы должны создать новый script node и установить для него атрибут src.