js&jquery跨域详解jsonp,jquery并发大量请求丢失回调bug

jQuery向后台传入json格式数据的方法 本文实例讲述了jQuery向后台传入json格式数据的方法。分享给大家供大家参考。具体分析如下: 前后台数据交互一般都用json格式,后台可以直接将json对应转化为实体对象。方便以后的操作。jQuery向后台传数据的时候,我们会发现他会自动转化成查询字符串,不能真正传入一个json。而且用jquery对表单序列化的时候,返回的格式是一个数组,还需要作进一步转换。其实只要我们在ajax方法中配置一些东西就可以完成。代码如下: <form id="ff"> <input type="text" name="test1"/> <input type="text" name="test2" 立即下载

URL说明是否允许通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹允许
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口不允许
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同协议不允许
http://www.a.com/a.js
http://70.32.92.74/b.js
域名和域名对应ip不允许
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同不允许
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上)不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名不允许
这张表上已经说清楚了哪些情况允许通信,哪些不允许通信。

我们现在要解决的问题是将这些不允许变为允许。。。

JS跨域

1、为什么会有跨域?

简单的来说,在发送ajax请求的时候会遇到js跨域

大家都知道,发送ajax的时候会用到XMLHttpRequest这个对象,但是为了安全,浏览器对象做出了限制,不允许上表中的不允许情况通信。。。

所以,只要不使用XMLHttpRequest对象发送ajax请求,就不会出现跨域限制的问题。

2、不使用ajax发送请求,但是要达到局部刷新的效果怎么办?

假设请求的网页为本地的1.html

<html>
<head>
</head>
<body>
</body>
</html>

动态加载js

var script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://bbb.com";
var head = document.getElementsByTagName("head")[0];
head.insertBefore(script, head.firstChild);

这段代码执行完成后,会在head标签中加入http://bbb.com这个地址的响应内容,例:

如果http://bbb.com这个地址返回的是字符串123,那么当前调用页面的结果即为

<html>
<head>
<script src="http://bbb.com" type="text/javascript">
123
</script>

</head>
<body>
</body>
</html>

如果http://bbb.com这个地址返回的是test("ccc"),那么当前调用页面的结果即为

<html>
<head>
<script src="http://bbb.com" type="text/javascript">
test("ccc");
</script>

</head>
<body>
</body>
</html>

看到这里应该就明白了,其实这段动态加载js的代码只是把另一个页面的内容加载到本页面了

现在这个页面运行的时候会报错,缺少test方法,因为没有定义test就调用了,我们在本地的1.html加入test方法

<html>
<head>
<script>
function test(a){
console.log(a);
}

var script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://bbb.com";
var head = document.getElementsByTagName("head")[0];
head.insertBefore(script, head.firstChild);

</script>
</head>
<body>
</body>
</html>


好了,1.html就是最终的样子,执行的顺序是:

1.先初始化test方法

2.创建script标签,加载http://bbb.com的内容,将返回结果插入到head标签

3.返回结果是test("ccc") 调用了test方法,就打印出来ccc了

3.能否不使用动态创建script的方式呢,怎么感觉没用?

完全可以。

<html>
<head>
<script>
function test(a){
console.log(a);
}
</script>
<script src="http://bbb.com" type="text/javascript" ></script>
</head>
<body>
</body>
</html>

这么写效果是一样的,并不是说一定要动态加载script标签才是跨域,这里是一个误区哦~

那为什么要使用动态加载script标签呢?

原因有两个:

1.src动态改变,不用写死。

2.异步加载。如果src需要加载的内容返回结果较慢,动态创建script标签是异步加载的不会出现阻塞。

js的跨域已经说清楚了吧,下面我们来看下jquery的跨域

jquery跨域

大家都知道jquery 是 js写的,所以不用看源码也知道它的原理就是我们上面说的js的跨域原理
我们主要说下$.ajax ,用过jquery的同学肯定都用过这个方法,封装的很好,用起来很方便
jquery1.2的时候加入了jsonp这个参数类型来支持jquery的跨域,例:
 $.ajax({
        url: "http://bbb.com",
        type: "get",
        data:{p1:1,p2:2},
        dataType: "jsonp",
        jsonp: "callback",

        success: function(aaa) {
             console.log(aaa);
        }
    });
