今天遇到个问题,我的MocolaEditor之前有效的 Undo / Redo 功能突然失效了,这应该是编写HTML在线编辑器的PG都会遇到的一个问题。
先看看这个问题是什么:
<script>
function onchange(){
info.innerText=editor.innerText;
}
</script>
</HEAD>
<BODY>
<div style="width:500px;height:500px;border:1px solid #cccccc" contenteditable="true" ></div>
<div style="width:500px;height:50px;padding:4px;background-color:#F0f0f0"></div>
</BODY>
运行上面这段代码,你会发现,你的编辑器 将无法 Undo和Redo。
为什么会这样?
原因在于 info.innerText=editor.innerText; 这一脚本,改变了当前HTML渲染。起初我以为编辑器放在IFrame里就没事了,结果发现,放哪里都一样。
<script>
function onchange(){
info.innerText=Editor.document.body.innerText;
}
window.onload=function(){
Editor.document.designMode="ON";
Editor.document.onkeyup=onchange;
}
</script>
</HEAD>
<BODY>
<iframe style="width:500px;height:500px;border:1px solid #cccccc"></iframe>
<div style="width:500px;height:50px;padding:4px;background-color:#F0f0f0"></div>
</BODY>
Google的Writly (http://docs.google.com),有相同的问题。他的操作界面的弹出窗口都是用 div 来实现的。这样在显示和关闭的时候 必然会做一些Dom的操作,结果是只要弹出过窗口,Undo/Redo就失效了。
问题到此,应该很清楚了。那么如何解决呢?
既然浏览器的Undo/Redo不行了,那我就自己来写一个Undo/Redo方法。
每次文档发生改变的时候,我们可以把其HTMLCode 和 Selection 选区一起保存。存入一个数组里,只要数据都存好了,想undo/redo都是很轻松的事情了。
小Tips: 可以通过 document.selection.createRange().getBookmark()方来 来保存选区状态。
Undo的时候用 document.selection.createRange().moveToBookmark()方法来恢复选区。
以下是网上找的一段Undo/Redo 类。Typeing是为了对打字进行一些特殊处理,因为没有必要每输入一个字就增加一个UndoStep,这样太浪费内存空间了。 这里还需要对document.onkeydown函数做一些配合处理。
var CMSUndo=new Object();
CMSUndo.UndoLevels=new Array();
CMSUndo.CurrentStep=0;
CMSUndo.MaxLevel=20;
CMSUndo.Typing=false;
CMSUndo.TypingCount=CMSUndo.TypingMaxCount=25;
CMSUndo.SaveUndoStep=function(){
if(EMode == "Code") return;
this.UndoLevels[this.CurrentStep]=this.GetSaveData();
this.CurrentStep++;
this.UndoLevels=this.UndoLevels.slice(0,this.CurrentStep);
if(this.UndoLevels>this.MaxLevel) this.UndoLevels.shift();
this.CurrentStep=this.UndoLevels.length;
}
CMSUndo.Redo=function(){
if(this.CurrentStep<this.UndoLevels.length-1) this.ApplyUndoLevel(this.UndoLevels[++this.CurrentStep]);
}
CMSUndo.Undo=function(){
if(this.UndoLevels.length<1) return;
if(this.CurrentStep==this.UndoLevels.length) this.SaveUndoStep();
if(this.CurrentStep>0) this.ApplyUndoLevel(this.UndoLevels[--this.CurrentStep]);
}
CMSUndo.ApplyUndoLevel=function(cStep){
EditorDesignContent.body.innerHTML=cStep.htmlcode;
if(cStep.selrange) {
var range=EditorDesignContent.selection.createRange()
range.moveToBookmark(cStep.selrange)
range.select();
onEditContentSelChange();
}
this.TypesCount=0;
this.Typing=false;
}
CMSUndo.GetSaveData=function(){
var cStep=new Object();
cStep.htmlcode=EditorDesignContent.body.innerHTML;
if (EditorDesignContent.selection.type=='Text') cStep.selrange=EditorDesignContent.selection.createRange().getBookmark();
return cStep;
}
原文:
http://www.mockte.com/rewrite.php/read-30.html
分享到:
相关推荐
撤销/恢复(Undo/Redo)功能是许多用户交互密集型应用的重要特性,它使用户可以撤消最近的操作,并在需要时恢复这些操作。在`DataGridView`中实现撤销/恢复功能对于提供良好的用户体验至关重要。 撤销/恢复功能通常...
针对一个window窗体实现了undo/redo功能,包括textBox,checkBox, listBox, comboBox, radioButton以及按钮焦点变化的实现。可能有些小bug思路仅供参考。完整的工程文件,VS打开即可运行,欢迎评论~ 详细说明参见...
在现代软件开发中,尤其是图形编辑或文档编辑应用程序中,Undo/Redo功能是用户体验的重要组成部分。它不仅提高了用户的工作效率,还能增强软件的易用性。在本篇文章中,我们将深入探讨如何在MFC(Microsoft ...
本工程用vs2008打开,但需要qt库的支持,需要先安装qt-in-vs2008,才可通过编译。或者直接将里面的代码拷贝出来,然后在自己的环境中编译也行。代码中应用了QUndoCommand来实现撤销与反撤销操作。
在.NET框架和C#编程中,撤销/重做(Undo/Redo)功能是一个常见的需求,特别是在那些允许用户进行多步操作的应用程序中,如文本编辑器、绘图软件或数据库管理系统。一个“Simple Undo/redo library for C#/.NET”就是...
NULL 博文链接:https://saga-java.iteye.com/blog/1549583
在软件开发中,尤其是涉及到用户交互的图形界面应用,撤销/重做(Undo/Redo)功能是一项重要的设计。它允许用户撤销上一步操作,甚至多次撤销,以及在需要时恢复之前的状态。在C++环境下,Microsoft Foundation ...
在软件开发中,多级撤销/重做(Multiple Level Undo/Redo)是用户体验中的一个关键特性,尤其在文本编辑器、图像处理软件或者任何允许用户进行一系列可逆操作的应用中。这一功能允许用户在执行一系列操作后,通过...
### 监控绘图软件中Undo/Redo的设计与实现 #### 1. 引言 随着信息技术的发展,监控系统已成为工业自动化领域的关键技术之一。SCADA(Supervisory Control And Data Acquisition,即数据采集与监视控制系统)作为一...
这一功能常见于各种应用程序,如文本编辑器、图像处理软件、数据库管理系统等。在这些应用中,用户可能会频繁进行各种操作,而撤销/重做功能则提供了对这些操作的后悔药,增强了交互的灵活性和可靠性。 实现撤销/...
用Unity实现简单的撤销/重做(undo/redo)功能
在Delphi编程环境中,撤销/重做(Undo/Redo)功能是许多应用程序的重要组成部分,尤其是在文本编辑器、绘图工具或数据库应用等允许用户进行可逆操作的场景下。这个功能允许用户撤销最近的操作,如果需要的话,还可以...
Undo_Redo机制在CAD中的应用, 摘要:为了增强CAD系统的灵活...持无限Undo/Redo和批量化操作的CAD图形绘制系统,文章介绍了各模块的实现原理及核心算法。 关键词:无限撤消/重做设计模式对象持久化批量化操作绘图CAD
在编程领域,撤销/重做(Undo/Redo)功能是许多应用程序不可或缺的一部分,它允许用户取消最近的操作并恢复之前的状态。在Delphi这个强大的Windows应用程序开发环境中,实现撤销/重做功能对于提升用户体验至关重要。...
在C#编程中,撤销/重做(Undo/Redo)功能是许多应用程序的重要组成部分,尤其是在文本编辑器、绘图工具或任何允许用户进行可逆操作的软件中。撤销/重做机制允许用户取消最近的操作,并在需要时恢复它们,提高了用户...
GIS软件中的Undo与Redo功能是编辑操作的重要组成部分,它们允许用户撤销和恢复之前的编辑行为。本文深入分析了GIS软件中Undo与Redo操作的设计与实现,其主要内容包括Undo与Redo操作的原理、机制、流程以及实现方法。...
- 无限 UNDO/REDO 需要大量的内存来存储历史记录,因此需要利用虚拟内存或其他持久化存储解决方案。 - **解决方案**:可以设计一种策略,比如将最近的记录保留在内存中,而将较旧的记录保存到磁盘上。 2. **性能...
在编程领域,撤销/重做(Undo/Redo)功能是许多应用程序不可或缺的一部分,它允许用户取消或恢复之前的操作。在Qt框架中,Qt提供了一种高效且灵活的方式来实现这一功能,那就是通过QUndoCommand类。QUndoCommand是Qt...
内容索引:VC/C++源码,系统相关,撤销 VC++实现多步Undo/Redo(撤销/恢复)功能源代码,这个应该不需要多解释了吧?就是实现按下键盘CTRL+Z实现的连续撤销及恢复功能,很多软件中都有这两组快捷键。
这个功能在各种应用程序中广泛存在,如文本编辑器、图像处理软件、绘图工具等。在给定的“multiundoredo”压缩包文件中,很可能包含了一个实现多步撤销/重做的示例代码或教程。 撤销/重做功能的实现通常基于一种...