JS跨域调用之JSONP--动态Script标签方式实现跨域

动态Script标签的方式往往是用来访问不在同一个域的服务器内部的数据的。例如, 
当前我的域名:  
d1.wwwcomy.com  
我需要访问的数据:  
百度翻译"chair"的结果  

由于百度翻译和我的域名不在一个域名下,所以这个数据通过常规方式是没办法获取的,是被浏览器的安全机制所禁止的,解决方法如下: 

首先要知道这个基础知识: 

引用
Web页面上凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>


所以,最简单的方法为:我们可以在自己的域名下用iframe引用百度中chair翻译的页面(=。=)。 
这个好像比较雷。。那么如何灵活的自己控制呢? 

这就要用到动态script标签方式了, JSONP ,JSON with Padding,是一个非官方的解决跨域访问的"协议",采用JSON作为传输数据的载体,具体的实现是通过script标签跨域引用来完成的。 

实现JSONP的前提: 


两个例子: 
1.最简单的入门调用  
我们先使用百度翻译作为服务端,写一个客户端调用的HTML例子testCallBack.html: 

Html代码   收藏代码
  1. <html>  
  2. <head>  
  3. <title>Title</title>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  5. <script type="text/javascript" language="javascript"  
  6.     src="jquery-1.7.2.js"></script>  
  7. <script type="text/javascript">  
  8.     function abc(re) {  
  9.         alert(re.trans_result[0].src + "翻译的结果为\"" + re.trans_result[0].dst+"\"");  
  10.     }  
  11. </script>  
  12. <script type="text/javascript" language="javascript" src="http://openapi.baidu.com/public/2.0/bmt/translate?client_id=2ALMz6WqUEcsBg4BS91Eppq3&q=chair&from=auto&to=auto&callback=abc"></script>  
  13.   
  14. </head>  
  15. <body>  
  16. </body>  
  17. </html>  


打开页面后发现访问成功,如果要动态翻译的话,可以动态的生成这个script标签。 

2.简单的动态生成script 例子testTag1.html 

Html代码   收藏代码
  1. <html>  
  2. <head>  
  3. <title>Title</title>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  5. <script type="text/javascript">  
  6.     function abc(re) {  
  7.         alert(re.trans_result[0].src + "翻译的结果为\"" + re.trans_result[0].dst+"\"");  
  8.     }  
  9.     function onClick()  
  10.     {  
  11.         var script = document.createElement("script");  
  12.         script.type = "text/javascript";  
  13.         var src = document.getElementById("word").value;  
  14.         script.src = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=2ALMz6WqUEcsBg4BS91Eppq3&q="+src+"&from=auto&to=auto&callback=abc";  
  15.         document.body.appendChild(script);  
  16.     }  
  17. </script>  
  18. </head>  
  19.   
  20. <body>  
  21.     <input type="text" value="pen" id="word"/>  
  22.     <input type="button" value="click me!" onclick="onClick()"/>  
  23. </body>  
  24. </html>  

***注意:本例子只是用来演示,真正使用时候请注意script标签的清除,避免页面无限制增加script标签。其他注意事项暂时还没想到=。=  

客户端代码基本是在这个基础上进行修改,下面来讨论一下服务端代码,其实服务端代码也很简单,甚至写个servlet组装字符串生成JSON格式的字符就可以,当然要与客户端协调好json的格式。 
服务端Servlet生成如下的字符串返回来就行了: 
Js代码   收藏代码
  1. abc({"from":"en","to":"zh","trans_result":[{"src":"chair","dst":"\u6905\u5b50"}]});  

另外要处理callback这个回调参数,上面百度API介绍里面本来没有callback参数的介绍,后来我随意打了一个竟然人家还实现了。 

回顾一下实际上流程很简单: 
  • 1.客户端根据条件生成一个url,包含请求数据(如"chair")和回调函数名(如"abc")
  • 2.客户端写好回调函数function abc(re){}
  • 3.服务端接收此请求,生成json数据,并根据回调函数名,动态生成类似 abc(json("chair"))这样的数据返回给客户端。
  • 4.客户端执行abc(json("chair"))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值