模拟jsonp的实现
function prescript(s) {
if (s.cache === undefined) {
s.cache = false;
}
if (s.crossDomain) {
s.type = "GET";
}
}
function prejsonp(s, originalSettings, jqXHR) {
// 给回调函数命名
var callbackName = s.jsonpCallback
s.url += (/(?:)/.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
// 脚本执行后使用数据转换器来检索json
// 提供给代码获取服务器的是据
s.getData = function() {
if (!responseContainer) {
jQuery.error(callbackName + " was not called");
}
return responseContainer[0];
};
//修改处理机制
s.dataTypes[0] = "json";
// 创建一个全局函数
overwritten = window[callbackName];
//用来收集服务器给的数据
window[callbackName] = function() {
responseContainer = arguments;
};
return "script";
}
/**
* jsonp的预先处理
*/
function inspectPrefiltersOrTransportsA(options, originalOptions, jqXHR) {
//预处理jsonp
var dataTypeOrTransport = prejsonp(options, originalOptions, jqXHR)
//扩充dataTypes
options.dataTypes.unshift(dataTypeOrTransport);
//预处理script类型
prescript(options)
}
/**
* 分发器
* @return {[type]} [description]
*/
function inspectPrefiltersOrTransportsB(s, originalOptions, jqXHR) {
return {
send: function(_, complete) {
var script = jQuery("<script>").prop({
async: true,
charset: s.scriptCharset,
src: s.url
}).on(
"load error",
callback = function(evt) {
script.remove();
callback = null;
if (evt) {
complete()
}
}
);
//<script async="" src="http://192.168.1.113:8080/github/jQuery/jsonp.php
document.head.appendChild(script[0]);
}
}
}
/**
* 模拟ajax的 jsonp请求
* @param {[type]} options [description]
* @return {[type]} [description]
*/
function createAjax(options) {
if (typeof url === "object") {
options = url;
url = undefined;
}
options = options || {};
/**
* 参数
* jQuery.ajaxSetup 是默认参数
* @type {[type]}
*/
var s = jQuery.ajaxSetup({}, options);
// Deferreds
// 异步机制
var deferred = jQuery.Deferred();
var completeDeferred = jQuery.Callbacks("once memory");
/**
* 实际返回的ajax对象
* @type {Object}
*/
var jqXHR = {}
// 把jqXHR对象转化promise对象,幷加入complete、success、error方法
deferred.promise(jqXHR).complete = completeDeferred.add;
//别名
jqXHR.success = jqXHR.done;
jqXHR.error = jqXHR.fail;
s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(/(?:)/) || [""];
//预处理
inspectPrefiltersOrTransportsA(s, options, jqXHR);
for (i in {
success: 1,
error: 1,
complete: 1
}) {
jqXHR[i](s[i]);
}
/**
* 分发器
*/
transport = inspectPrefiltersOrTransportsB(s, options, jqXHR);
function done(status, nativeStatusText, responses, headers) {
console.log(s,s.getData())
}
//发送请求
transport.send(s, done);
return jqXHR;
}
function show(data){
$('body').append('<li>'+ data +'</li>');
}
/**
* 数据回调接收
* @return {[type]} [description]
*/
function flightHandler(){
}
$("#test").click(function(){
//执行一个异步的HTTP(Ajax)的请求。
var ajax = createAjax({
url: 'http://192.168.1.113:8080/github/jQuery/jsonp.php',
data: {
'action': 'aaron'
}, // 预传参的数组
dataType: 'jsonp', // 数据类型
jsonp: 'callback', // 指定回调函数名,与服务器端接收的一致,并回传回来
jsonpCallback:flightHandler,
success: function() {
show('局部事件success')
}
})
})
模拟jsonp的实现的更多相关文章
- jsonp和事件发布监听
模拟jsonp var id = 0; function JSONP(url,param,cb){ var callbackName = "json_" + id++; var a ...
- python&JSONP(初级篇)
JSONP产生背景 1.跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 2.浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互. 3.如果协议,端口和主机对 ...
- 前端跨域(二):JSONP
上一篇文章 前端跨域(一):CORS 实现了跨域的一种解决方案,IE8 和其他浏览器分别通过 XDomainRequest 和 XHR 对象原生支持 CORS.这次我将补一补 Web 服务中也非常流行 ...
- 折腾nock给jsonp进行单元测试
概述 前几天学习用Jest和nock.js对异步api进行单元测试.在项目中,我用到了jsonp,自然想到对jsonp进行单元测试. 过程很折腾,结果很有趣. jsonp.js 首先axios或者fe ...
- 简单的jsonp实现跨域原理
什么原因使jsonp诞生? 传说,浏览器有一个很重要的安全限制,叫做"同源策略".同源是指,域名,协议,端口相同.举个例子,用一个浏览器分别打开了百度和谷歌页面,百度页面在执行脚 ...
- JSONP 跨域问题
JSONP跨域请求 什么是跨域: 1.域名不同 2.域名相同端口不同 js出于对安全考虑不支持跨域请求.我们可以使用JSONP解决跨域问题. 一.JSONP是什么 JSONP(JSON with ...
- jsonp模拟获取百度搜索相关词汇
随便写了个jsonp模拟百度搜索相关词汇的小demo,帮助新手理解jsonp的用法. <!DOCTYPE html><html lang="en">< ...
- JavaScript:原生模拟$.ajax以及jsonp
现实项目中,常常会用到请求,但是在考虑低版本的浏览器时,promise相关的axios,fetch这类第三方库的支持率就不那么好了,再考虑到最大的一个问题,跨域,更是让人头痛,虽然也有fetch-js ...
- jsonp 原理 并模拟实现一个简单的jsonp
jsonp产生的背景 1.从原网站向目标网站(服务端)发送ajax请的时候,由于浏览器的安全策略(这两个网站只要域名,端口,协议 有一个不同就不允许请求访问)导致跨域,从而请求无法正常进行. 2.We ...
随机推荐
- C++:一般情况下,设计函数的形参只需要两种形式
C++:一般情况下,设计函数的形参只需要两种形式.一,是引用形参,例如 void function (int &p_para):二,是常量引用形参,例如 void function(const ...
- Nginx反向代理和负载均衡
一.Nginx反向代理设置 从80端口转向其他端口反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的 ...
- 字符串转换为数字---使用java7的装箱功能
以前转换只知道使用Xxx.prasexxx方法,原来,还可以直接装箱自动转换. //String类型字符串 String intStr = "123"; int str2int1 ...
- Android进程间通讯
最近研究了一下Android进程间通讯,原来只是会用,但是只是会用是不行滴,就来研究一下. 刚开始看的时候,我的头是这么大,看了一夜的时候,头就变成这样了,,吓得宝宝赶紧上床休息了,. 先喝喝茶讲个故 ...
- *HDU1848 博弈
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- Google Protocol Buffer开发环境搭建注意事项
PB的安装配置基本上依照网上的教程做就没什么问题:有一点要注意到是当遇到libcmt.lib或msvcrt.lib等lib库与PB中的库冲突时,一定要检查工程的编译方式完全一致,整个项目当中都要注意这 ...
- bzoj2599: [IOI2011]Race(点分治)
写了四五道点分治的题目了,算是比较理解点分治是什么东西了吧= = 点分治主要用来解决点对之间的问题的,比如距离为不大于K的点有多少对. 这道题要求距离等于K的点对中连接两点的最小边数. 那么其实道理是 ...
- jquery/zepto 圣诞节雪花飞扬
下载地址: http://www.html5tricks.com/jquery-html5-christ-snow.html 演示地址: http://www.html5tricks.com/jque ...
- jetty项目中静态文件不能修改问题
修改web.xml 在web.xml中加入如下代码: <servlet> <servlet-name>default</servlet-name> <serv ...
- window.location.href 中文乱码问题。。。。
window.location.href 中文乱码问题.... 要解决此问题需要两次解码, 第一次解码: 是在页面中的js脚本中解码:window.location.href = "save ...