大多数情况下,无论是框架还是自己实现都是通过Ajax的方式来向后端请求数据的,而Ajax之间是通过传输json格式的文件来进行数据的传输的,大家对Ajax也很熟悉了,那么为什么我又要使用jsonp呢?这就要从什么是jsonp,什么是json来说一说了。

json是一种格式,而jsonp是一种调用方式,那么在大家都使用Ajax的情况下为什么我不用呢?因为Ajax作为脚本出于安全的考虑,是不允许访问非同源的内容的。那么如果我的前端活动页面和后端的服务器不在一个域名下该如何请求数据呢?这个时候就需要jsonp的方式来解决跨域的问题了。

那么为什么jsonp可以跨域呢?其中的原理又是什么呢?我们下面就来介绍一下jsonp跨域的原理。

因为同源策略的的原因,对于一个浏览器的页面只有来自一个源的脚本才可以被执行,这样的目的是为了安全性,可是却阻止了数据的请求,所以我们就要从绕开同源策略来入手,什么情况下允许跨域请求呢?那就是静态资源!静态资源是不受域策略限制的,可以加载任意域的脚本、样式、图片等静态资源,JSOP就是利用这种原理来实现跨域获取数据的。

我们将需要的json数据放在js文件中进行传输,这样就可以将需要的数据通过静态文件的形式传过来了,那么我们就来讲讲具体是如何实现的呢?

由于是静态文件,所以我们在请求的时候首先需要建立一个静态资源的DOM元素,例如这样的标签:

<script src="http://cdn.bootcss.com/zepto/1.1.6/zepto.min.js"></script>

那么我们就来一步步的构建这个DOM标签吧,首先通过document.createElement(‘script’);来建立一个script标签,然后设置它的src属性指向需要请求的URL地址,然后将这个元素添加在body中,最后出于安全我们要将刚刚新建的标签在完成请求后删除掉。

在这里我把我写的一个封装好的函数贴出来,很简单的一个函数就说明了一切~

/*
* Created by jonnyf on 15-9-15.
* 这个函数是通过JSONP的方式请求后端接口
* 需要传入三个参数,
* url为请求的接口地址,类型为字符串
* parameter为请求的参数对象,类型为对象
* callback为完成请求后的回调函数名称, 类型为字符串
*/ function getJSONP(url, parameter, callback) {
var Script = document.createElement('script'),
_parameter = parameter,
_url = url,
_callback = callback,
code = '';
for (var i in _parameter) {
code += i + '=' + _parameter[i] + '&'
}
Script.src = _url + '?' + code + 'callback=' + _callback;
document.body.appendChild(Script);
Script.onload = function(){ // 请求成功后移除标签
Script.remove();
}
Script.onerror = function() { // 失败的时候也要移除标签
alert('请求错误, 请重试');
Script.remove();
};
}

总结:ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本。

Ajax和jsonp区别的更多相关文章

  1. json和jsonp的区别,ajax和jsonp的区别

    json和jsonp虽然只有一个字母的区别,但是它们之间扯不上关系. json是一种轻量级的数据交换格式. jsonp是一种跨域数据交互协议. json的优点:(1)基于纯文本传递极其简单,(2)轻量 ...

  2. Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别

    为什么要用jsonp? 相信大家对跨域一定不陌生,对同源策略也同样熟悉.什么,你没听过?没关系,既然是深入浅出,那就从头说起. 假如我写了个index页面,页面里有个请求,请求的是一个json数据(不 ...

  3. 前端跨域问题,以及ajax,jsonp,json的区别

    看了很多网上的资料,小七感觉都没有完全解决我的疑惑以及问题,所以特意拿出通俗易懂的话讲解跨域问题,以及ajax,jsonp,json的区别.首先先说跨域问题什么时候需要跨域?[1]域名不同(即网址不同 ...

  4. 从 AJAX 到 JSONP的基础学习

    目录索引: 一.AJAX的概念二.POST && GET三.原生实现AJAX简单示例 3.1 实现代码 3.2 重点说明四.框架隐藏域 4.1 基本概念 4.2 后台写入脚本 4.3 ...

  5. JSON和JSONP区别和联系

    由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯 ...

  6. 针对AJAX与JSONP的异同

    针对AJAX与JSONP的异同       1.ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架 ...

  7. json与jsonp区别浅析(json才是目的,jsonp只是手段) (转)

    一言以蔽之,json返回的是一串数据:而jsonp返回的是脚本代码(包含一个函数调用): JSON其实就是JavaScript中的一个对象,跟var obj={}在质上完全一样,只是在量上可以无限扩展 ...

  8. ajax 和jsonp 不是一码事

    由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯 ...

  9. 06: AJAX全套 & jsonp跨域AJAX

    目录: 1.1 AJAX介绍 1.2 jQuery AJAX(第一种) 1.3 原生ajax(第二种) 1.4 iframe“伪”AJAX(第三种) 1.5 jsonp跨域请求 1.6 在tornad ...

随机推荐

  1. 前后端同学必会的Linux基础命令

    无论是前端还是后端同学,一些常用的linux命令还是必须要掌握的.发布版本.查看日志等等都会用到.以下是我简单的总结了一些简单又常用的命令,欢迎大家补充.希望能帮助到大家 基础篇 1.进入目录 cd ...

  2. Notes of Daily Scrum Meeting(12.16)

    最近好几门课的大作业都到了要截止的时候了,好多天队员们都抽不出来时间做软工的项目了,这样确实 和我们的计划出入很大,不过希望老师谅解,三门课程设计确实压力很大. 今天的团队任务总结如下: 团队成员 今 ...

  3. [2017BUAA软工助教]个人得分总表(至alpha结束)

    一.表 学号 第0次 week1 week2 week3 个人项目 附加1 结对项目 附加2 a团队 a团队得分 a贡献分 总分(不计) 总分(记) 15061119 7 9.5 12 9 45.75 ...

  4. Linux内核分析第五章读书笔记

    第五章 系统调用 在操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口在应用程序和内核之间扮演了使者的角色,保证系统稳定可靠,避免应用程序肆意妄行. 5.1 与内核通信 系统调用在用户空 ...

  5. Daily Scrum - 11/20

    好习惯的养成需要两个星期. ——砖家 今天我们小组又进行了一次愉快的例会,可以看到daily scrum在我们小组已经逐渐变成了每日的好习惯.首先对以下一些团队routine达成了共识: 1.spri ...

  6. week6:个人博客作业

    这周主要是参与团队编程的讨论 团队编程中发现很多问题: 1,每个人共同空闲的时间不好找 就我组来说,我是考研,每天晚上都要去外面上课,有的人在进行大创,,也有的像我一样在整考研的东西,还有的进行其他, ...

  7. ORACLE创建数据库时无法创建目录

    ORACLE创建数据库时无法创建目录,如图所示信息 原因:没有创建写入的权限 解决:修改文件夹权限即可 F:\oracle\product\10.2.0\db_1\cfgtoollogs\dbca 增 ...

  8. 80C51存储器与C51内存优化

    80C51在物理结构上有四个存储空间:片内程序存储器.片外程序存储器.片内数据存储器和片外数据存储器.但在逻辑上,即从用户使用的角度上,80C51有三个存储空间:片内外统一编址的64KB的程序存储器地 ...

  9. [From WIKI] IBM Z

    IBM zEnterprise System From Wikipedia, the free encyclopedia     Jump to navigationJump to search Hi ...

  10. PHP阿里云云解析签名, 通过API 绑定域名到动态 ip

    <?php date_default_timezone_set("GMT"); //绑定 ip 到域名 Ali::Obj()->UpdateDomainRecord() ...