模拟数据交互系列之七--跨域问题
跨域问题
在说跨域这个问题之前我什么需要了解什么是 同源
同源
同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。
跨域
不同源则跨域
我们来举一个例子
code block
跨域的解决办法
利用这个iframe标签(这个可以看另一个文件夹)
- 顶级域名相同的可以通过domain.name来解决,即同时设置 domain.name = 顶级域名(如example.com)
- document.domain + iframe(比较重要)
- window.name + iframe
- location.hash + iframe
- window.postMessage()
具体的实现
因为是同域名:协议,端口,域名相同的情况下,我是可以去访问
另一个页面中的里面的资源
|
|
jsonp
JSON with Padding
原理剖析
其本质是利用了和link标签页
是可以用来访问另一个网站的样式.标签具有可跨域的特性,由服务端 返回一个预先定义好的Javascript函数的调用,并且将服务器数据以该函数参数的形式传递过来,此方法需要前后端配合完成。
- 只能以GET方式请求
具体的实现
|
|
jq 中的一些请求
jQuery 的$.ajax()方法
当中集成了JSONP的实现,可以非常方便的实现跨域数据的访问。
dataType: ‘jsonp’ 设置dataType值为jsonp即开启跨域访问
jsonp 可以指定服务端接收的参数的“key”值,默认为callback
jsonpCallback 可以指定相应的回调函数,默认自动生成
实现不从缓存中读取数据:本代码端中的最后几行注释中就有说明这个问题
$getScript(url,function(){})
123456789101112131415161718192021$(function(){$("#buttonId").click(function(){//getScript 从在面上面去理解我们是获取一段js 脚本.//我假设我的页面非常庞大,我不可能一次性把所有的当前页面的这些//内容全部加载完毕,只有需要使用到的时候才去记载//我们ajax 可以用来做性能优化.//我调用这个方法getScript 方法,然后底层是给//js/script.js 发送一个请求.//它这个是用来处理浏览器缓存的$.getScript("js/script.js");//当我点击button 我给js/script.js发送请求//当我再次点击button 我又去请求js/script.js//浏览器会有一些默认行为.//当我现在请求的地址js/script.js跟我上次请求的地址js/script.js//一样的时候,这个时候浏览器就不会去请求服务器.//jQuery 怎么去帮我做js/script.js?_=1474683550796//第二次请求地址js/script.js?_=1474683577792//浏览器就不会从缓存里面去找了,就会每次都去请求js/script.js})});$.ajax
12345678910111213$.ajax({url:"https://sug.so.360.cn/suggest?callback=suggest_so&encodein=utf-8&encodeout=utf-8&format=json&fields=word,obdata&word=z",type:"get",//默认是使用xmlhttpRequest 发送请求,但是有跨域限制//添加这个dataType 底层是发送script 标签的请求.dataType:"jsonp",success:function(){}})getJSON
123456789101112<script>$(function(){$("#buttonId").click(function(){//这个方法去请求服务器//要求服务器返回的数据格式一定是json的数据格式.$.getJSON("06getjson.php",function(data){//打印的是什么.alert(data);});})});</script>
其他的在这里就不多说了自行查阅W3C文档