2017-07-06 103 views
-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或什么?

+0

既然有人可能会提到这一点,那么我应该指出,在这种情况下,我无法控制正在进行跨域请求的服务器。我正在尝试加载跨域脚本,因此在服务器上执行诸如设置“Access-Control-Allow-Origin”到“*”的设置不是一个选项。 – Zerkeras

+6

以前的代码是否使用JSONP,其中通过脚本标记加载资源的URL?检查旧代码,看看它是否使用'数据类型:'在'$。阿贾克斯()'选项jsonp'',如果是的话,你将不得不改变周围的代码来处理这种类型的请求 –

+0

或任上使用代理您的服务器或第三方服务 – charlietfl

回答

0

我已经找到了解决这个。这个问题似乎源于尝试加载跨域脚本专门。 jQuery使用$ .getScript()来做到这一点,它实际上只是将一个脚本添加到页面上,而不是进行跨域HTTP请求。

我用这个代码,作为该功能的替代品。

function getScript (url, callback) { 
    var loadScript = function (url, callback) { 
     var scrpt = document.createElement("script"); 
     scrpt.setAttribute("type", "text/javascript"); 
     scrpt.src = url; 
     scrpt.onload = function() { 
      scrpt.parentNode.removeChild(scrpt); 
      console.log("Script is ready, firing callback!"); 
      if (callback) 
       callback(); 
     }; 

     document.body.appendChild(scrpt); 
    } 

    var isReady = setInterval(function() { 
     console.log(document.body); 
     if (document.body) { 
      clearInterval(isReady); 
      loadScript(url, callback); 
     } 
    }, 25); 
}