跨域的理解,以及解决办法。
什么是跨域?
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子:
http://www.111.com/index.html 调用 http://www.123.com/server.php (非跨域)
http://www.222.com/index.html 调用 http://www.456.com/server.php (主域名不同:123/456,跨域)
http://abc.111.com/index.html 调用 http://def.111.com/server.php (子域名不同:abc/def,跨域)
http://www.111.com:8080/index.html 调用 http://www.111.com:8081/server.php (端口不同:8080/8081,跨域)
http://www.111.com/index.html 调用 https://www.111.com/server.php (协议不同:http/https,跨域)
请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。
浏览器执行javascript脚本时,会检查这个脚本属于哪个页面,如果不是同源页面,就不会被执行。
由于js同源策略的影响,当在某一域名下请求其他域名,或者同一域名,不同端口下的url时,就会变成不被允许的跨域请求。
那这个时候通常怎么解决呢:
1.JavaScript
在原生js(没有jQuery和ajax支持)的情况下,通常客户端代码是这样的(我假设是在localhost:8080的端口下的http://localhost:8080/webs/i.mediapower.mobi/wutao/index.html页面的body标签下面加入以下代码):
保存,浏览器打开http://localhost:8080/webs/i.mediapower.mobi/wutao/index.html,并且打开console控制台:

浏览器很无情的给你弹出一个同源限制的错误,意思就是你无法跨域请求url的数据。
那么,我先采取第一种策略,运用html中的script标签,插入js脚本:
(1)通过script标签引用,写死你需要的src的url地址,比如:
这里我定义一个callbackfunction的函数,然后用script标签的src属性跨域请求数据,那么,test.js的内容经过约定,需要写成这样:
callbackfunction({"name":"wwwwwwwwwwww"});
保存,打开index.html并刷新:

(2)你也可以动态的加入script标签,让html解析的时候,动态的加载script脚本,并请求远端数据:
结果和上面一样。

2.jQuery中的$.ajax()
设想,当你想要使用jQuery请求跨域数据的时候,比如(还是刚才的index.html):
浏览器还是无情的报错,因为你这个url是不同的域名下的。
那么既然jQuery封装了ajax方法,我们为何不用,人家封装好了,你不用,岂不是找罪受么,代码如下:

当你作了这么多挑逗工作之后,浏览器很爽快的给出了反应,表示它很爽,返回给了你一个对象,里面是远端不同域名下test.js中的数据。
3.postMessage+iframe
postMessage是HTML5中新增加的功能,比如我在本地域名下,http://192.168.1.152:8080/webs/i.mediapower.mobi/wutao/testa.html中的testa.html中:
此时,我远端的testb.html里面的内容应该是这样:
保存代码,打开本地testa.html,访问远端的testb.html

总结了一下,jQuery还是非常的好用的,基本上js能干的事情,jQuery都能非常快速并且高效的完成。
浙公网安备 33010602011771号