4

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

<nav><a href="foo">...</a></nav>

它有一个 onclick-listener,类似这样:

$(function() {
    $('nav a').on('click', function() {
        $('nav a').removeClass('active');
        $(this).addClass('active');
        $($(this).attr('href')).addClass('active');
        return false;
    });
});

我正在寻找可以撤消最后一个函数的执行的东西。有什么建议吗?谢谢!!!:)

4

5 回答 5

13

使用命令模式,即

命令对象对于实现多级撤消很有用——如果程序中的所有用户操作都实现为命令对象,则程序可以保留最近执行的命令的堆栈。当用户想要撤消命令时,程序只需弹出最近的命令对象并执行其 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();    
  };  
}

要对此进行测试,请构建简单的 DOM:

<ul>
    <li>first</li>
</ul>

并定义一个您想要使用的命令对象。这样的对象应该包含其执行逻辑以及用于重建 DOM 先前状态的其他行为(至少在我们的示例中):

var appendcommand = new command({
  execute: function(){
    $('ul').append('<li>new</li>');
  },
  undo: function(){
      $('ul li:last').remove();
  }
});

执行后:

appendcommand.execute();

您的页面将从

  • 第一的

  • 第一的
  • 新的

同时执行:

appendcommand.undo();

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

  • 第一的
于 2012-11-09T13:27:42.773 回答
0
$('nav a').unbind()

http://api.jquery.com/unbind/

- 或者 -

$('nav a').off()

http://api.jquery.com/off/

于 2014-01-31T20:28:38.260 回答
0

JavaScript 引擎不会为您保存任何以前的状态,您必须自己完成。这意味着您必须跟踪要操作的对象的先前和当前状态。

在您的情况下,您可以拥有一个“先前活动”对象的列表,然后您的“撤消”将根据该列表激活前一个元素。

我没有尝试过代码,但你应该从中得到想法。此外,如果您遇到数组问题,请查看http://www.w3schools.com/jsref/jsref_obj_array.asp 。

var undoList = new Array();

function manipulate(elem) {
    $('nav a').removeClass('active');
    $(elem).addClass('active');
    //...
}

function undo() {
    if(undoList.length > 0) {
        var elemToManipulate = undoList.pop();
        manipulate(elemToManipulate);
    }        
}

function manipulateWithUndo(elem) {
    undoList.push(elem);
    manipulate(elem);
}
于 2012-11-09T10:28:48.217 回答
0

尝试这个:

var active=0;

    if(active==0)
    {
    //write here your code
    active=1;
    }else
    {
    //write here your "undo" code
    //example: Write your code but in reverse order: addclass().removeclass().removeclass()
    active=0;
    }
于 2012-11-09T10:34:54.907 回答
0
    var clk=1; 
$(document).ready(function(){
    $("button").on('click',function(){
        if(clk%2==1){
           $('#sidebar').addClass('active');
             $(".main").css("display", "flex");
         }else{

             $('#sidebar').removeClass('active');
             $(".main").css("display", "");
        }

        clk++;
    });
});
于 2018-03-01T16:47:18.940 回答