博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JSONP原理
阅读量:3963 次
发布时间:2019-05-24

本文共 3048 字,大约阅读时间需要 10 分钟。

jsonp原理

//因为我想从一个接口获取一个数据        //但是这个接口和当前页面不是同源的(也就是跨域了)        //但是这个接口是支持JSONP的        //script标签,有src属性,所以可以发出网络请求        //script标签,虽然可以引用其他域的资源,浏览器不限制        // 但是,浏览器会将返回的内容,作为js代码执行        //例如asd({"status":"ok","msg":"Hello There is duYi edu"})        //相当于调用了asd方法,传入了一个json对象作为参数        //JSONP 原理:        // 1.判断请求与当前页面的域,是否相同,如果同源则发送正常的ajax,就没有跨域的事情了。        // 2.如果不同源,生成一个script标签        // 3.生成一个随机的callback名字,还得创建一个名为这个callback名字的方法        // 4.设置script标签的src,设置为要请求的接口。        // 5.将callback作为参数拼接在后面。        // ========以上部分是前端部分======$        // 6.后端接收到请求后,开始准备要返回的数据        // 7.后端拼接数据,将要返回的数据用callback的值和括号包裹起来        //      例如  callback=asd123  要返回的数据为{"a":1,"b":2},        //      就要拼接为  asd123({"a":1,"b":2})        // 8.将内容返回        // ========以上的后端部分=====$        // 9.浏览器接收到内容,会当做js代码来执行        // 10.从而执行名为asd123的方法,这样我们就接收到了后端返回给我们的对象

下面是代码部分

var $ = {
ajax:function(options){
var url = options.url; var type = options.type; var dataType = options.dataType; //判断是否同源(协议,域名,端口) //获取目标url的域 var targetProtocol ='' //目标接口的协议 var targetHost =''//目标接口的host,host是包含域名和端口的 //如果url不带http,那么访问的一定是相对路径,相对路径一定是同源的 if(url.indexOf("http://") ==0 || url.indexOf("https://") == 0){
var targetUrl = new URL(url) targetProtocol = targetUrl.protocol targetHost = targetUrl.host }else{
targetProtocol = location.protocol targetHost = location.host } //首先判断是否为jsonp 因为不是jsonp不做其他的判断,直接发送ajax if(dataType == 'jsonp'){
//要看是否同源 if(location.protocol == targetProtocol && location.host == targetHost){
//同源 jsonp当做普通的ajax }else{
//不同源 //随机生成一个callback var callback = 'cb' + Math.floor(Math.random()* 10000) //给window上添加一个方法 window[callback] = options.success //生成script标签 var script = document.createElement('script') if(url.indexOf("?") > 0){
//表示有参数 script.src = url + '&callback=' + callback; }else{
//表示没有参数 script.src = url + '?callback=' + callback; } script.id = callback; document.head.appendChild(script) } } } } $.ajax({
url:"http://developer.duyiedu.com/edu/testJsonp", type: 'get', dataType: 'jsonp', success: function(data){
console.log(data); } })

这是请求回来的数据

在这里插入图片描述

cb2627()相当于是返回来的一个js语句 方法名为cb2627方法的执行

下面是执行之后打印出来的数据

在这里插入图片描述

转载地址:http://ojzki.baihongyu.com/

你可能感兴趣的文章
Android: ApiHelper
查看>>
BaseAnimation是基于开源的APP,致力于收集各种动画效果(最新版本1.3)
查看>>
安卓开发者必备的42个链接
查看>>
为GridView添加HeaderView
查看>>
我的Android进阶之旅------>经典的大牛博客推荐(排名不分先后)!!
查看>>
Android时间获取与使用
查看>>
Android WebRTC 音视频开发总结(一)
查看>>
用Gradle 构建你的android程序
查看>>
Android监听应用程序安装和卸载实现程序
查看>>
Android 监听apk安装替换卸载广播的实现代码
查看>>
Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
查看>>
Android下拉刷新上拉加载控件,对所有View通用!
查看>>
Android自定义控件实战——仿多看阅读平移翻页
查看>>
Android自定义控件实战——仿淘宝商品浏览界面
查看>>
Android自定义控件实战——水流波动效果的实现WaveView
查看>>
Android自定义控件实战——水波纹标签云TagCloud
查看>>
Android自定义控件实战——滚动选择器PickerView
查看>>
Android自定义控件实战——下拉刷新控件终结者:PullToRefreshLayout
查看>>
Android事件分发、View事件Listener全解析
查看>>
Eclipse下使用Ant多渠道批量打包
查看>>