只需要在正常的ajax代码中写上红色的内容,就可以完成跨域的ajax请求了。是不是使用起来很方便O(∩_∩)O~

js跨域和jquery跨域有什么优缺点?


jquery已经将所有的调用封装成对象,调用起来很方便
js跨域写起来比较麻烦,尤其是传递参数的时候,需要手动拼接data ?&p1=1&p2=2
但是jquery的跨域有个bug,当同时发出大量请求瞬间返回结果时,会导致接收请求的时候丢失部分回调请求(实际上已经发送成功了)
例:

这种情况很常见,就是循环发送ajax请求么。
非跨域请求这么写没有问题,success会被调用100次,但是当dataType : "jsonp"时,success可能只会执行70次80次,剩下的请求没有成功也没有失败,用complete也抓不到。
浏览器会报错找不到callback,或无任何提示。有两个地方会引起这种问题
		// Clean-up function
		jqXHR.always(function() {
			// Set callback back to previous value
			window[ jsonpCallback ] = previous;
			// Call if it was a function and we have a response
			if ( responseContainer && jQuery.isFunction( previous ) ) {
				window[ jsonpCallback ]( responseContainer[ 0 ] );
			}
		});
1.callback被清除,所以有时候会报出找不到callback这个方法
2.xmlHttp.readyState==4  同时发送请求的时候,浏览器的状态只有这么一个readyState当浏览器知道已经获取返回结果了,就不接收请求了
这个肯定是jquery的bug,使用js跨域没有问题
ajax JSONP请求处理回调函数jsonpCallback区分大小写 使用ajax进行 JSONP跨域请求,因为被请求的对方的回调函数名称是无法修改。而这边页面中会出现多个不同JSONP请求,但他们的回调函数名称都是同一个,_Callback。想到设置AJAX 的JSONP参数。但是发现根本不起作用。最后偶然发现 jsonpcallback是区分大小写的。必须是 jsonpCallback 而不是jsonpcallback 代码如下: $.ajax({ url: ‘http://www.zbphp.com/j.php?act=json&tm=’, dataType: ‘JSONP’, jsonpCallback: ‘_GroupMember_Callback’ 立即下载

相关推荐

Python与numpy版本兼容性排查指南

本文详细解析了Python与numpy版本兼容性问题,提供了快速诊断和解决版本冲突的实用方法。通过查看版本信息、使用官方兼容性对照表以及降级或升级环境等方案,帮助开发者有效避免常见的报错问题,如'ImportError'和'AttributeError'。文章还介绍了使用虚拟环境和requirements.txt等工程实践,确保项目依赖的稳定性。

weixin_29089057的博客 319

json请求参数过长被截断导致解析失败

可能出现的原因: 一、Nginx配置问题 解决方法; 在Nginx配置文件中添加以下参数,增加缓存字符串大小 head{ proxy_buffers 16 512k; //此处值代表nginx 设置 16个 512k 的块进行缓存,总共大小为16*512k proxy_buffer_size 512k; //磁珠值代表每块大小 } 检查proxy-temp目录的读写权限,为Nginx用户授权 chown -R user:user /usr/local/nginx/proxy-temp

EricXiao666的博客 6050

ESP32-S3双模CMSIS-DAP调试器:USB+WiFi无线调试方案

CMSIS-DAP是ARM生态中标准化的嵌入式调试协议接口,广泛用于Keil、IAR、STM32CubeIDE等开发环境。其核心原理是通过SWD/JTAG物理层实现目标芯片寄存器访问、内存读写与断点控制,依赖确定性时序和低延迟通信。传统DAPLink调试器受限于USB线缆束缚,而WiFi-USB-DAPLink项目将完整CMSIS-DAP v2协议栈移植至ESP32-S3平台,同时支持USB CDC直连与WiFi TCP远程通道,兼顾实时性与网络化部署能力。该方案无需主机驱动、兼容主流IDE,并支持多机并发

weixin_31185473的博客 368

JS中(JS转换json/jQuery转换json)中的long型大数精度丢失问题

最近在后台向前台传输对象id时,遇到一个奇怪的问题.类似代码如下: var str = '{"id":217998860110340096}'; var jsonObj1 = $.parseJson(str);//jQuery插件支持的转换方式 var jsonObj2 = JSON.parse(str);//浏览器支持的转换方式(Firefox,chrome,opera,safari,ie)...

BlueKitty的博客 9145

全志T133-s3(Tina Linux)下RTL8723DS WiFi驱动移植与调试实战

本文详细介绍了在全志T133-s3平台(Tina Linux)上移植RTL8723DS WiFi驱动的完整流程,包括硬件连接、驱动源码获取、内核配置、系统适配、设备树配置以及常见问题排查。通过实战案例,帮助开发者快速解决SDIO接口通信、固件加载、电源管理等关键问题,实现稳定的WiFi功能。

weixin_30505225的博客 507

使用FloodRisk2插件进行洪水风险评估

入汛以来,长江流域持续的强降雨使得沿岸多地成为洪水风险极高地区,抗洪、抢险、救灾继新冠病毒之后成为又一个攻坚阵地。如何科学地评估洪水风险,是快速决策的关键。 实际生活中,根据风险是否可控,一般将洪水风险大致分为两类:一类是通过数据分析可以得出其发生的可能性和后果,如强降雨引发的区域性洪水、水库/大坝溃决洪水等。这类洪水可以通过有关资料分析和设定一定条件计算得到可能的损失后果,也就是说,风险可以预判。另一类洪水风险基本是未知的,如滑坡堵塞河道形成堰塞湖引发的洪水,无法预知事件发生的地点和规模,具体的洪水风险无

QGISClass的博客 2877

jquery 传参数过长

在使用jquery 发请求到后台时,有时有响应有时没响应,不稳定,经检查,在传递参数时,有个字段可以传递2000个字,字母可以传递到后台,而汉字就会出现上述情况。 查询资料,发现jQuery.getJSON(url, arr, function call(result) 默认使用的是get请求方式,修改成jQuery.post(url,arr,function callback()方法就可以...

yuebancanghai的博客 655

2025年度工业级3D全景相机技术解析选型参考:国产品牌的技术突围与市场格局

本文分析了工业级3D相机在智慧城市和建筑数字化中的应用。通过对比国内外主流设备的技术参数和应用场景,发现国产品牌如众趣科技在性价比和本地化服务方面具有优势,尤其适合大型空间扫描项目;而国际品牌如Faro、Leica则在精度和可靠性上保持领先。建议根据项目需求(如测距范围、精度要求、预算)进行设备选型,综合考虑扫描效率、数据处理能力和系统兼容性。国产品牌已在国内大型基建项目中展现出竞争力,国际品牌则更适合高精度逆向工程和国际化项目。

gxdtgsy的博客 1072

如何解决jquery.jsonp请求在并发情况下容易发生异常的bug

知道现在使用jsonp的公司越来越少了,似乎有比jsonp更好的跨域方案。但是我发现腾讯视屏、爱奇艺视频、优酷土豆等大型互联网公司还在使用它时,我决定写一篇文章彻底解决jsonp在并发条件下报错的问题。毕竟jsonp有最好的兼容性。 先附上源码连接 Github 1. 为什么会报错 你是不是见过以下错误,通常在并发情况下容易出现这个错误,而且是否出错有随机性。 Uncaug...

David糖的博客 3213

【四季发财中线】通达信炒股指标副图指标使用图文教程,短线紫色柱线操作,与中线短柱线共振抓牛股妖股主升浪

如上图标记位置,对应的是副图指标的紫色柱线开始的位置,这个紫色柱线信号开始出现,也是短线进场做多的信号,紫色柱线的持续出现和加长,可以持股待涨,或行情继续上涨的可以在分时行情中逢低进场短线顺势做多。如上图标记部分,指标的主要部分信号,三行柱线-ZR-ZC -ZM,当出现这三行信号时,中线或波段看多做多,信号持续则中线顺势做多和持股待涨。不论是跟踪信号的出现先后进场和持股,或是在中线多头的行情中,找到短线转多信号进场做安全的短线操作机会,都是非常好的指标信号和辅助操作功能。

weixin_69760830的博客 1602

别再到处找DEM了!手把手教你免费下载90米、30米、12.5米全球高程数据(附国内网盘链接)

本文详细介绍了如何免费获取全球90米(SRTM3)、30米(ASTER GDEM)和12.5米(ALOS)高精度DEM数据,并提供了国内网盘链接以绕过国际平台访问障碍。通过对比不同数据源的特点和适用场景,帮助用户根据项目需求选择最合适的DEM数据,同时分享了数据处理和质量提升的实用技巧,实现从数据获取到应用的无缝衔接。

weixin_28725949的博客 669

AJAX并发出现的问题,急

在实际中遇到ajax并发请求出现的消息串发的情况,请达人给予帮助。 1.在ajax并发情况下,发现有时出现post消息体发串了。 比如说,页面上起两个定时器,每隔2s触发两个ajax请求,分别调用后台的A.do,B.do,传的参数分别为a,b。都采用post方法。 例如 xhConn.connect(服务器+"A.do",,POST", "a=aaa", functi...

lupingyu 279

3、利用预训练卷积神经网络进行特征提取

本文介绍了如何使用预训练的卷积神经网络(如VGG16)进行图像特征提取,并将提取的特征存储在HDF5数据集中,以便后续用于机器学习模型的训练。文章详细阐述了特征提取的原理、HDF5数据格式的优势、HDF5DatasetWriter类的实现、特征提取流程的代码实现以及实际应用案例。通过该方法,可以在多种图像数据集上高效构建高精度的分类模型。

z2a3b4c5d的博客 112

ajax返回数据小数点,jsonp请求到的数据中小数点后的数字没了

在某个项目中,想通过jsonp跨域获取豆瓣API的数据,但发现获取的数据中,评分原本是7.1就变成了7,6.0就变成了6。相关代码$(document).ready(function(){if($("#douban_score").length > 0) {var name = "奇葩说第五季";$.ajax({type: 'get',dataType: "jsonp",jsonp:"cal...

weixin_28729331的博客 508

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jsonp, json区别

JSONP由两部分组成: 回调函数和数据 回调函数是接收到响应时应该在页面中调用的函数,其名字一般在请求中指定。 数据是传入回调函数中的JSON数据。 jsonp var script=document.createElement("script"); script.src="url?callback=handleResponse"; document.body.inse...

weixin_30897233的博客 101

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

生命在于学习——Jsonp漏洞

Jsonp学习笔记记录。

易水哲的博客 1876

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用jsonp有数据返回,但是success不执行的解决办法

最近项目中,突然遇到这种问题,具体: 页面代码: $.getJSON("http://url.url.com?jsonpCallback=?",function (json) { //1.4.2版本中,正常执行 }); 老版页面中用的jquery1.4.2版本,请求jsonp数据一切正常,现在突然升级到1.9.1版本,出现错误: 返回成功,数据返

小记心得 2万+

为什么jsonp只支持get请求?JSONP是同步还是异步

JSONP的原理JSONP 是一种【请求一段 JS 脚本,把执行这段脚本的结果当做数据】的玩法。所以,你能 POST 一段通过 script 标签引入的脚本吗?(如果看过 JSONP 库的源码就知道,常见的实现代码其实就是 document.createElement(‘script’) 生成一个 script 标签,然后插 body 里而已。在这里根本没有设置请求格式的余地)。所以JSONP的实现

初漾的博客 8630

JSONP跨域请求原理及优缺点

一、JSONP与JSON的区别:    JSONP  是一种非正式传输协议,该协议的一个要点就是允许用户传递一个callback 或者开始就定义一个回调方法,参数给服务端,然后服务端返回数据时会将这个callback 参数作为函数名来包裹住 JSON  数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。    JSONP  和 JSON  的区别: JSON  是一种传输格式,而 JS...

杜小白的博客 1万+
上一篇: tomcat7共享二级域名session设置
下一篇: linux下java内存泄露定位jstat+jmap+jhat
javascript_2011
博客等级 码龄15年 45粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值