为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

奇怪的回车换行问题

2017-12-20 4页 doc 23KB 9阅读

用户头像

is_833902

暂无简介

举报
奇怪的回车换行问题奇怪的回车换行问题 奇怪的回车换行问题在类unix中,是\n (0x0A)。以为没有什么大的问题,没想到,这次开发一个小程序,却让我对这个问题大为头痛。 首先发现这个问题是这样的: 我的这个程序采用的是Extjs+php的方式,通过ajax进行通讯。其中有个页面,如图: 两个文本框,一个text,一个textarea,当textarea中含有回车换行的时候,会出现脚本错误。后面发现是因为如果服务器端返回的字符串换行了,会造成js解析出现错误,可见js在解析json数据时候的语法还是和在本地定义的字符串变量的语法一致的...
奇怪的回车换行问题
奇怪的回车换行问 奇怪的回车换行问题在类unix中,是\n (0x0A)。以为没有什么大的问题,没想到,这次开发一个小程序,却让我对这个问题大为头痛。 首先发现这个问题是这样的: 我的这个程序采用的是Extjs+php的方式,通过ajax进行通讯。其中有个页面,如图: 两个文本框,一个text,一个textarea,当textarea中含有回车换行的时候,会出现脚本错误。后面发现是因为如果服务器端返回的字符串换行了,会造成js解析出现错误,可见js在解析json数据时候的语法还是和在本地定义的字符串变量的语法一致的。一个字符串不能多行,有回车换行的时候需要转义符号:\n (\r\n)。 不过这个并不是我要说明的问题,我要说明的问题是,当我在解决这个问题的时候,抓包的时候,发现一个有趣的现象,就是发现浏览器发送到服务器对回车换行的编码不一致。 例如上图中的字符串在通过extjs中的 复制代码 代码如下: Ext.Ajax.request({ url:'CatMan.php', form:this.FORM_NAME, scope:this, callback:function(o,s,r){ var retObj=Ext.decode(r.responseText); if(retObj.success){ alert('保存成功~'); } } }); 进行保存时候,发现发送到服务器的编码是这样的: catdesc=%E6%9E%97%0A%0A%E5%B0%910A%0A%0Aa%E5%8D%8E 注意其中的红色标记的%0A,这是\n的编码。\r的编码竟然不见了。 然后我如果采用form submit直接提交,却发现编码是: %E6%9E%97%0D%0A%0D%0A%E5%B0%91%0D%0A%0D%0A%0D%0Aa%E5%8D%8E 发现\r(%0D)的编码是在的。 (以上为在IE9中测试结果。) 难道是ExtJs的问题, 如果分析Extjs的源代码,找到取form值得地方。如下: 代码如下: 复制代码 serializeForm : function(form) { debugger var fElements = form.elements || (document.forms[form] || Ext.getDom(form)).elements, hasSubmit = false, encoder = encodeURIComponent, name, data = '', type, hasValue; Ext.each(fElements, function(element){ name = element.name; type = element.type; if (!element.disabled && name) { if (/select-(one|multiple)/i.test(type)) { Ext.each(element.options, function(opt){ if (opt.selected) { hasValue = opt.hasAttribute ? opt.hasAttribute('value') : opt.getAttributeNode('value').specified; data += String.format("{0}={1}&", encoder(name), encoder(hasValue ? opt.value : opt.text)); } }); } else if (!(/file|undefined|reset|button/i.test(type))) { if (!(/radio|checkbox/i.test(type) && !element.checked) && !(type == 'submit' && hasSubmit)) { data += encoder(name) + '=' + encoder(element.value) + '&'; hasSubmit = /submit/i.test(type); } } } }); return data.substr(0, data.length - 1); }, 可以发现extjs采用的是js中的encodeURIComponent函数进行值的编码。 难道是encodeURIComponent的问题, 搜索网络,发现一篇博文中提到这个问题,见 (回车符 \r\n 在各个浏览器中无耻的表现) 于是我在ie6,ie8,ie9中分别进行了测试,发现果然存在这个问题。 总结: 这个问题虽然小,但是在某些场合却会让人和头痛,这也是搞计算机程序设计人员的悲哀,大量的不兼容,造成很多程序出现各种各样奇怪的问题。例如这个小问题可能造成一个结果,例如,我这个程序,需要在前台显示的时候保留回车换行。这种一般有两种处理,一种是采用 pre 标签,但是这个标签用起来很不方便的,尝试发现变化不太好控制。另外一种方法就是将回 br / 标记。我就是采用的这种方法,刚开始我写的正规表达式是车换行变为 /\r\n/,结果发现什么都没匹配到,后面我就改成/[\r\n]/但是这种造成的问题就是在ie6,7,8中将会多出一行来。最后为了统一处理,我改为先替换/\r\n/组合,然后再替换/\n/。问题得到解决。 ** 本人原创文章,转摘请保留本段内容,万分感谢~ ** microdreamsoft(Lin Shaohua): ** 由于本人水平有限,欢迎各位高手指正。
/
本文档为【奇怪的回车换行问题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索