手写个jsonp
原生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);
}
);
思路:
先抽象需要处理的字符串
处理完url,创建一个新的script标签挂到页面上
把处理好的回调函数挂到window对象上
回调完再删掉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 = jp016548432158485
queryString += 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的更多相关文章
- 黑马vue---40、结合Node手写JSONP服务器剖析JSONP原理
黑马vue---40.结合Node手写JSONP服务器剖析JSONP原理 一.总结 一句话总结: 服务端可以返回js代码给script标签,那么标签会执行它,并且可带json字符串作为参数,这样就成功 ...
- 【Win 10 应用开发】手写识别
记得前面(忘了是哪天写的,反正是前些天,请用力点击这里观看)老周讲了一个14393新增的控件,可以很轻松地结合InkCanvas来完成涂鸦.其实,InkCanvas除了涂鸦外,另一个大用途是墨迹识别, ...
- JS / Egret 单笔手写识别、手势识别
UnistrokeRecognizer 单笔手写识别.手势识别 UnistrokeRecognizer : https://github.com/RichLiu1023/UnistrokeRecogn ...
- 如何用卷积神经网络CNN识别手写数字集?
前几天用CNN识别手写数字集,后来看到kaggle上有一个比赛是识别手写数字集的,已经进行了一年多了,目前有1179个有效提交,最高的是100%,我做了一下,用keras做的,一开始用最简单的MLP, ...
- 【转】机器学习教程 十四-利用tensorflow做手写数字识别
模式识别领域应用机器学习的场景非常多,手写识别就是其中一种,最简单的数字识别是一个多类分类问题,我们借这个多类分类问题来介绍一下google最新开源的tensorflow框架,后面深度学习的内容都会基 ...
- caffe_手写数字识别Lenet模型理解
这两天看了Lenet的模型理解,很简单的手写数字CNN网络,90年代美国用它来识别钞票,准确率还是很高的,所以它也是一个很经典的模型.而且学习这个模型也有助于我们理解更大的网络比如Imagenet等等 ...
- 使用神经网络来识别手写数字【译】(三)- 用Python代码实现
实现我们分类数字的网络 好,让我们使用随机梯度下降和 MNIST训练数据来写一个程序来学习怎样识别手写数字. 我们用Python (2.7) 来实现.只有 74 行代码!我们需要的第一个东西是 MNI ...
- 手写原生ajax
关于手写原生ajax重要不重要,各位道友自己揣摩吧, 本着学习才能进步,分享大家共同受益,自己也在自己博客里写一下 function createXMLHTTPRequest() { //1.创建XM ...
- springmvc 动态代理 JDK实现与模拟JDK纯手写实现。
首先明白 动态代理和静态代理的区别: 静态代理:①持有被代理类的引用 ② 代理类一开始就被加载到内存中了(非常重要) 动态代理:JDK中的动态代理中的代理类是动态生成的.并且生成的动态代理类为$Pr ...
随机推荐
- MySQL 优化【转】
MySQL常见的优化手段分为下面几个方面: SQL优化.设计优化,硬件优化等,其中每个大的方向中又包含多个小的优化点 下面我们具体来看看~ SQL优化 此优化方案指的是通过优化 SQL 语句以及索引来 ...
- mysql查询拥有某个字段的所有表
前言:最近遇到一个需求,需要给一个数据库所有的表添加一个字段,但是一些后创建的表已经有了这个字段,所以引发了下文. *注释 columnName 字段名 dbName 数据库名 #查询指定库拥有某 ...
- .NET5控制台程序使用EF连接MYSQL
.NET5控制台程序使用EF连接MYSQL 1.使用nuget下载: Microsoft.Extensions.Configuration.Json Pomelo.EntityFrameworkCor ...
- Springboot通过拦截器拦截请求信息收集到日志
1.需求 最近在工作中遇到的一个需求,将请求中的客户端类型.操作系统类型.ip.port.请求方式.URI以及请求参数值收集到日志中,网上找资料说用拦截器拦截所有请求然后收集信息,于是就开始了操作: ...
- [论文阅读] LCC-NLM(局部颜色校正, 非线性mask)
[论文阅读] LCC-NLM(局部颜色校正, 非线性mask) 文章: Local color correction using non-linear masking 1. 算法原理 如下图所示为, ...
- MySQL-01-简介以及安装
Mysql简介 什么是数据 数据:文字.图片.视频... 人类认知的数据表现方式 计算机:二进制.16进制的机器语言 基于数据的重要性和复杂性的不同,我们可能有不同的管理方式 哪些数据是适合存储到数据 ...
- 北航OO第四单元——UML图解析
北航OO第四单元--UML图解析 作业要求简析 刚接触本次作业可能需要花上一会才能搞清楚到底是要我们写个啥,在这里简单说一下: UML图的保存格式.mdj文件是以json文件的形式存储的,将每一个Um ...
- 013 PCIe体系结构的组成部件
一.PCIe体系结构的组成部件 PCIe总线作为处理器系统的局部总线,其作用与PCI总线类似,主要目的是为了连接处理器系统中的外部设备,当然PCIe总线也可以连接其他处理器系统.在不同的处理器系统中, ...
- noip42
T1 朴素dp很好想,设 \(dp_{u,0/1}\) ,表示以 \(u\) 为根的子树,选/不选 \(u\) 所产生的最大贡献. 转移方程则有, \[dp_{u,0} = \prod_{v\in s ...
- 题解 matrix
传送门 无比毒瘤的dp题,而且伪装地好像很可做的样子 考场上我给它氪了差不多一个小时最后还是只能扔了个20pts状压走人 以下思路基本均来源于题解: 对于此题,题面中三个限制条件: (1)第 i 行第 ...