|
好像就是专门用于撤销“由编辑工具引起的更改”而非“文本操作的更改”
见editor.js中的function discuzcode(cmd, arg)函数
else if(cmd == 'undo') {
addSnapshot(getEditorContents());
moveCursor(-1);
if((str = getSnapshot()) !== false) {
if(wysiwyg) {
editdoc.body.innerHTML = str;
} else {
editdoc.value = str;
}
}
}
else if(cmd == 'redo') {
moveCursor(1);
if((str = getSnapshot()) !== false) {
if(wysiwyg) {
editdoc.body.innerHTML = str;
} else {
editdoc.value = str;
}
}
}
有一个全局变量stack,是一个array,用来存储编辑历史.
在1656行getSnapshot的定义:
function getSnapshot() {
if(!isUndefined(stack[cursor]) && stack[cursor] != null) {
return stack[cursor];
} else {
return false;
}
}
那个cursor是当前状态在编辑历史中的序号,如果没有撤销过的话,getSnapshot会取出stack的最后一个;如果撤销过的话,getSnapshot会取出stack的当前状态的前一个编辑状态.
在1643行addSnapshot的定义:
function addSnapshot(str) {
if(stack[cursor] == str) {
return;
} else {
cursor++;
stack[cursor] = str;
if(!isUndefined(stack[cursor + 1])) {
stack[cursor + 1] = null;
}
}
}
可见addSnapshot的效果是,拿str和当前状态stack[cursor]对比如果没变,就结束(这时可以重做(redo)回去了);如果变了,就把当前状态更新,并把后面的都清空(这就无法重做(redo)回去了).
再来看function discuzcode(cmd, arg)函数的开头:
if(cmd != 'redo') {
addSnapshot(getEditorContents());
}
所以加粗,加下划线,插入链接⋯这些工具在作用之前,会先调用addSnapshot,把“工具作用之前”的状态保存到stack[cursor]
例如输入111
这时stack是空的 Array(3) [ "" ]
这时cursor是0
然后选中最后一个1,再使用下划线工具,变成11[u]1[/u]
这时stack变成 Array(3) [ "", "111", "11[u]1[/u]" ]
这时cursor是2 (当前状态是stack的第3个状态,即最后1个状态)
按下撤销(undo)工具,
这时stack不变
这时cursor是2 (当前状态是stack的第2个状态)
按下重做(redo)工具,
这时stack不变
这时cursor是3 (当前状态是stack的第3个状态)
按下撤销(undo)工具,再插入一个链接,变成11[u]1[/u][url=1]www[/url]
这时stack不变
这时cursor不变
再插入一个链接,变成11[u]1[/u][url=1]www[/url][url=1]www[/url]
这时stack变成Array(4) [ "", "111", "11[u]1[/u]", "11[u]1[/u][url=1]www[/url]" ]
这时cursor不变 |
|