|
  
|
json.js和ExtJS都是有名的开源的东东,但是这两个有名的东东在一起使用时会出现一些问题,我就遇到一例,害我折腾了大半天,郁闷!现把问题和解决方法记下来以为后来者提个醒。
* y; X+ l+ T3 @$ {- ?0 A7 Z& `- C7 P2 P2 u- h1 N) Q& Q4 i" U
问题的出现:( H) V. R0 p5 d) f, W; }
& s" M2 ?+ V. B- d' k7 m# F }: t 当如下使用ExtJS
5 v& [7 {; \% c
* ^ r4 U* y) e3 } win = new Ext.Window({# F1 k! ]8 |9 X% T# w
title: '123',. A8 B) O# i# Q, v1 f6 J# H
width: 600, A1 i' M# Y4 `! E3 Y7 }
height: 400, Z( o# `1 Q: N0 G3 ]# ?
closeAction: 'close', // 注意这里是close,也就是说当关闭窗口时,窗口会被销毁destroy
, `+ X: W- J& c1 B; j( R plain: true,6 b5 a0 ?: ~9 u
resizable : false,' M( \* O( q% @' ?
layout: 'border',
& `, ~% R0 ^$ E( L( ` items: [ grid ], // grid是一个Ext.grid.GridPanel
8 E" t! z( X$ F3 }3 u) W1 r7 ?" B* Z4 U buttons: [{2 j" S9 u4 \: A" n& N* R
text: '关闭',
& P/ c4 `* F, p! q+ Q4 u: _ handler: function(){1 ]% m8 {" `# K# s4 L
win.close(); 7 N. h3 w2 C) r9 w u3 o
win = null;
7 U' |; k1 \/ g$ x0 T# j3 ?( K3 `$ g } 0 _" u6 H4 u" Q M( k
}]
. N3 ?6 i- q' a2 V. J9 A! n });' Y# L' L) m+ _) J% ?5 a# u
8 _$ d$ K5 h: W5 {) I
并且页面引用了json.js。当执行win.close()或点击左上角的x按钮时会出现错误
6 h: h" J: W- k5 Q& d1 O: }% t N: F7 L+ X" ~' f- C* q0 q1 s* B+ L
---------------------------) C& I% `2 h5 C( @5 |. B
错误! i% ^# }9 _& Z( A/ P9 _5 R
---------------------------
. k& D8 g/ z' K6 w& X' n出现了运行时间错误。% }0 h2 R5 b3 N; _
是否要进行调试?
/ }( _4 ^$ A# i% a+ j# v* o2 O
; N) L$ p7 S9 \- l5 u, R) j) X行: 1421 c: M, h' o8 K/ |( w' F
错误: 'config.isTarget' 为空或不是对象' x R# f: Y2 ^' Z
---------------------------! U+ P( Z3 O; h, ]% h) |
是(Y) 否(N) 7 K% O, v4 s; m
---------------------------0 W2 k' A% b! j
, I% r, T9 w3 e, @
解决办法:
2 c/ l8 r& }: B- b
5 T3 `) A6 n" S4 M+ e3 m打开json.js文件,到文件末尾,找到- M; a4 t/ e% H
{2 d i( k7 D+ N( ?
if (!Object.prototype.toJSONString) {, N3 u. X! i& e) X* @$ b9 Q* Q4 z) ^
Object.prototype.toJSONString = function (filter) {' L2 k1 M% e2 l+ i
return JSON.stringify(this, filter);
@! m3 J: U% D, E% z };
" m9 G3 I. @: _ C; S9 {% `; s) R Object.prototype.parseJSON = function (filter) {+ {- u9 N6 u, a7 |) x( o: g2 q! ^
return JSON.parse(this, filter);
, Q1 X/ M6 _& J8 t };! Q/ T( d" M, R& I
}
5 U P( l4 | J# A" P( _2 g
8 e; m _& W& u' B+ A! u. D代码,注释掉,这样就不出问题了。$ ?- m# X. M" O7 b( X
& L6 R$ n: K! q 1 |8 K- R3 z; R) s( s6 \8 s9 B- ]4 o
4 I$ e6 a9 I2 M3 O! L3 y
分析:
3 d& `9 h8 V- p0 B) _7 |
* b, W0 U! B( n3 D3 U: B" ? 出现问题的原因在于ExtJS操作了json为对象增加的两个函数toJSONString和parseJSON,json.js的做法是好的,ExtJS的做法也是不错的,但是把他们放在一起就会打架,之所谓鱼与熊掌不可兼得啊,只好委屈一下json.js了,另外追究ExtJS的问题也是难度的,所以就遵循吃柿子的规则了。' x6 H/ N' ^, Z" P+ O7 ]
) H: t6 H5 l' G' C. G$ M 在注掉那几行代码(见解决办法)后,我们再处理JSON时可能会多写一些代码,来个补救措施吧,呵呵2 E4 `( Y) S; o- C7 @2 l( V' S
/ F# M$ @/ A6 g" O; q/ A
在json.js最后加上一下代码5 H) Z% _) M6 F. [0 j% l1 {# y" y
) M) g! P Q$ U3 b7 t3 X& n
function toJSON(obj, filter) {8 A4 y1 U% u# ^1 b1 _1 I) {
if (typeof obj != 'string')
8 ]% h* E C0 Q9 H return JSON.stringify(obj, filter);& D# e6 q9 ^( L: N# z9 p% ~+ `' r; L
else
$ a4 z! d0 Q. `$ ?/ s- ~ return JSON.parse(obj, filter);
. y" O5 N3 |: d} ! T7 w9 o5 R' b8 |
9 s8 v6 q' F4 k3 d% k: \$ _
0 n2 }$ _/ b, H3 k: b
6 ~2 K6 M h! @1 B以后不管是JSON对象到字符串,还是字符串到JSON对象,都可以使用toJSON函数搞。 |
|