【问题标题】:move event handler with jQuery使用 jQuery 移动事件处理程序
【发布时间】:2010-12-01 14:44:15
【问题描述】:

我有一个让我发疯的问题,作为最后的手段,我在这里提出一个问题。

我想将 onclick 事件从一个元素移动到同一元素的 onfocus 事件,我正在使用以下代码:

$("#theElement").bind("focus", {}, $("#theElement").data("events").click);
$("#theElement").unbind("click");

也许你已经猜到了。它不起作用。

我该如何进行这项工作?我在 jquery 1.3.2 的以下代码中收到“fn.apply 不是函数”消息:

proxy: function( fn, proxy ){
        proxy = proxy || function(){ return fn.apply(this, arguments); };
        // Set the guid of unique handler to the same of original handler, so it can be removed
        proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
        // So proxy can be declared as an argument
        return proxy;
    }

编辑:对不起,我应该提到的。这来自一个插件,它在单击元素时会做一些事情。我想在元素获得焦点而不是被点击时做同样的事情,所以我想到的最简单的解决方案是这样,因为我无法修改插件的代码。

编辑:发现问题。这类似于@sje397 在他的回答中发布的内容,而不是

$('#theElement').data('events').click[0]

但是

$('#theElement').data('events').click[3]

出于某种原因,即使只注册了一个事件,最终的结果也是 3(来自 jquery 的那段代码中的 guid)。

【问题讨论】:

标签: javascript jquery


【解决方案1】:

我建议首先命名事件处理程序,例如

$('#theElement').click(function myHandler() {
  //...
});

那么,你就可以了

$("#theElement").bind("focus", {}, myHandler);
$("#theElement").unbind("click");

这应该使它更具可读性,并修复错误。

如果你不能,那么你可以这样做:

// assuming yours is the first handler
var myHandler = $('#theElement').data('events').click[0]; 

$("#theElement").bind("focus", {}, myHandler);
$("#theElement").unbind("click");

在 jQuery 1.4.3+ 中也不是这样,密钥已更改为 __events__。见this answer

【讨论】:

  • 我做不到。这来自一个插件,它在单击元素时会做一些事情。我想在元素获得焦点而不是当它被点击时做同样的事情,所以我想到的最简单的解决方案就是这个。我愿意接受任何其他方式。谢谢你的回答。
  • @user9238833:我发现了一个重复的问题。请参阅 cmets 中的链接。
  • 如果有多个处理程序,是否可以取消绑定()特定处理程序?
  • 是的,命名空间。绑定时使用 event.yournamespacename 作为事件。 $('#element').bind('focus.namespacename',function(){ //dostuff })
【解决方案2】:

我发现 jQuery 使用 .data() 将事件添加到元素中,因此您可以执行以下操作来检索事件处理程序:

$(el).data().events.click[0].handler

这不是一个优雅的解决方案,但如果您无法对点击处理程序本身进行任何更改,这将是唯一的解决方案。

【讨论】:

    【解决方案3】:

    我不是 100% 清楚你到底想要做什么。是否要将焦点和点击事件绑定到同一个元素?

    $("#theElement").bind("focus click", function(){
        //do stuff
        $(this).unbind('focus click');
    });
    

    编辑:根据您的说明 - 您想伪造焦点上的“点击”事件...

    $("#theElement").bind("focus", function(){
        $(this).trigger('click');
    });
    

    http://api.jquery.com/trigger/

    【讨论】:

    • 这不是他想要的。 OP 想用焦点事件替换点击事件。顺便说一句,您不需要逗号来分隔事件
    • 这并没有用焦点代替点击事件,但值得一试
    • 是的,您需要在上面解除点击处理程序的绑定,否则您可能最终会触发您的函数两次...
    • @calumbrodie:后续关注点如何?如果我在onfocus触发的时候调用onclick,解除绑定onclick,那么后续的focus怎么调用?
    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    相关资源
    最近更新 更多