利用script标签实现的跨域名AJAX请求(ExtJS)
在AJAX应用环境中,由于安全的原因,浏览器不允许XMLHttpRequest组件请求跨域资源。在很多情况下,这个限制给我来带来的诸多不便。很多同行,研究了各种各样的解决方案:1.通过修改document.domain和隐藏的IFrame来实现跨域请求。这种方案可能是最简单的一种跨域请求的方案,但是它同样是一种限制最大的方案。首先,它只能实现在同一个顶级域名下的跨域请求;另外,当在一个页面中还包含有其它的IFrame时,可能还会产生安全性异常,拒绝访问。
2.通过请求当前域的代理,由服务器代理去访问另一个域的资源。XMLHttpRequest通过请求本域内的一个服务器资源,将要访问的目标资源提供给服务器,交由服务器去代理访问目标资源。这种方案,可以实现完全的跨域访问,但是开发,请求过程的消费会比较大。
3.通过HTML中可以请求跨域资源的标签引用来达到目的,比如Image,Script,LINK这些标签。在这些标签中,Script无疑是最合适的。在请求每一个脚本资源时,浏览器都会去解析并运行脚本文件内定义的函数,或需要马上执行的JavaScript代码,我们可以通过服务器返回一段脚本或JSON对象,在浏览器解析执行,从而达到跨域请求的目的。使用script标签来实现跨域请求,只能使用get方法请求服务器资源。并且传参的长度也受到地址栏长度的限制。
这里,我们来介绍第三种方案。先来看一段在网络上找到的例子(具体来源已经不得而知了,如果有人知道请提供原文链接,谢谢):
JavaScript:
<div style=""><div style=""> 1: var scriptBlock = document.createElement("script"); 2: 3: function StartGet() 4: { 5: scriptBlock.src = ""; 6: scriptBlock.src = "http://Domain2/GetData.aspx"; 7: scriptBlock.type = "text/javascript"; 8: scriptBlock.language = "javascript"; 9: document.getElementsByTagName("head").appendChild(scriptBlock);10: scriptBlock.onreadystatechange = ReturnData;11: }12: 13: function ReturnData()14: {15: //alert(scriptBlock.readyState);16: 17: //uninitialized Object is not initialized with data. 18: //loading Object is loading its data. 19: //loaded Object has finished loading its data. 20: //interactive User can interact with the object even though it is not fully loaded. 21: //complete Object is completely initialized. 22: 23: if("loaded" == scriptBlock.readyState)24: {25: var div = document.getElementById("htmldiv");26: div.innerHTML = a.project.name; //a是返回的json里面的变量27: } 28: }
页:
[1]