jQuery:获取对click事件的引用并在以后触发它?

时间:2011-10-13 10:07:41

标签: javascript jquery

我想在一些额外的代码中包装现有的click事件。

基本上我在手风琴中有一个多部分形式,我想触发手风琴标题点击的验证。手风琴代码在别处使用,我不想改变它。

这是我尝试过的:

   //Take the click events off the accordion elements and wrap them to trigger validation
    $('.accordion h1').each(function (index, value) {
        var currentAccordion = $(value);
        //Get reference to original click
        var originalClick = currentAccordion.click;

        //unbind original click
        currentAccordion.unbind('click');

        //bind new event           
        currentAccordion.click(function () {
            //Trigger validation
            if ($('#aspnetForm').valid()) {
                current = parseInt($(this).next().find('.calculate-step').attr('data-step'));             
                //Call original click.
                originalClick();
            }
        });
    });

jQuery抛出一个错误,因为它试图在this.trigger函数中执行originalClick,我认为this不是jQuery所期望的。

编辑:更新了代码。这有效,但有点难看!

   //Take the click events off the accordion elements and wrap them to trigger validation
    $('.accordion h1').each(function (index, value) {
        var currentAccordion = $(value);
        var originalClick = currentAccordion.data("events")['click'][0].handler;
        currentAccordion.unbind('click');
        currentAccordion.click(function (e) {
            if ($('#aspnetForm').valid()) {
                current = parseInt($(this).next().find('.calculate-step').attr('data-step'));
                $.proxy(originalClick, currentAccordion)(e);
            }
        });
    });

4 个答案:

答案 0 :(得分:4)

我想这个:

var originalClick = currentAccordion.click;

实际上并没有按照你的想法进行操作 - 你正在捕获对jQuery点击功能的引用,而不是你添加的事件处理程序,所以当你调用originalClick()它相当于:$(value).click ()

答案 1 :(得分:3)

我终于想出了一些可靠的东西:

$(".remove").each(function(){
    // get all our click events and store them
    var x = $._data($(this)[0], "events");
    var y = {}
    for(i in x.click)
    {
    if(x.click[i].handler)
    {
    y[i] = x.click[i].handler;
    }
    }

    // stop our click event from running
    $(this).off("click")

    // re-add our click event with a confirmation
    $(this).click(function(){
    if(confirm("Are you sure?"))
    {
        // if they click yes, run click events!
        for(i in y)
        {
        y[i]()
        }
        return true;
    }
    // if they click cancel, return false
    return false;
    })
})

这看起来有点奇怪(为什么我们将点击事件存储在变量“y”中?)

最初我试图在x.click中运行处理程序,但是当我们调用.off(“click”)时它们似乎被破坏了。在单独的变量“y”中创建处理程序的副本。抱歉,我没有深入解释,但我相信.off(“click”)方法会从我们的文档中删除click事件以及处理程序。

http://www.frankforte.ca/blog/32/unbind-a-click-event-store-it-and-re-add-the-event-later-with-jquery/

答案 2 :(得分:1)

currentAccordion.click是一个jQuery函数,而不是实际的事件。

从蛮力方法开始,您需要做的是:

  • 保存对所有当前绑定处理程序的引用
  • 解开他们
  • 添加您自己的处理程序,并在需要时触发已保存的处理程序
  • 确保绑定绑定点击的新处理程序

这看起来像是一个事件过滤插件的工作,但我找不到。如果您的应用程序中不需要最后一点,那么它会更简单一些。

修改:经过一些研究,显示的bindIf函数here看起来就像你需要的那样(或至少给出了一个大方向)

答案 3 :(得分:1)

我不是jQuery用户,但在Javascript中,您可以设置 this 关键字的上下文。

在jQuery中,您使用$.proxy()方法执行此操作。

$.proxy(originalClick, value);
originalClick();

就个人而言,我会考虑在你的Accordion中创建回调钩子,或者利用在打开或关闭手风琴窗格时触发的现有回调(如果存在)。

希望有所帮助:)