有没有办法撤消目标上的功能?

时间:2012-07-12 16:56:45

标签: javascript jquery

我正在尝试对页面上的所有链接执行一项功能,然后在满足条件时撤消该功能。

$('a').click(function(){
    //some function
  if ( /*some condition*/ ) {
    $(this).//undo above function
  }
});

注意:我没有尝试使用unbind(),我试图让函数自行撤消。如果有点不清楚,我会事先道歉 - 请问我一些你不确定的事情。感谢。

3 个答案:

答案 0 :(得分:0)

你试过了吗?

$('a').click(function(){
    //some function
  if ( /*some condition*/ ) {
    $(this).click(function() { return false; });
  }
});

编辑:还有另一种相当普遍的方法,起初并没有真正发生过。由于您对所有<a>代码执行此操作,因此您可以使用delegateundelegate函数注册该事件。在更现代的jquery版本中,这是使用.on.off方法完成的:

$("body").on("click", "a", function() {
    //some function
    if ( /*some condition*/ ) {
        $(this).off("click");
    }
});

http://api.jquery.com/delegate/
http://api.jquery.com/undelegate/
http://api.jquery.com/on/
http://api.jquery.com/off/

答案 1 :(得分:0)

是的,有办法。然而,它并不像调用魔法undo函数那样简单,它会扭转你刚刚做的事情。您需要自己编写代码,并执行与刚刚执行的步骤相反的操作。

所以,如果代替// some function,你实际上有:

$(this).addClass('blue'); // add the class 'blue' to the link

然后为了撤消你必须打电话

$(this).removeClass('blue');

将类blue添加到链接。

显然,你对元素做的事情越复杂,它们就越难以undo。例如,如果您将元素移动到新位置,那么在执行此操作之前,您需要存储其当前位置,这样您就知道在需要时将其移回到哪里。

在某些情况下,如果您只是在元素本身上操作类,属性,事件处理程序等,则在进行任何更改之前克隆元素可能更容易。这样,“撤消”该功能就像用更改前的克隆替换当前元素一样简单。

答案 2 :(得分:0)

对于像“addClass”这样的简单案例,您可以轻松找到相反的功能。对于更复杂的交互,建议编写do-function和undo-function。要管理这一切,您可以使用撤消控制器。看看我的撤消管理器,它可能会给你一个如何处理这个问题的方向。或者你可以将它插入你的代码中。

https://github.com/ArthurClemens/Javascript-Undo-Manager