火狐控制台提示 jQuery toJSON 报错

本文详细解析了一起在火狐43.0.3版本下,使用jQuery $.getJSON方法时报错'TypeError: 'toJSON' called on an object that does not implement interface PerformanceNavigation'的问题。通过深入分析,最终定位到问题出在data参数上,特别是data对象继承的性能导航对象。文中提供了两个解决方案:过滤不必要的继承属性和修改对象的toJSON属性,以避免错误发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 火狐控制台提示报错信息为:TypeError: 'toJSON' called on an object that does not implement interface PerformanceNavigation.

   火狐版本为:43.0.3

具体的报错信息如下:

TypeError: 'toJSON' called on an object that does not implement interface PerformanceNavigation.

.param/e()
 jquery.min.js:4
ca()
 jquery.min.js:2
ca()
 jquery.min.js:2
ca()
 jquery.min.js:2
.param()
 jquery.min.js:4
.ajax()
 jquery.min.js:4
f[c]()
 jquery.min.js:4
.getJSON()
 jquery.min.js:4
e.sendPerformanceTime()
 xxxxxxxx.min.js:44

一般这样的情况可以忽略jQuery 本身的报错行,先找其它文件的报错行,最底下的,44行,点进去看看,

$.getJSON("XXXXX?callback=?", data);

进一步跟进后发现,是调用$.getJSON 时报错了,进一步锁定问题出在,data 上,查看data 的值完全发现符合 js 对象,表面上看不出什么来,只能进一步跟进,

由于线上是压缩版jquery 所以先用 fiddler 指向本地未压缩版 (PS:本次用jQuery的版本是1.11.2,),fiddler 操作不再详述,

对 $.getJSON 的跟进问题锁定在 $.param 方法,

对$.param 方法跟进发现问题锁定在,param 方法中的,add 方法上

jQuery 1.11.2  9501 行

value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );

可以看到,param 方法对对象方法的处理是这样的,直接执行,这样处理,一般情况下不会出什么问题,一般情况是没事,遇到特殊情况那就报错了,

首先查看本次报错的data 对象,调试发现一个一直忽略的问题,那就是,对象的【继承属性和方法】,由于,object 对象是引用类型,所以 本次,data 对象 中引用了 performance.navigation对象

(截图丢失)自行调试

可以看到,navigation对象拥有 toJSON方法

(截图丢失)自行调试

当调用$.param  时, 对对象属性的遍历处理,

add = function( key, value ) {
   // If value is a function, invoke it and return its value
   value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
   s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
};

(截图丢失)自行调试

进一步执行

(截图丢失)自行调试

报错了,就是执行,toJSON时报错了,

解决方案,

1 发送数据,过滤掉不必要继承属性,

2 “删掉” 该对象的 toJSON 属性,需要注意的是,此属性是继承属性,直接 delete 该对象属性是不行的, 可以给它赋值为null ,


结语:明明很正常的东西,结果不正常,一定是有忽略的地方,





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值