欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

项目小经验: eval与回车符

程序员文章站 2022-07-14 12:51:14
...

      今天遇到一个让我一开始无从下手的问题, 页面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文件.