解决transport.js中Object.prototype.toJSONString导致的jQuery冲突

作者:半夏时间:2026-10-28 22:10:32浏览:390

本文分析transport.js通过重写Object.prototype.toJSONString导致与jQuery等框架冲突的原因,并提供解决方案。通过将原有调用替换为自定义obj2str函数,避免原型链污染,从而解决JSON序列化时的兼容性问题。

冲突原因分析

问题根源在于 /js/transport.js 文件中存在一段约580至590行的代码,该代码重写了 Object.prototype.toJSONString 方法用于格式化 JSON。这种对原生对象原型结构的直接修改,极易与 jQuery 等其他 JavaScript 框架产生冲突。若要解决此问题,必须注释掉这段代码,并采用其他方式替代原有的序列化逻辑。

解决方案与代码替换

具体的处理思路是将所有调用 *.toJSONString 的地方替换为一个自定义函数。例如,在 /js/common.js 的第29行中,原有的代码逻辑为:Ajax.call(‘flow.php?step=add_to_cart', ‘goods=' + goods.toJSONString, addToCartResponse, ‘POST', ‘JSON');

需要将该调用替换为使用自定义函数的形式。

修改后的代码为:Ajax.call(‘flow.php?step=add_to_cart', ‘goods=' + obj2str(goods), addToCartResponse, ‘POST', ‘JSON'); 其中 obj2str 函数的定义如下:

obj2str函数实现


function obj2str(o){
var r = [];
if(typeof o ==”string”) return “\”"+o.replace(/([\'\"\\])/g,”\\$1″).replace(/(\n)/g,”\\n”).replace(/(\r)/g,”\\r”).replace(/(\t)/g,”\\t”)+”\”";
if(typeof o ==”undefined”) return “undefined”;
if(typeof o == “object”){
if(o===null) return “null”;
else if(!o.sort){
for(var i in o)
r.push(“\”"+i+”\”"+”:”+obj2str(o[i]))
r=”{“+r.join()+”}”
}else{
for(var i =0;i<o.length;i++)
r.push(obj2str(o[i]))
r=”["+r.join()+"]”
}
return r;
}
return o.toString();
}

注意事项

完成上述替换后,问题通常即可解决。不过,可能仍存在一些脚本层面的细微错误需要手动排查和处理。这仅是一种可行的解决思路,具体实施时请根据实际网站环境进行调整。

原始代码参考

作为对比,被注释掉的原始代码如下:


/*
Object.prototype.toJSONString = function () {
……
// Join all of the fragments together and return.

a.push(‘}');
return a.join(”);
};
*/
作者最新文章