是否有机会撤消最后一个被调用函数的执行.例如,我点击一个
<nav><a href="foo">...</a></nav>
Run Code Online (Sandbox Code Playgroud)
它有一个onclick-listener,类似的东西:
$(function() {
$('nav a').on('click', function() {
$('nav a').removeClass('active');
$(this).addClass('active');
$($(this).attr('href')).addClass('active');
return false;
});
});
Run Code Online (Sandbox Code Playgroud)
我正在寻找能够撤消最后一个函数执行的东西.有什么建议吗?谢谢!!!:)
jwa*_*zko 12
使用命令模式,即
命令对象对于实现多级撤消非常有用 - 如果程序中的所有用户操作都实现为命令对象,则程序可以保留最近执行的命令的堆栈.当用户想要撤消命令时,程序只会弹出最新的命令对象并执行其undo()方法.
基本的JavaScript实现可能如下所示:
function command(instance) {
this.command = instance;
this.done = [];
this.execute = function execute() {
this.command.execute();
this.done.push(this.command);
};
this.undo = function undo() {
var command = this.done.pop();
command.undo();
};
}
Run Code Online (Sandbox Code Playgroud)
要测试它,构建简单的DOM:
<ul>
<li>first</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
并定义一个您想要使用的命令对象.这样的对象应该包含其执行逻辑以及用于重构DOM的先前状态的其他行为(至少在我的示例中):
var appendcommand = new command({
execute: function(){
$('ul').append('<li>new</li>');
},
undo: function(){
$('ul li:last').remove();
}
});
Run Code Online (Sandbox Code Playgroud)
执行后:
appendcommand.execute();
Run Code Online (Sandbox Code Playgroud)
您的页面将更改
至
执行时:
appendcommand.undo();
Run Code Online (Sandbox Code Playgroud)
将此页面转换为其原始状态: