禁用并启用jQuery上下文菜单

时间:2011-01-18 21:00:56

标签: javascript contextmenu jquery

我用

$('#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)始终对所单击的行进行引用。

嗯,表可能是空的,所以我想禁用上下文菜单。我相信有可能做到这一点。一种是取消绑定点击事件,这对我不起作用。

我希望有人有个主意。

2 个答案:

答案 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')。单击是一个数组,因此您需要为数组的每个成员存储处理程序。