json.js和ExtJS都是有名的开源的东东,但是这两个有名的东东在一起使用时会出现一些问题,我就遇到一例,害我折腾了大半天,郁闷!现把问题和解决方法记下来以为后来者提个醒。
问题的出现:
当如下使用ExtJS
win = new Ext.Window({
title: '123',
width: 600,
height: 400,
closeAction: 'close', // 注意这里是close,也就是说当关闭窗口时,窗口会被销毁destroy
plain: true,
resizable : false,
layout: 'border',
items: [ grid ], // grid是一个Ext.grid.GridPanel
buttons: [{
text: '关闭',
handler: function(){
win.close();
win = null;
}
}]
});
并且页面引用了json.js。当执行win.close()或点击左上角的x按钮时会出现错误
---------------------------
错误
---------------------------
出现了运行时间错误。
是否要进行调试?
行: 142
错误: 'config.isTarget' 为空或不是对象
---------------------------
是(Y) 否(N)
---------------------------
解决办法:
打开json.js文件,到文件末尾,找到
if (!Object.prototype.toJSONString) {
Object.prototype.toJSONString = function (filter) {
return JSON.stringify(this, filter);
};
Object.prototype.parseJSON = function (filter) {
return JSON.parse(this, filter);
};
}
代码,注释掉,这样就不出问题了。
分析:
出现问题的原因在于ExtJS操作了json为对象增加的两个函数toJSONString和parseJSON,json.js的做法是好的,ExtJS的做法也是不错的,但是把他们放在一起就会打架,之所谓鱼与熊掌不可兼得啊,只好委屈一下json.js了,另外追究ExtJS的问题也是难度的,所以就遵循吃柿子的规则了。
在注掉那几行代码(见解决办法)后,我们再处理JSON时可能会多写一些代码,来个补救措施吧,呵呵
在json.js最后加上一下代码
function toJSON(obj, filter) {
if (typeof obj != 'string')
return JSON.stringify(obj, filter);
else
return JSON.parse(obj, filter);
}
以后不管是JSON对象到字符串,还是字符串到JSON对象,都可以使用toJSON函数搞。