满足下面其中一个条件即要跨域:
- 协议不同
- 域名不同
- 端口不同
跨域的方式我总结了以下几种:
第一种:window.name
和<iframe>
标签实现跨域
<iframe>
标签的src
能跨域;window.name
属性值在文档刷新后依旧存在
使用
window.name的值是字符串形式,最大可2M。 服务器端://第一种php的代码echo '';
我没有采用php的,而是用node.js起了一个服务器,监听了90端口。 代码如下:
var http=require("http");http.createServer(function(req,res){ res.writeHead(200,{'Content-Type':'text/html'}); res.end("");}).listen(90);
将要返回的数据转化为字符串,赋值给window.name
(是在JavaScript代码中)
iframe
框架的src
如果不同源,则也无法操作框架里的任何东西,也就取不到iframe
框架的name
值了。所以要将iframe
再链接到与index.html同源的页面,才能获取它的window.name
值。 完成!
第二种:JSONP跨域
JSONP的最基本的原理是:动态添加一个<script>
标签,而<script>
标签的src
属性是没有跨域的限制的。 网上摘录的:
<script>
标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里。(动态执行回调函数) 使用: 服务端代码: //第一种php的代码$jsonp = $_GET["callback"];$str = $jsonp .'({name: xiaobai, age: 100})';echo $str;
这里我同样才用的是node.js的代码
代码如下:var http=require("http");var url = require("url");http.createServer(function(req,res){ var params = url.parse(req.url, true).query; res.writeHead(200,{'Content-Type':'text/html'}); var obj={ name:"xiaobai", age:100 } res.end(params.callback+"('"+JSON.stringify(obj)+"')");}).listen(90);
客户端代码:
完成!
第三种:html5的postMessage()跨域
window.postMessage
是一个安全的跨源通信的方法 otherWindow.postMessage(message, targetOrigin);
otherWindow是窗口引用,message将要发送到其他 window的数据,targetOrigin通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串"*
"(表示无限制)或者一个URI。这个大家可以去查一下api.
- message事件 调函数第一个参数接收 Event 对象,有三个常用属性:
- origin:消息来源地址
- source:发送消息的窗口对象
使用:
服务端:var http=require("http");http.createServer(function(req,res){ res.writeHead(200,{'Content-Type':'text/html'}); var obj={ name:"xiaobai", age:100 } obj=JSON.stringify(obj); res.end("");}).listen(90)
客户端:
完成!
第四种:CORS(跨域资源共享)
CORS是XMLHttpRequest Level 2 里规定的一种跨域方式。在支持这个方式的浏览器里,javascript的写法和不跨域的ajax写法一模一样,只要服务器需要设置Access-Control-Allow-Origin: *
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
var http=require("http");http.createServer(function(req,res){ var options={ 'Content-Type':'text/html', 'Access-Control-Allow-Origin':'http://localhost',//该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。 'Access-Control-Allow-Credentials':false,//该字段可选。它的值是一个布尔值,表示是否允许发送Cookie 'Access-Control-Allow-Methods':'GET,PUT,POST,DELETE,OPTIONS',//各种请求方式 'Access-Control-Allow-Headers':'X-Custom-Header'//该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段 } res.writeHead(200,options); var obj={ name:"xiaobai", age:100 } obj=JSON.stringify(obj); res.end(obj);}).listen(90)
客户端:
完成!