用jQuery移动事件处理程序

时间:2010-12-01 14:44:15

标签: javascript jquery

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

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

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

也许你猜对了。它不起作用。

如何使这项工作?我在jquery 1.3.2的以下代码中收到“fn.apply is not function”消息:

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)。

3 个答案:

答案 0 :(得分:4)

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

$('#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

答案 1 :(得分:1)

我发现jQuery使用.data()将事件添加到元素中,所以你可以做这样的事情来检索事件处理程序:

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

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

答案 2 :(得分:1)

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

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

修改:鉴于您的澄清 - 您想在焦点上伪造“点击”事件...

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

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