-2
我在一个Web项目,其中使用jQuery(或其他库/依赖)是不是一种选择,所以我试图复制jQuery使用,使AJAX代码要求。该项目以前使用jQuery,所以我已经将替换结构构建到$ .ajax()方法中,以获得相同的行为,但是我无法获取我的跨域请求。例如,当试图在脚本中加载时,我在控制台中出现此错误。不能使跨域请求,而jQuery的
XMLHttpRequest cannot load <URL>. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin <URL> is therefore not allowed access.
我熟悉CORS和整个跨域的安全策略和什么需要,但我感到困惑的是jQuery的如何似乎规避,而我的代码不能。我在想一定有什么特别的jQuery在做什么?
这是我的$。阿贾克斯()替换功能目前是如何脚本。
function ajax (options) {
var request = new XMLHttpRequest();
if ("withCredentials" in request)
request.withCredentials = false;
else if (typeof XDomainRequest !== "undefined")
var request = new XDomainRequest();
options.type = options.type || options.method || "GET";
request.open(options.type.toUpperCase(), options.url, true);
for (var i in options.headers) {
request.setRequestHeader(i, options.headers[i]);
}
if (typeof options.beforeSend == "function")
var go = options.beforeSend(request, options);
if (go == false)
return false;
request.onreadystatechange = function() {
if (this.readyState === XMLHttpRequest.DONE) {
var resp = this.responseText;
try {
var body = JSON.parse(resp);
this.responseJSON = body;
}
catch (err) {
var body = resp;
}
if (this.status < 300 && typeof options.success == "function")
options.success(body, this.status, this);
else if (typeof options.error == "function")
options.error(this, this.status, body);
if (typeof options.complete == "function")
options.complete(this, this.status);
}
};
if (typeof options.data == "object" && options.data !== null)
options.data = JSON.stringify(options.data);
if (options.type.toUpperCase() != "GET")
request.send(typeof options.data !== "undefined" ? options.data : null);
else
request.send();
return request;
}
有人可以指出,如果我失去了明显的东西?我是否需要手动执行OPTIONS pre-flight或什么?
既然有人可能会提到这一点,那么我应该指出,在这种情况下,我无法控制正在进行跨域请求的服务器。我正在尝试加载跨域脚本,因此在服务器上执行诸如设置“Access-Control-Allow-Origin”到“*”的设置不是一个选项。 – Zerkeras
以前的代码是否使用JSONP,其中通过脚本标记加载资源的URL?检查旧代码,看看它是否使用'数据类型:'在'$。阿贾克斯()'选项jsonp'',如果是的话,你将不得不改变周围的代码来处理这种类型的请求 –
或任上使用代理您的服务器或第三方服务 – charlietfl