我有一个让我疯狂的问题,作为最后的手段,我在这里提出一个问题。
我想将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)。
答案 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');
});