使用jquery撤消上次执行的函数

use*_*141 3 jquery undo

是否有机会撤消最后一个被调用函数的执行.例如,我点击一个

<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)

将此页面转换为其原始状态:

  • 第一