大多数情况下,无论是框架还是自己实现都是通过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. C. Smallest Word

    链接 [http://codeforces.com/contest/1043/problem/C] 题意 给你一个只包含a,b的字符串,有一种操作把第1个字符到第i个字符的子串进行反转,问要使最后字符 ...

  2. 20135234mqy-——信息安全系统设计基础第十二周学习总结

    process environ.c environvar.c consumer.c 管道写端 producer.c 管道读端 testmf.c listargs.c pipedemo.c 管道 pip ...

  3. ns3的输入输出奥秘(二) 命令行参数

    命令行参数 (1) UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9); echoClient.SetAttribute (&q ...

  4. golang 实现线程池

    package main import ( "fmt" "time" ) type Pool struct { Queue chan func() error; ...

  5. POJ 2584 T-Shirt Gumbo

    T-Shirt Gumbo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3689   Accepted: 1755 Des ...

  6. Graham's Scan法求解凸包问题

    概念 凸包(Convex Hull)是一个计算几何(图形学)中的概念.用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有点的.严谨的定义和相关概念参 ...

  7. 【拓扑 字符串还原 + 线段树维护】奇洛金卡达(father)

    奇洛金卡达(father) Description 阿良良木历将要迎来人生(不,是吸血鬼生涯)的第三次战斗——与身为人类的奇洛金卡达在直江津高中的操场solo,以取回Heartunderblade 的 ...

  8. 小记之while循环条件的操作位置

    # 判断条件时自减操作 (循环体判断 len == 0) > 执行顺序为,while(len) → len-- → 循环体 while(len--) { == len) { *buf = i2c ...

  9. Linux上vi编辑文件非正常退出后文件恢复

    Vim另存文件的命令为 编辑完文件后Esc,输入以下指令 :w filename 编辑文件时非正常退出,会生成.hello.txt.swp的文件,还有一些其他信息 恢复文件要使用以下命令: [keys ...

  10. 国内k8s集群部署的几种方式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lusyoe/article/details/80217291前言总所周知,由于某种原因,通过官方的方 ...