分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

手写个jsonp

发布时间:2023-09-06 01:06责任编辑:蔡小小关键词:jsjson

原生jsonp具体实现

先上代码:

 ???//http://www.baidu.com?aa=11&callback=my_jsonp04349289664328899 ???var jsonp = function(url,param,callback){ ???????//处理url地址,查找?,如果没有?这个变量就有一个"?",有?这个变量接收一个& ???????var querystring = url.indexOf("?") == -1?"?":"&"; ???????//处理参数{xx:xx} ???????for(var k in param) { ???????????querystring += k + "=" + param[k] + ‘&‘;//?k=para[k] ???????} ???????//处理回调函数名 ???????var random = Math.random().toString().replace(".",""); ???????var cbval = "my_jsonp" + random; ???????var cb = "callback="+cbval; ???????querystring += cb; ???????var script = document.createElement("script"); ???????script.src = url + querystring; ???????//把回调函数的名字附给window ???????window[cbval] = function(param) { ???????????//这里执行回调的操作,用回调来处理参数 ?????????callback(param); ?????????//拿到了就删掉这个script ?????????document.body.removeChild(script); ???????}; ???????document.body.appendChild(script); ???} ???jsonp( ???????"https://www.baidu.com", ???????{aa:11}, ???????function(){ ???????????console.log(param); ???????} ???????);

思路:

  1. 先抽象需要处理的字符串

  2. 处理完url,创建一个新的script标签挂到页面上

  3. 把处理好的回调函数挂到window对象上

  4. 回调完再删掉script

步骤:

随便拿个地址,比如百度。

  • http://www.baidu.com?aa=11&callback=my_jsonp04349289664328899

  • 要处理的就是地址(?及之前的内容)

  • 参数(?后面的内容)

  • 回调函数

var jsonp = function(url,para,callback){}
//地址、参数、回调

开始处理url地址

  • 域名是我们自己传进去的,所以只要处理?之后的内容就好了

var queryString = url.indexOf("?") == -1?"?":"&";//看url里面有没有?,如果有说明只要传参数就好了,没有的话queryString默认是?//给地址传参数一般都是要好几个,所以这里的数据格式是一个对象,如{aa:11}for(var k in para) { ?queryString += k + ‘=‘ + para[k] + ‘&‘; ?//?aa=11&}

处理回调函数

  • 仿jQ的思路,函数名随机,避免和页面的某个函数重名

  • 需要一个随机非浮点数

  • 参数名

var random = Math.random().toString().replace(".","");//随机非浮点数var cbvalue = "jp" + random;//不能用数字开头做函数名var cb = "callback=" + cbvalue;//callback = jp016548432158485queryString += cb;//放到处理url字符串的后面

创建一个script

var script = document.createElement("script");script.src = queryString;document.body.appendChild(script);

把回调函数挂载到页面上,并传参

window[cbvalue] = function(para){ ?callback(para); ?//拿完了参数就删掉,过河拆桥 ?document.body.removeChild(script);}

完成,尝试调用

jsonp("www.jd.com",{num:10},function(){ ?console.log(para);})

手写个jsonp

原文地址:http://www.cnblogs.com/zzc5464/p/jsonp.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved