我已经用FCKEditor编辑器代替原始的UBB编辑器很久了,也相应地对FCKEditor作了很多个性化的修改,使之在Bo-blog的后台发挥更大的作用,也使大家的日志写作更为方便!
今天我在Bo-blog的BBS上看到有人提出一个日志保存时自动复制到剪贴板的要求。按我的理解,该用户需要一个自动保存,自动备份的功能即可。因为其实我也会碰到此类问题:写着写着,一不小心,碰到了<-键(我是IBM T43,相当于Alt + <-组合键),返回到了前一页。当我按->键返回到后台撰写页时,我kao,啥也没有了。按理说Firefox相比IE,是有自动记忆表单功能的(尤其是textarea区域),这一点你可以试试。但由于FCKEditor编辑器的缘故,这个基本功能没有正常地发挥作用,很是头痛。
其实我的FCKEditor编辑器里已经带有了UBB的自动保存功能,但我经过试验了好几次,发现它只记录第一次的内容:即进入编辑状态时的第一次的内容。中间修改的状态它不保存,那这个有什么用啊?根本没用。
但我发现点击“保存自动存档”时,Firefox并不报错。什么原因?很有可能是保存的内容存在,但并不是我们编辑的内容。经过我分析这个从UBB编辑器移植来的autosaver.js文件关于savedraft()的函数代码,发现有一行:
var content = blogencode(document.getElementById('content').value);
对比HTML源代码,确实有一个id=content的textarea段,这个对的啊,有什么错呢?但我发现这个textarea是被设置为display:none的。即我们看不到这个textarea,那我们肯定没有编辑这个textarea。所以它的内容一直没有变,然后自动保存功能激发的savedraft()函数始终保存的是这个textarea段的内容,即第一次显示时的初始内容。
知道了原因,如何解决也好办多了。解决办法是将FCKEditor编辑器中的内容用savedraft()函数通过ajax功能后台向服务器保存。
如何获取FCKEditor编辑器的实时内容呢?Google一下,方法就来了:
var content = blogencode(FCKeditorAPI.GetInstance('content').EditorDocument.body.innerHTML);
综上,最兼容的写法是,如果发现有FCKEditor编辑器的内容,就取FCKEditor编辑器的内容,否则就取普通的id为content的textarea的内容。
//modified by admin of spyrise.org to meet FCKEditor on July 6th, 2009.
if(FCKeditorAPI.GetInstance('content'))
var content = blogencode(FCKeditorAPI.GetInstance('content').EditorDocument.body.innerHTML);
else
var content = blogencode(document.getElementById('content').value);
上面就是如何解决FCKEditor编辑器自动保存功能不正常的解决思路及方法。原谅我上面p话一大堆,我只是想向大家介绍碰到问题如何解决的思路。
最后,对于懒人,请到这里下载我的FCKEditor编辑器版本。我已经将更新版的autosaver.js打包更新进去了。如果你愿意,也可以手工修改一下自己的autosaver.js,代码如何写上面已经注明了。

佩服哇
刚在坛子里还看到有人要找HTML编辑器