怎么做一考试网站,wordpress 缓存插件,seo入门基础教程,买网站账号做推广这里说的js跨域是指通过js在不同的域之间进行数据传输或通信#xff0c;比如用ajax向一个不同的域请求数据#xff0c;或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同#xff0c;都被当作是不同的域。 下表给出了相对http://store.… 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信比如用ajax向一个不同的域请求数据或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同都被当作是不同的域。 下表给出了相对http://store.company.com/dir/page.html同源检测的结果: 要解决跨域的问题我们可以使用以下几种方法 一、通过jsonp跨域 在js中我们直接用XMLHttpRequest请求不同域上的数据时是不可以的。但是在页面上引入不同域上的js脚本文件却是可以的jsonp正是利用这个特性来实现的。 比如有个a.html页面它里面的代码需要利用ajax获取一个不同域上的json数据假设这个json数据地址是http://example.com/data.php,那么a.html中的代码就可以这样 我们看到获取数据的地址后面还有一个callback参数按惯例是用这个参数名但是你用其他的也一样。当然如果获取数据的jsonp地址页面不是你自己能控制的就得按照提供数据的那一方的规定格式来操作了。 因为是当做一个js文件来引入的所以http://example.com/data.php返回的必须是一个能执行的js文件所以这个页面的php代码可能是这样的: 最终那个页面输出的结果是: 所以通过http://example.com/data.php?callbackdosomething得到的js文件就是我们之前定义的dosomething函数,并且它的参数就是我们需要的json数据这样我们就跨域获得了我们需要的数据。 这样jsonp的原理就很清楚了通过script标签引入一个js文件这个js文件载入成功后会执行我们在url参数中指定的函数并且会把我们需要的json数据作为参数传入。所以jsonp是需要服务器端的页面进行相应的配合的。 知道jsonp跨域的原理后我们就可以用js动态生成script标签来进行跨域操作了而不用特意的手动的书写那些script标签。如果你的页面使用jquery那么通过它封装的方法就能很方便的来进行jsonp操作了。 原理是一样的只不过我们不需要手动的插入script标签以及定义回掉函数。jquery会自动生成一个全局函数来替换callback?中的问号之后获取到数据后又会自动销毁实际上就是起一个临时代理函数的作用。$.getJSON方法会自动判断是否跨域不跨域的话就调用普通的ajax方法跨域的话则会以异步加载js文件的形式来调用jsonp的回调函数。 2、通过修改document.domain来跨子域 浏览器都有一个同源策略其限制之一就是第一种方法中我们说的不能通过ajax的方法去请求不同源中的文档。 它的第二个限制是浏览器中不同域的框架之间是不能进行js的交互操作的。有一点需要说明不同的框架之间父子或同辈是能够获取到彼此的window对象的但蛋疼的是你却不能使用获取到的window对象的属性和方法(html5中的postMessage方法是一个例外还有些浏览器比如ie6也可以使用top、parent等少数几个属性)总之你可以当做是只能获取到一个几乎无用的window对象。比如有一个页面它的地址是http://www.example.com/a.html 在这个页面里面有一个iframe它的src是http://example.com/b.html, 很显然这个页面与它里面的iframe框架是不同域的所以我们是无法通过在页面中书写js代码来获取iframe中的东西的 这个时候document.domain就可以派上用场了我们只要把http://www.example.com/a.html 和 http://example.com/b.html这两个页面的document.domain都设成相同的域名就可以了。但要注意的是document.domain的设置是有限制的我们只能把document.domain设置成自身或更高一级的父域且主域必须相同。例如a.b.example.com 中某个文档的document.domain 可以设成a.b.example.com、b.example.com 、example.com中的任意一个但是不可以设成 c.a.b.example.com,因为这是当前域的子域也不可以设成baidu.com,因为主域已经不相同了。 在页面 http://www.example.com/a.html 中设置document.domain: 在页面 http://example.com/b.html 中也设置document.domain而且这也是必须的虽然这个文档的domain就是example.com,但是还是必须显示的设置document.domain的值 这样我们就可以通过js访问到iframe中的各种属性和对象了。 不过如果你想在http://www.example.com/a.html 页面中通过ajax直接请求http://example.com/b.html 页面即使你设置了相同的document.domain也还是不行的所以修改document.domain的方法只适用于不同子域的框架间的交互。如果你想通过ajax的方法去与不同子域的页面交互除了使用jsonp的方法外还可以用一个隐藏的iframe来做一个代理。原理就是让这个iframe载入一个与你想要通过ajax获取数据的目标页面处在相同的域的页面所以这个iframe中的页面是可以正常使用ajax去获取你要的数据的然后就是通过我们刚刚讲得修改document.domain的方法让我们能通过js完全控制这个iframe这样我们就可以让iframe去发送ajax请求然后收到的数据我们也可以获得了。 3、使用window.name来进行跨域 window对象有个name属性该属性有个特征即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的每个页面对window.name都有读写的权限window.name是持久存在一个窗口载入过的所有页面中的并不会因新页面的载入而进行重置。 比如有一个页面a.html,它里面有这样的代码 再看看b.html页面的代码 a.html页面载入后3秒跳转到了b.html页面结果为 我们看到在b.html页面上成功获取到了它的上一个页面a.html给window.name设置的值。如果在之后所有载入的页面都没对window.name进行修改的话那么所有这些页面获取到的window.name的值都是a.html页面设置的那个值。当然如果有需要其中的任何一个页面都可以对window.name的值进行修改。注意window.name的值只能是字符串的形式这个字符串的大小最大能允许2M左右甚至更大的一个容量具体取决于不同的浏览器但一般是够用了。 上面的例子中我们用到的页面a.html和b.html是处于同一个域的但是即使a.html与b.html处于不同的域中上述结论同样是适用的这也正是利用window.name进行跨域的原理。 下面就来看一看具体是怎么样通过window.name来跨域获取数据的。还是举例说明。 比如有一个www.example.com/a.html页面,需要通过a.html页面里的js来获取另一个位于不同域上的页面www.cnblogs.com/data.html里的数据。 data.html页面里的代码很简单就是给当前的window.name设置一个a.html页面想要得到的数据值。data.html里的代码 那么在a.html页面中我们怎么把data.html页面载入进来呢显然我们不能直接在a.html页面中通过改变window.location来载入data.html页面因为我们想要即使a.html页面不跳转也能得到data.html里的数据。答案就是在a.html页面中使用一个隐藏的iframe来充当一个中间人角色由iframe去获取data.html的数据然后a.html再去得到iframe获取到的数据。 充当中间人的iframe想要获取到data.html的通过window.name设置的数据只需要把这个iframe的src设为www.cnblogs.com/data.html就行了。然后a.html想要得到iframe所获取到的数据也就是想要得到iframe的window.name的值还必须把这个iframe的src设成跟a.html页面同一个域才行不然根据前面讲的同源策略a.html是不能访问到iframe里的window.name属性的。这就是整个跨域过程。 看下a.html页面的代码 上面的代码只是最简单的原理演示代码你可以对使用js封装上面的过程比如动态的创建iframe,动态的注册各种事件等等当然为了安全获取完数据后还可以销毁作为代理的iframe。网上也有很多类似的现成代码有兴趣的可以去找一下。 通过window.name来进行跨域就是这样子的。 4、使用HTML5中新引进的window.postMessage方法来跨域传送数据 window.postMessage(message,targetOrigin) 方法是html5新引进的特性可以使用它来向其它的window对象发送消息无论这个window对象是属于同源或不同源目前IE8、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。 调用postMessage方法的window对象是指要接收消息的那一个window对象该方法的第一个参数message为要发送的消息类型只能为字符串第二个参数targetOrigin用来限定接收消息的那个window对象所在的域如果不想限定域可以使用通配符 * 。 需要接收消息的window对象可是通过监听自身的message事件来获取传过来的消息消息内容储存在该事件对象的data属性中。 上面所说的向其他window对象发送消息其实就是指一个页面有几个框架的那种情况因为每一个框架都有一个window对象。在讨论第二种方法的时候我们说过不同域的框架间是可以获取到对方的window对象的而且也可以使用window.postMessage这个方法。下面看一个简单的示例有两个页面 我们运行a页面后得到的结果: 我们看到b页面成功的收到了消息。 使用postMessage来跨域传送数据还是比较直观和方便的但是缺点是IE6、IE7不支持所以用不用还得根据实际需要来决定。 结语 除了以上几种方法外还有flash、在服务器上设置代理页面等跨域方式这里就不做介绍了。 以上四种方法可以根据项目的实际情况来进行选择应用个人认为window.name的方法既不复杂也能兼容到几乎所有浏览器这真是极好的一种跨域方法。