项目小经验: eval与回车符
今天遇到一个让我一开始无从下手的问题, 页面form中有一个名为备注的textarea, 这里边可以有换行,也就有了回车符.这个form提交到DB后再以ajax的方式从DB中取出备注的信息, 在jsp页面中用javascript里的eval转换成JavaScript的对象时出问题了,那个回车符在eval里捣乱了!
怎么办? 不让用户在备注里换行就没有了回车符,但业务要求应该可以换行的.
首先想到了encode,但怎么与javascript里的eval整合? 对这个encode究竟怎么用也不熟悉.
也想到了javascript里的escape/unescape,但这个escape是把那些特殊符号换成"%"形式的值?
就是换成了在eval里又会不会给eval有影响?试了试, 出错了, 也不知道为什么没有报错信息,是因为在ajax的回调函数里执行的原因?
但这也不应该对eval或escape的执行有影响的.
是不是eval的过?
想到了json里的JSON.parse()方法,那样的话得引入一个json框架,仅仅为了这么点小事,有些过了吧?顺便也记下来,看http:
//www.json.org/js.html里的描述时,有这么一句话:var myObject = eval('(' + myJSONtext
+ ')'); 这个eval什么时候加" '('
",什么时候又不用加? 以前的项目中都加的,而现在项目又不加了, 这加与不加有什么本质的区别?
..................
后来边搜边试,想用很笨的方法, 把ajax返回的字符串在eval前把里面的回车符("\r\n" 或"\n")替换成一个特殊的字符--比如说@,
再在真正赋值时再把这个替换来的@换成"\r\n"或"\n". (顺便再问下"\r\n"与"\n"有什么区别?
隐约记得"\r\n"是Unix下的换行而"\r\n"是windows下的换行,真的是这样吗?
http://javaeye-mao.iteye.com/blog/211354里有这较为详细的描述,http:
//bytes.com/topic/net/answers/613564-difference-between-carriage-return-r
-new-line-n这里边也些讨论.)
但在具体实施里又有了问题, 由于在试这种方案前想着用escape来着,
这样jsp文件里有试escape时离下的痕迹.
但违反了"谋定而行,行且坚毅"的原则,没有把escape清除掉.这样在试"替换"方案里有了干扰.再一次验证了"谋定而行,行且坚毅"的重要性.
清除escape的干扰后,在把@再次替换成回车符时有了麻烦事, 我用这样的方式: content.replace(/@/g,"\r\n"),
不行,"\r\n"在textarea里原样显示.换成"\\r\\n",还是不行,原样显示.来点狠的,再加一个"\",即"\\\r\\\n",起作
用换行了,但在textarea里显示效果是多了一个"\". 呵!! 你真狠! 用两个"\\"时不起作用,
用三个时又过了,总不能让我用2.5个"\"吧??? 这怎么办? 强忍着"疼痛",近似绝望地试了试"\\n",嘿,成了!!
姑且不管为什么, 能用了就行.
于是往配置库里checkin了刚改的jsp文件.
推荐阅读