Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用UndoManager确定文档是否有未保存的更改_Javascript_Ace Editor - Fatal编程技术网

Javascript 如何使用UndoManager确定文档是否有未保存的更改

Javascript 如何使用UndoManager确定文档是否有未保存的更改,javascript,ace-editor,Javascript,Ace Editor,一般来说,我对编辑器和javascript都很陌生,但除了以下几点之外,我已经实现了我的大部分目标: 我想根据文档是否有未完成的修改来启用或禁用“保存”按钮,我已尝试使用“更改”事件来执行此操作: UndoManager.reset(); $('#save').addClass("disabled"); editor.on('change', function() { if (UndoManager.hasUndo()) { $('#save').r

一般来说,我对编辑器和javascript都很陌生,但除了以下几点之外,我已经实现了我的大部分目标:

我想根据文档是否有未完成的修改来启用或禁用“保存”按钮,我已尝试使用“更改”事件来执行此操作:

UndoManager.reset();

$('#save').addClass("disabled");

editor.on('change', function() {

        if (UndoManager.hasUndo()) {
            $('#save').removeClass("disabled");
        }
        else {
            $('#save').addClass("disabled");
        }

    });
加载文档时,“禁用”类将立即删除


如果有人能告诉我应该怎么做,我将提前表示感谢。

加载文档后,请调用
编辑器.session.getUndoManager().reset()
并在
undoManager
上使用
isClean
markClean
方法

var saveButton=document.getElementById(“保存”)
var editor=ace.edit(“编辑器”)
//使用输入事件而不是更改,因为它是在超时情况下调用的
on(“输入”,函数(){
saveButton.disabled=editor.session.getUndoManager().isClean()
});
saveButton.addEventListener(“单击”,函数(){
editor.session.getUndoManager().markClean()
saveButton.disabled=editor.session.getUndoManager().isClean()
})

拯救

您的解决方案有一个缺点:保存后,无法撤消。大多数现代编辑器允许保存后撤消


我建议你把原文记录下来,并在文本发生变化时进行比较。如果文本等于原点,请禁用“保存”按钮。

谢谢,效果很好(尽管我必须切换“添加”和“删除类”语句,这是我的错)。是否可以捕获用户何时返回到撤消缓冲区的开头,然后再次添加禁用的类?无论哪种方式,我都非常感谢您的帮助。我将.isClean()更改为.hasUndo()(并反转了add/remove语句),现在当用户返回到undo缓冲区的开头时,“save”按钮将禁用。它还支持重做。非常酷。@Wasim确保您正在使用最新版本的aceI,并在某些事件中将新数据加载到编辑器中。撤销管理器在延迟后运行,因此我需要将我的markClean()函数调用放入延迟内,如下所示:
setTimeout(function(){editor.getSession().getUndoManager().reset();},700)(reset()或markClean()在我的情况下都适用于我)简单高效!