位置: 编程技术 - 正文

解决jQuery使用JSONP时产生的错误(jquery 使用)

编辑:rootadmin

推荐整理分享解决jQuery使用JSONP时产生的错误(jquery 使用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:使用jquery操作dom,jquery使用教程,使用jquery实现的项目,使用jquery实现的项目,jquery的使用步骤,使用jquery操作dom,jquery使用教程,js怎么用jquery,内容如对您有帮助,希望把文章链接给更多的朋友!

什么是域,简单来说就是协议+域名或地址+端口,3者只要有任何一个不同就表示不在同一个域。跨域,就是在一个域中访问另一个域的数据。

如果只是加载另一个域的内容,而不需要访问其中的数据的话,跨域是很简单的,比如使用iframe。但如果需要从另一个域加载并使用这些数据的话,就会比较麻烦。为了安全性,浏览器对这种情况有着严格的限制,需要在客户端和服务端同时做一些设置才能实现跨域请求。

JSONP简介JSONP(JSON with Padding)是一种常用的跨域手段,但只支持JS脚本和JSON格式的数据。顾名思义,JSONP是利用JSON作为垫片,从而实现跨域请求的一种技术手段。其基本原理是利用HTML的<script>标签天生可以跨域这一特点,用其加载另一个域的JSON数据,加载完成后会自动运行一个回调函数通知调用者。此过程需要另一个域的服务端支持,所以这种方式实现的跨域并不是任意的。

JQuery对JSONP的支持JQuery的Ajax对象支持JSONP方式的跨域请求,方法是将crossDomain参数指定为true并且将dataType参数指定为jsonp[1],或者使用简写形式:getJSON()方法[2]。例如:

使用getJSON时,需要在参数中指定jsoncallback=&#;,这个就是前面所说的回调函数,JQuery会自动以一个随机生成的值(回调函数名)来替换该参数中的问号部分,从而形成jsoncallback=jQueryxxxxxxx这种形式的参数,然后和其他参数一起使用GET方式发出请求。

使用第一种方式时,只要将dataType参数的值指定为jsonp,JQuery就会自动在请求地址后面加上jsoncallback参数,因此无需手动添加。

JQuery跨域请求的缺陷:错误处理跨域请求可能会失败,比如对方服务器的安全设置拒绝接受来自我方的请求(我方不在对方的信任列表中),或者网络不通,或对方服务器已关闭,或者请求地址或参数不正确导致服务器报错等等。

在JQuery中,当使用ajax或getJSON发送请求后会返回一个jqXHR对象[3]。该对象实现了Promise协议,所以我们可以使用它的done、fail、always等接口来处理回调。例如我们可以用在它的fail回调中进行请求失败时的错误处理:

这种方式能够处理“正常的错误”,例如超时、请求被中止、JSON解析出错等等。但它对那些“非正常的错误”,例如网络不通、服务器已关闭等情况的支持并不好。

例如当对方服务器无法正常访问时,在Chrome下你会在控制台看到一条错误信息:

JQuery不会处理该错误,而是选择“静静地失败”:fail回调不会执行,你的代码也不会得到任何反馈,所以你没有处理这种错误的机会,也无法向用户报告错误。

一个例外是在IE8。在IE8中,当网络无法访问时,<script>标签一样会返回加载成功的信息,所以JQuery无法根据<script>标签的状态来判断是否已成功加载,但它发现<script>标签“加载成功”后回调函数却没有执行,所以JQuery以此判断这是一个“解析错误”(回调代码没有执行,很可能是返回的数据不对导致没有执行或执行失败),因此返回的错误信息将是“xxxx was not called”,其中的xxxx为回调函数的名称。

也就是说,由于IE8(IE7也一样)的这种奇葩特性,导致在发生网络不通等“非正常错误”时,JQuery反而无法选择“静默失败”策略,于是我们可以由此受益,得到了处理错误的机会。例如在这种情况下,上面的例子将会弹出“xxxx was not called”的对话框。

解决方案当遇到“非正常错误”时,除了IE7、8以外,JQuery的JSONP在较新的浏览器中全部会“静默失败”。但很多时候我们希望能够捕获和处理这种错误。

解决jQuery使用JSONP时产生的错误(jquery 使用)

实际上在这些浏览器中,<script>标签在遇到这些错误时会触发error事件。例如如果是我们自己来实现JSONP的话可以这样:

在新浏览器中,当发生错误时将会触发error事件,从而执行onerror回调弹出alert对话框:

但是麻烦在于,JQuery不会把这个<script>标签暴露给我们,所以我们没有机会为其添加onerror事件处理器。

下面是JQuery实现JSONP的主要代码:

可以看到script是一个局部变量,从外部无法获取到。

那有没有解决办法呢?当然有:

自己实现JSONP,不使用JQuery提供的 修改JQuery源码(前提是你不是使用的CDN方式引用的JQuery) 使用本文介绍的技巧

前两种不说了,如果愿意大可以选择。下面介绍另一种技巧。

通过以上源码可以发现,JQuery虽然没有暴露出script变量,但是它却“暴露”出了<script>标签的位置。通过send方法的最后一句:

head.insertBefore( script, head.firstChild );可以知道这个动态创建的新创建标签被添加为head的第一个元素。而我们反其道而行之,只要能获得这个head元素,不就可以获得这个script了吗?head是什么呢?继续看源码,看head是怎么来的:

head = document.head || jQuery("head")[0] || document.documentElement;原来如此,我们也用同样的方法获取就可以了,所以补全前面的那个例子,如下:

这样我们就可以在所有浏览器(严格来说是绝大部分,因为我没有测试全部浏览器)里捕获到“非正常错误”了。

这样捕获错误还有一个好处:在IE7、8之外的其他浏览器中,当发生网络不通等问题时,JQuery除了会静默失败,它还会留下一堆垃圾不去清理,即新创建的<script>标签和全局回调函数。虽然留在那也没什么大的危害,但如果能够顺手将其清理掉不是更好吗?所以我们可以这样实现onerror:

这样一来就趋于完美了。

完整代码

以上代码在IE8、IE、Chrome、FireFox、Opera、下测试通过,其中是IE内核版本,其他浏览器暂时未测。

希望本文对大家学习,帮助大家解决jQuery使用JSONP时产生的错误。

jQuery 1.9.1源码分析系列(十三)之位置大小操作 先给大家展示谢jQuery.fn.css(propertyName[,value]|object)(函数用于设置或返回当前jQuery对象所匹配的元素的css样式属性值。如果需要删除指定的css属性,请使

jQuery 1.9.1源码分析系列(十四)之常用jQuery工具 为了给下一章分析动画处理做准备,先来看一下一些工具。其中队列工具在动画处理中被经常使用。jQuery.fn.queue(([queueName][,newQueue])||([queueName,]callback))(

Jquery左右滑动插件之实现超级炫酷动画效果附源码下载 分享一款基于jQuery超级酷动画滑动插件。这是一款基于jquery.pogo-slider插件实现的多个滑块切换特效。效果图如下,如果大家觉得还不错,很满意可以下

标签: jquery 使用

本文链接地址:https://www.jiuchutong.com/biancheng/376187.html 转载请保留说明!

上一篇:jquery实现触发时更新下拉列表内容的方法(jquery触发点击操作)

下一篇:jQuery 1.9.1源码分析系列(十三)之位置大小操作(jquery fadein 源码)

  • 基于php实现的php代码加密解密类完整实例(php功能实现)

    基于php实现的php代码加密解密类完整实例(php功能实现)

  • 详解DB2 sqlstate 57016 SQLCODE=-668 原因码

    以上所述是小编给大家介绍的详解DB2 sqlstate SQLCODE=- 原因码 "7"错误的快速解决办法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对积木网网站的支持!

    SQL Server 数据库分离与附加 就这么简单! 一、概述SQLServer提供了分离/附加数据库、备份/还原数据库、复制数据库等多种数据库的备份和恢复方法。这里介绍一种学习中常用的分离/附加方法,

    深入浅析SQL封装、多态与重载 面向对象1.类:众多对象抽象出来的2.对象:类实例化出来的3.类的定义关键字class4.类里面包含成员变量成员属性成员方法5.面向对象三大特性(1)封装

    在Sql Server中调用外部EXE执行程序引发的问题 一、先开启xp_cmdshell打开外围应用配置器—功能的外围应用配置器—实例名DatabaseEnginexp_cmdshell—启用二、解决方法usemasterExecxp_cmdshell'mkdird:csj" class="img-responsive" alt="详解DB2 sqlstate 57016 SQLCODE=-668 原因码 "7"错误的快速解决办法(详解增发万亿国债细节)">

    详解DB2 sqlstate 57016 SQLCODE=-668 原因码 "7"错误的快速解决办法(详解增发万亿国债细节)

  • Vista系统自带IIS 7.0设置图解(windows vista(service pack1))

    Vista系统自带IIS 7.0设置图解(windows vista(service pack1))

  • 允许多用户登陆Windows 2008远程桌面的方法(图文)(windows允许多用户登录)

    允许多用户登陆Windows 2008远程桌面的方法(图文)(windows允许多用户登录)

  • Mac App Store中的已购项目隐藏和取消隐藏解决步骤(macbook appstore在哪)

    Mac App Store中的已购项目隐藏和取消隐藏解决步骤(macbook appstore在哪)

  • 用css制作星级评分第1/3页(css制作排行榜)

    用css制作星级评分第1/3页(css制作排行榜)

  • [置顶]
        openGL学习笔记二:看看上一篇我们写的代码([置顶]bilinovel)

    [置顶] openGL学习笔记二:看看上一篇我们写的代码([置顶]bilinovel)

  • javascript实现Email邮件显示与删除功能(email js)

    javascript实现Email邮件显示与删除功能(email js)

  • 税局退个税手续费税率
  • 如何办理车辆购置置换补贴手续
  • 纳税额是指
  • 个人所得税征收标准表
  • 财务状况说明表财务报表有什么区别
  • 个税申报数据有误,如何快速更正
  • 租赁合同印花税率
  • 经营所得预缴申报时间
  • 累计折旧可以直接计入主营业务成本吗
  • 申报后发现成本算错了
  • 餐饮公司开分店还需要办手续吗
  • 无形资产资本化加计扣除可抵扣暂时性差异
  • 股权转让如何避免土地增值税
  • 累计折旧借贷方向分录
  • 物业要交多少钱
  • 合同期限3年
  • 培训费用可以开专票吗
  • 房地产企业开发资质查询
  • 发票密码区出格了怎么调整
  • 购入商品怎么做会计分录
  • 车间发生的购买办公用品支出应计入什么账户
  • 工程项目预缴税金
  • 注销未分配利润怎么处理账务
  • 存货盘亏进项税额转出会计分录怎么做
  • 在建工程会计账务处理是否有利润表
  • 高速过路费抵扣进项怎么填报
  • php计算时间
  • Mac如何开启无痕浏览
  • php的pdo
  • 母子公司吸收合并税务处理
  • php中的常用魔术有哪些
  • 生产型企业出口退税计算案例
  • 企业和单位往来怎么做账
  • 中国移动常被称为
  • 编程前十名
  • 员工旅游的费用账务处理
  • 固定资产清理的账务处理
  • SQL Server 2008用'sa'登录失败,启用'sa'登录的解决办法
  • mysqlreport显示Com_中change_db占用比例高的问题的解决方法
  • 事业单位以固定工资为准
  • 需要什么证件和材料
  • 发放职工工资是什么支出
  • 上缴非税收入的税种
  • 什么情况填an
  • 年收益率与年化利率是一样?
  • 失业保险金退回短信
  • 对于成员单位归集至集团母公司账户的资金
  • 管理费用怎样分摊归集到产品
  • 收到个人所得税手续费返还如何做账
  • 购物卡送给客户的账务处理
  • Mysql使用or如何优化
  • 一条sql语句搞定一个数据
  • mysql函数大全以及举例
  • win 9x
  • 让Windows Server 2008系统安全更上一层楼
  • win7系统如何一键还原
  • win10的svchost干什么的
  • ubuntu和windows哪个流畅
  • win10打开ie8
  • windows 10的应用商店中的应用
  • msg是什么文件
  • 在Linux系统中安装镜像步骤
  • linux终端怎么用
  • RedHatLinux AS3中APACHE+SendMail+OpenWebMail整合
  • win7系统点击图标没反应
  • linux支持哪些类型的设备
  • 贪心算法编程题
  • jquery加载函数
  • linux conky
  • 怪物掉落物品的获取方式
  • 通过制作潜望镜活动,你获得哪些宝贵的经验
  • android解析xml的方法中,将整个文件加载到内存
  • javascript对象主要包括
  • js的判断类型
  • EditText 点击事件小问题
  • js设计模式有什么用
  • 应税消费品通过什么科目核算
  • 浙江国地税联合电子税务局
  • 广州酒家月饼抽奖公告最新
  • 计财科科长是什么级别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设