jQuery中jsonp函数实现
由于浏览器中的同源策略,不同的域名,不同的协议,甚至不同的端口都无法请求数据。因此出现了浏览器跨域请求数据问题。
Jsonp是解决跨域问题的一个非常流行的方法。
JSONP(JSON with Padding),其实就是被包裹在函数调用中的JSON。
callback({"name": "Kate"});
1. JSONP原理
通过script标签进行跨域操作,载入的请求js文件中的内容会执行我们在url中指定的函数,并且,传入的参数,就是我们请求的数据。
2. JSONP简单实现
<script>
// 先定义我们将要处理数据的函数
function myFun(data) {
console.log(data);
}
</script> <!-- 我们使用script标签来进行跨域请求,并使用callback标明我们将要处理数据的函数 -->
<!-- 此处我使用的是聚合数据的数据资源 -->
<script src="http://v.juhe.cn/expressonline/getCarriers.php?key=6a1038e454e6d4b25457b911c8d9b815&callback=myFun"></script>
最终显示为:

我们成功获取不同域名下的资源。并通过自定义的myFun函数将获得的数据打印出来了。
3. 简单实现jQuery中jsonp
在使用jsonp过程中,可能因为请求数据的API要求不同,我们需要构建自己的jsonp方法,下面我们简单介绍一种类似jQuery中jsonp的实现。
首先,我们创建一个以jQuery开头的随机的函数名,并将其挂载到window对象中。在这个函数中,我们调用我们传入的回调函数处理数据。
然后,我们开始处理传入的url,此时,我们规定传入的url不带有callback查询字符串,方便我们根据不同的API要求传入对应的参数。
最后,我们创建script标签,并指定其src为前面处理好的url,将其添加到文档中,即可获取数据。
<script>
// 自定义框架名称myFrame
var myFrame = {}; // 添加jsonp方法
myFrame.jsonp = function(url, callback) {
// 生成随机函数名
var cbname = 'jQuery' + new Date().getTime(); // 把cbname作为函数名挂载到window对象上
window[cbname] = function(data) {
// 调用传入的回调函数处理数据
callback(data); // 调用数据之后,删除创建的script标签
// 放置script标签无限增长
document.body.removeChild(script);
} // 拼接url,将callback添加到url中,
// 如:http://api.douban.com/v2/movie/in_theaters?callback=;jQuery1487687886270
url += url.indexOf('?') == -1 ? '?' : '&';
url += 'callback=' + cbname; // 创建script标签
var script = document.createElement('script');
// 添加script标签属性
script.src = url;
script.type = 'text/javascript'; // 将script标签添加到文档中,此时开始请求我们的数据
document.body.appendChild(script); } // 调用框架中的方法,此时使用豆瓣API
myFrame.jsonp('http://api.douban.com/v2/movie/in_theaters', function(data) {
console.log(data);
});
</script>
成功请求到数据:

script标签请求到的内容:

jQuery中jsonp函数实现的更多相关文章
- jquery 中jsonp的实现原理
在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,即一般的 ajax是不能进行跨域请求的.但 img.iframe .script等标签是个例外,这些标签可以通过 src属性请求到其 ...
- 解读jQuery中extend函数
$.extend.apply( null, [ true, { "a" : 1, "b" : 2 } ] );//console.log(window.a); ...
- jQuery中live函数的替代-【jQuery】
在老版本的jQuery中,当需要对页面上某个由ajax加载的某片段的页面内容响应事件时,可以使用live函数来响应其事件,比如: $('a').live('click', function() { b ...
- jQuery中attr()函数 VS prop()函数
http://www.365mini.com/page/jquery-attr-vs-prop.htm 在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参数和用法 ...
- jquery中ready函数,$(function(){})与自执行函数的区别
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 关于jQuery中toggle()函数的使用
今天遇到一个有趣的例子,将它记录下来. 一个一级菜单,里边有一个二级菜单,二级菜单是通过锚点来链接页面元素的.想要实现的效果是当点击锚点时,页面链接到相应锚点,同时二级菜单隐藏,再点击一级菜单时,继续 ...
- jQuery中bind函数绑定多个事件
名人名言:道德是真理之花.——雨果 在jQuery中绑定多个事件名称是,使用空格隔开,举例如下: $("#foo").bind("mouseenter mouseleav ...
- 关于JQuery 中$.ajax函数利用jsonp实现Ajax跨域请求ASP.NET的WebService成功获取数据的案例
部署环境:Window 7 SP1+IIS7 成功方案: 其成功解决问题的几个重要因素如下: 1. 由于WebService默认不支持Get请求,所以要在Web.config配置文件内的& ...
- JQuery中on()函数详解
JQuery API中定义的on方法,专业名词很多,读起来并不是那么容易,而对于开发人员知道函数怎么使用就可以了.本文将JQuery的说明翻译如下: on(events,[selector],[dat ...
随机推荐
- 谨慎能捕千秋蝉(一)——XSS
最近在研读<白帽子讲web安全>和<Web前端黑客技术揭秘>,为了加深印象,闲暇之时做了一些总结. 下面是书中出现的一些专有词汇: POC(Proof Of Concept): ...
- java异常的一些小知识
异常,我们软件都需要面对的一个问题.如何让你的软件更加健壮呢?这是一个值得我们考虑的问题.这里主要为大家介绍一下异常是什么,异常是如何产生的,如何将异常抛出,如何捕获异常,对于异常应该如何处理的个人一 ...
- shell变量数学运算
shell变量数学运算 #!/bin/sh # 本脚本说明shell脚本中变量运算的用法 # 错误的用法var=1var=$var+1echo $var 输出:1+1 # 第一种用法,letvar=1 ...
- MySQL架构由小变大的演变过程
假设一个网站(discuz)从最开始访问量很小做到日pv千万,我们来推测一下它的mysql服务器架构演变过程. 第一阶段网站访问量日pv量级在1w以下.单台机器跑web和db,不需要做架构层调优(比如 ...
- 浅谈Java单例模式
关于基本的懒汉式,饿汉式等写法网上介绍多如牛毛,这里不再赘述,直接讨论加了volatile关键字的双重锁(Double check),静态内部类以及枚举等写法,如有不对,恳请读者指出,欢迎讨论. 1. ...
- 【UWP】FFmpeg库的编译
本文是关于windows8.1/windows10通用应用下编译ffmpeg的一些需要注意的地方,针对最新的msys2而写,都是我在实际操作中遇到的,但是网上没有提到的.如果大家遇到什么问题或是在之前 ...
- 纯css实现京东导航菜单
纯CSS代码实现导航菜单,推荐在chrome预览! 预览请点击这里:mygithub <!doctype html> <html lang="en"> &l ...
- vim + DoxygenToolkit.vim环境搭建
1. :DoxLic --->添加版权 2. :DoxAuthor---->文件头 3. :Dox----> 函数注释 安装过程: 1. 创建目录 ~/.vim/pl ...
- 连连看的原生JS实现
那天闲来无事,便想找个小游戏来打发时间,后来便找到了连连看, 玩了一会儿感觉无聊,想到各位高手用JS做的各种小游戏,便想自己也来做一个,于是便有了这几天的成果. 代码是用 原生JS 实现的,只是用来学 ...
- 每天一个Linux命令(17)--whereis命令
whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返所有信息. 和find相比,whereis查找的速度非 ...