我用
$('#test').unbind('click');
删除#test项目上的click事件。如何使项目再次可点击?
其实我有一张桌子。在单击事件上,将显示上下文菜单。但如果没有条目,则必须禁用菜单。所以我在上面使用unbind。由于上下文菜单是由插件生成的,我不知道如何再次点击它。
有什么想法吗?
更新:这是设置上下文菜单的方式
$('#contacts tbody tr').contextMenu('myMenu1', {
bindings: {
'sms': function(t) {},
'delete': function(t) {}
}
});
由于我仍然不确定如何解决我的问题,我将再描述一下。我在jQuery中使用轻量级context-menu plugin来显示上下文菜单。
#contacts tbody tr
是表格行,myMenu1
是tr点击时出现的上下文菜单。
在我的页面上,我有一张桌子。每行都有自己的上下文菜单,总是相同,但function(t)
始终对所单击的行进行引用。
嗯,表可能是空的,所以我想禁用上下文菜单。我相信有可能做到这一点。一种是取消绑定点击事件,这对我不起作用。
我希望有人有个主意。
答案 0 :(得分:3)
将处理程序缓存到变量。然后使用该引用绑定和解除绑定。
而不是将您的点击事件内联绑定:
$('#test').bind('click', function(){
alert('hi!');
});
将函数声明为变量:
var clickHandle = function(){
alert('hi!');
};
然后使用变量名称绑定:
$('#test').bind('click', clickHandle);
然后你可以取消绑定特定的点击处理程序:
$('#test').unbind('click', clickHandle);
然后你仍然可以重新绑定相同的功能:
$('#test').bind('click', clickHandle);
快速浏览一下来源。该事件与上下文绑定,而不是单击。
您可以通过元素的data.events属性访问该函数(类似于j3frea所说的)。请查看此fiddle example以获得完整分辨率。
基本上你可以这样做:
var cachedHandler = null;
// disable
cachedHandler = $('#demo2').data('events').contextmenu[0].handler;
$('#demo2').unbind('contextmenu', cachedHandler);
// enable
$('#demo2').bind('contextmenu', cachedHandler);
答案 1 :(得分:1)
看一下这个问题Rebind DOM Event with jQuery
Josiah的解决方案更可取但如果您真的想完全取消绑定点击事件,我相信您可以这样做:
var storedClick = $('#test').data('events').click[0].handler;
$('#test').unbind('click');
$('#test').bind('click', storedClick);
请记住数据('events')。单击是一个数组,因此您需要为数组的每个成员存储处理程序。