主题: 重大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遍历方式,没有仔细查找问题原因。
回复
发表新帖 发表回复