Facebook Pixel 2.9.42版fbevents.js覆盖全局JSON致MooTools应用异常
问题产生原因
Facebook Pixel 2.9.42版本的fbevents.js新增了JSON polyfill逻辑,但该逻辑的特性检测存在缺陷:
- 仅校验全局JSON对象是否存在
parse、stringify两个标准方法,未识别MooTools为JSON扩展的encode、decode等自定义方法 - 当polyfill逻辑判定需要补全JSON能力时,会直接将
window.JSON整体替换为自带的polyfill对象,完全覆盖MooTools注入的扩展属性,导致依赖这些自定义方法的原有业务代码功能异常 - 2.9.41版本未引入该段有问题的polyfill逻辑,因此不会触发全局JSON被覆盖的问题
可行修复方案
方案1:锁定fbevents.js版本到2.9.41
直接修改fbevents.js加载地址的v参数为2.9.41,规避存在问题的版本:
https://connect.facebook.net/en_US/fbevents.js?v=2.9.41
该方案为临时快速修复方案,长期使用建议关注官方后续版本是否修复了该覆盖问题,再考虑升级。
方案2:冻结全局JSON对象阻止覆盖
在MooTools加载完成后、fbevents.js加载前,执行以下代码将全局JSON设置为不可修改:
Object.defineProperty(window, 'JSON', { writable: false, configurable: false });
该方案不会影响原有JSON的所有方法,同时可以直接禁止fbevents.js替换全局JSON对象。
方案3:备份恢复MooTools的JSON扩展
在加载fbevents.js之前先备份MooTools扩展的自定义方法,等fbevents.js加载完成后再将方法挂载回新的JSON对象:
// fbevents加载前备份 const mooJsonMethods = { encode: JSON.encode, decode: JSON.decode }; // fbevents加载完成后恢复 window.addEventListener('load', () => { Object.assign(JSON, mooJsonMethods); });
如果需要更精准的触发时机,也可以监听fbevents.js脚本的onload事件执行恢复逻辑。
方案4:替换业务代码中的非标准JSON调用
如果项目改造允许,可以将所有业务代码中调用JSON.encode/JSON.decode的逻辑,替换为标准的JSON.stringify/JSON.parse,从根源上不依赖MooTools的非标准扩展,避免后续和其他第三方库产生类似兼容冲突。
内容的提问来源于stack exchange,提问作者diogorighi
相关产品推荐
相关产品推荐

