2009-08-06 19 views
8

我想在jQuery脚本中延迟默认事件或事件。上下文是我想在用户执行某些操作(主要点击)几秒钟之前向用户显示一条消息,然后触发默认操作。在jQuery中挂起默认事件

伪代码: - 用户点击链接/按钮/元素 - 用户得到一个弹出信息,提示“您正在离开现场” - 消息仍然在屏幕上X毫秒 - 默认动作(可以比HREF其他链接太)触发

到目前为止,我的尝试是这样的:

$(document).ready(function() { 
    var orgE = $("a").click(); 
    $("a").click(function(event) { 
     var orgEvent = event; 
     event.preventDefault(); 
     // Do stuff 
     doStuff(this); 

     setTimeout(function() { 
      // Hide message 
      hideMessage(); 
      $(this).trigger(orgEvent); 
     }, 1000); 
    }); 
}); 

当然,正如所料,这并不工作,但可能会出现什么,我试图做的。

我无法使用插件,因为这是一个没有在线访问的托管环境。

有什么建议吗?

回答

-2

这可能会实现:

$(document).ready(function() { 
    $("a").click(function(event) { 
    event.preventDefault(); 
    doStuff(this); 

    setTimeout(function() { 
     hideMessage(); 
     $(this).click(); 
    }, 1000); 
    }); 
}); 

注:没有经过测试的

+1

这不会再次触发相同的点击处理程序,包括'event.preventDefault'吗? – DLH 2009-08-06 12:25:47

+0

它不会工作,因为这个上下文将是窗口,而不是锚点 – redsquare 2009-08-06 12:27:18

+0

需要参考锚点并在setTimeout中使用它。但是,它会导致无限循环。您需要解除该点击事件才能运行。 – redsquare 2009-08-06 12:28:13

5

我可能会做这样的事情。

$("a").click(function(event) { 
    event.preventDefault(); 
    doStuff(this); 
    var url = $(this).attr("href"); 

    setTimeout(function() { 
     hideMessage(); 
     window.location = url; 
    }, 1000); 
}); 

我不知道如果url可以从定时功能里面看到。如果没有,您可能需要在点击处理程序之外声明它。

编辑:如果您需要从定时功能触发事件,可以使用类似karim79建议的东西,虽然我会做一些更改。

$(document).ready(function() { 
    var slept = false; 
    $("a").click(function(event) { 
    if(!slept) { 
     event.preventDefault(); 
     doStuff(this); 

     var $element = $(this); 
     // allows us to access this object from inside the function 

     setTimeout(function() { 
      hideMessage(); 
      slept = true; 
      $element.click(); //triggers the click event with slept = true 
     }, 1000); 
     // if we triggered the click event here, it would loop through 
     // this function recursively until slept was false. we don't want that. 
    } else { 
     slept = false; //re-initialize 
    } 
    }); 
}); 

编辑:一些测试和研究之后,我不知道它实际上可能触发<a>元素的原始单击事件。除了<a>之外的任何元素似乎都是可能的。

+0

它可以读取var url – redsquare 2009-08-06 12:48:11

+0

这种方法的问题是,我不知道原始操作是否要转到URL。它可能只是另一个与导航毫无关系的JavaScript函数。 – 2009-08-06 15:59:37

2

类似这样的事情应该可以做到。添加一个新类(可能比我选择的名称更明智),将其添加到您想要受影响的所有链接中。当您显示弹出窗口时移除该类,因此当您再次调用.click()时,您的代码将不再运行,并且会发生默认行为。

$("a").addClass("fancy-schmancy-popup-thing-not-yet-shown").click(function() { 
    if ($(this).hasClass("fancy-schmancy-popup-thing-not-yet-shown")) 
     return true; 

    doStuff(); 
    $(this).removeClass("fancy-schmancy-popup-thing-not-yet-shown"); 

    var link = this; 
    setTimeout(function() { 
     hideMessage(); 
     $(link).click().addClass("fancy-schmancy-popup-thing-not-yet-shown"; 
    }, 1000); 

    return false; 
}); 
+0

我还没有看到这将如何保存原始事件。我的任务是? – 2009-08-10 22:22:46

+0

稍后调用'$(link).click()'将表现得好像用户只是点击了有问题的链接。你点击事件的事件处理程序当然会再次运行,但是这次链接将不再携带该类,所以你的事件处理程序将返回true。 只要事件处理程序返回true,浏览器就会继续执行与事件相关的其他操作,包括原始(默认)行为(例如,转到新页面)。 – VoteyDisciple 2009-08-11 11:20:20

2

可能最好的办法是使用解除绑定。例如:

$(document).ready(function() { 
    $("a").click(function(event) { 
     event.preventDefault(); 
     // Do stuff 
     this.unbind(event).click(); 
    }); 
}) 
+0

这似乎工作。太简单!谢谢! – 2014-11-06 04:39:29

+1

您正在使用DOM“this”取消绑定,该代码应该是: if(typeof event =='undefined') { return true; } $(this).unbind(event); this.click() – 2015-10-02 18:56:48