- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
精品word学习资料可编辑
名师归纳总结——欢迎下载
关于 JSONP 跨域恳求数据的原理及最优解决方案
什么是 JSONP ?它的实现原理?
JSONP即 JSON with Padding ;由于同源策略的限制, XmlHttpRequest 只答应恳求当前源(域名,协议,端口)的资源;假如要进行跨域恳求,我们可以通过使用 html 的script 标记来进行跨域恳求,并在响应中返回要执行的 script 代码,其中可以直接使用JSON传递 javascript 对象;这种跨域的通讯方式称为 JSONP;
其实说白了,就是利用 script 标签这种不受跨域的限制向服务器发送一个恳求,服务器端返回的为一个可执行的 javascript 文件,如下代码示例:
script src =response_jsonp.html.user_id=1230 /script
div id =data /div 3.
script
( function ( doc ) {
var data = doc . getElementById ( data );
data . innerHTML = id: + jsonp . id + br/name: + jsonp . name ;
} )( document );
/script
第一向服务器端发起一个恳求并传入参数 user_id ,服务器端返回的数据如下:
1. window [ jsonp ] = { 2. id : 12 ,
3. name : jsonp
4. }
优化方案
服务器端返回的 JSON 格式的数据直接赋值给 window 下的 jsonp 变量,这样在页面中就可以通过 jsonp 这个变量取得数据了;
不过上面的代码看起来并不文雅,我们把 script 标签直接写在了恳求的页面中,这样存在一个风险,假如我们在没有拿到数据前就用了 jsonp 这个变量, js 就会报错,堵塞后面脚本的执行;
之前一篇中提到过无堵塞式加载 js,我们可以通过动态创建 script 标签,异步向服务器端发送恳求,代码如下:
1. div id =data /div 2.
script
精品word学习资料可编辑
名师归纳总结——欢迎下载
function loadScript ( url , callback ) {
var script = document . createElement ( script );
script . type = text/javascript ; 7.
if ( script . readyState ) {
script . onreadystatechange = function () {
if ( script . readyState == loaded || script . readyState == complete ) {
script . onreadystatechange = null ;
if ( callback ) {
callback ();
14. }
15. }
16. }
} else {
script . onload = function () {
if ( callback ) {
callback ();
21. }
22. }
23. }
24.
script . src = url ;
document . getElementsByTagName ( head )[ 0 ]. appendChild ( script
);
27.
}
28.
/script
29.
30.
script
31.
( function
( doc
) {
32.
loadScript
(
response_jsonp.html.user_id=1230
,
function
() {
33.
var
data
= doc . getElementById ( data
);
34.
data . innerHTML
= id:
+ jsonp
. id +
br/name:
+ jsonp . name ;
35.
} );
36.
} )( document );
37.
/script
我们把动态创建 script 标签的方法封装在 loadScript() 方法中,接受两个参数,一个是恳求的 url ,另外一个是恳求胜利后的回调函数,这样就可以保证我们执行的代码是在恳求
胜利之后执行的,这样就不会造成先执行,但仍没有恳求胜利的问题;
但是我们仍发觉一个问题,服务器端返回的 JSON 格式的数据是直接赋值给了 window 下的全局变量,这样对全局造成了污染,并不好;更好的解决方法是
您可能关注的文档
- 【设计】PBN复飞程序段衔接模块详细设计.docx
- 【设计】PEP8RevisionThePastTense教学设计.docx
- 【设计】photos教学设计书.docx
- 【试题】oracle考试试题及答案.docx
- 【试题】Pmp考试测试题及答案.docx
- 【英语】pep版四年级下学期期末英语试卷.docx
- 【英语】pep人教版四年级下册英语4-6单元练习试题附答案.docx
- 【英语】pep小学三年级英语下册《Unit2MyfamilyALet’slearn》教学设计.docx
- 【英语】pep小学四年级上册英语unit3myfriends[partaletslearn]教学设计.docx
- 【英语】pep小学四年级英语上册Unit4MyhomePartBLet’slearn教学设计.docx
文档评论(0)