众所周知,ajax不能发送跨域请求,这是浏览器的同源策略导致的,该策略阻止不同域的两个页面修改对方属性。浏览器安全机制的实现需要这种特性。
今天碰到了这个问题,我们需要在别的网站上放一个插件工具条,该工具条对应该网站需要显示不同的信息,这需要通过请求我们的网站来得到数据,跨域问题就出现了。
那么如何突破ajax不能跨域的限制呢?
有两种方法可以解决,但是使用这两种方法,和ajax的关系就不太大了。
1. 服务端代理
可以先用ajax请求同源的服务端,在服务端请求跨域的另一个网站(服务端没有跨域限制),然后将服务端获得的数据发送给前端即可。
该方法的缺点是:代理服务端只能在ajax请求所在的域,对于我碰到的情况显然是不能实现的,我不可能在别的网站服务端添加需要的代码。
2. jsonp
利用script标签,该标签的src属性是没有跨域限制的,通过利用script跨域获取数据,并传递一个回调函数,在script标签动态插入dom后,远程数据就被下载下来,并可执行已定义好的客户端回调函数,实现跨域访问。
该方法缺点:服务端必须支持jsonp,且jsonp不支持post请求,不能发送过长的数据。
利用jsonp,顺利解决了我碰到的问题。jquery等js库已实现了jsonp请求,可以方便使用。
下面给出一个利用jsonp实现从sina获取股票开盘价,当前价等信息,以及K线图的 jsonp抓取股票信息示例。
1
2 .kline-img{border-bottom:1px solid #666;margin:10px 0 20px;padding-bottom:10px;}//代码效果参考:http://www.ezhiqi.com/bx/art_63.html
3 .kline-img img{margin:10px;border:1px solid #333;}
4 .kline-img p{margin:0;line-height:18px;}
5 .kline-img p span{color:#ff7800;}
6
7
8
9
10 $(document).ready(function(){
11 var script=document.createElement('script'),colNames=【'股票名称','今日开盘价','昨日收盘价','当前价格','今日最高价','今日最低价','竞买价','竞卖价','成交的股票数','成交金额','“买一”申请股数','“买一”报价','“买二”','“买二”','“买三”','“买三”','“买四”','“买四”','“买五”','“买五”','“卖一”申报股数','“卖一”报价','“卖二”','“卖二”','“卖三”','“卖三”','“卖四”','“卖四”','“卖五”','“卖五”','日期','时间'】,klines=【'min','daily','weekly','monthly'】,klineUrl='',list=【'sh601006','sh601001'】;//此处的股票代码修改为你需要的即可
12 document.body.appendChild(script);
13 script.src=''+list.join(',');
14
15 function show(){
16 var data=window【'hqstr'+list【0】】;
17 if(!data){
18 setTimeout(show,1000);
19 }else{
20 data=formatData();
21 $('.container').html(data);
22 }
23 }
24 show();
25 function formatData(){
26 var d='';
27 for(var i=0;i
28 d+=''+colNames【i】+'';
29 }
30 for(var i=0;i
31 d+='';
32 var ds=window【'hqstr'+list【i】】.split(',');
33 for(var j=0;j
34 d+=''+ds【j】+'';
35 }//代码效果参考:http://www.ezhiqi.com/bx/art_6211.html
36 d+='';
37 }
38 d+='';
39 for(var i=0;i
40 d+='
'+list【i】+' K线图
';
41 for(var j=0;j
42 d+='';
43 }
44 d+='';
45 }
46 return d;
47 }
48 })
49