主题: 重大bug——webkit浏览器下,编辑器内复制粘贴错误 |
作者: humanx, 发布日期: 2011-08-24 16:24:32, 浏览数: 3895 |
浏览器: webkit
重现步骤: 1.编辑器输入内容,包含多个段落 2.在编辑器内选中一部分内容,包含多个段落,进行复制 3.在编辑器内进行粘贴 4.粘贴得到的结果和原来所复制的内容段落顺序相反,如果复制的内容是一段格式相同文字中间的那一部分则格式丢失 期望结果: 在编辑器之间复制粘贴时能够保持原有内容不变 |
作者: gzooler, 发布日期: 2011-09-08 15:51:58 |
这个Bug确实非常严重啊,在基于webkit的浏览器下面拷贝有结点的html代码必然会有问题,查了下代码,发现问题在remove这个方法上面。
源代码第1469行:
_unbind(node); if (keepChilds) { new KNode(node.childNodes).each(function() { new KNode([node]).after(this); }); }
new KNode([node]).after(this); 这句是不对的,看了下after的实现,这种情况下面结点会倒序排。正确的应该是用before而不是after:new KNode([node]).before(this);
还请作者确认一下这么改会不会有别的问题产生。
|
回复 |
作者: Roddy, 发布日期: 2011-09-08 17:01:04 |
回复gzooler:SVN里的代码已经修复了这个问题,问题原因是childNodes这个不一定是按顺序排序好的。
|
回复 |
作者: gzooler, 发布日期: 2011-09-08 17:52:08 |
你确定吗?我刚才试了一下,childNodes 是按照顺序获得的。原先那个after用得的确是有问题。
在粘贴的时候,要把结点remove掉,但要保留它的孩子结点。把它的每个孩子结点挨个取出来,始终插入在这个结点之前,最终的顺序不会变,所以用before是没问题的吧。
而原先的after方法, after : function(expr) { this.each(function() { if (this.nextSibling) { this.parentNode.insertBefore(_get(expr), this.nextSibling); } else { this.parentNode.appendChild(_get(expr)); } }); return this; },按照这个逻辑,刚好是倒序。 |
回复 |
作者: gzooler, 发布日期: 2011-09-08 17:57:33 |
回复Roddy:还有,svn下载里面的changelog.txt,最好加上时间,并且最新的 bug fix放在最上面。因为编辑器要整合到项目产品中,不可避免地会修改一些不符合需求的地方。不可能每次都下载最新的覆盖即可。要看bug的严重程度判断是否要升级,你要知道,升级有时相当麻烦。谢谢理解。
|
回复 |
作者: Roddy, 发布日期: 2011-09-08 20:31:37 |
回复gzooler:你说的对,childNodes顺序没问题,我看到childNodes直接改成firstChild遍历方式,没有仔细查找问题原因。
|
回复 |