2011-01-18 2 views
2

Я используюОтключить и включить JQuery контекстное меню

$('#test').unbind('click'); 

удалить событие щелчка на #test пункта. Как сделать элемент повторно нажатым?

На самом деле у меня есть стол. В событии клика появляется контекстное меню. Но если нет записей, меню необходимо отключить. Поэтому я использую unbind выше. Поскольку контекстное меню создается плагином, я не знаю, как сделать его повторно нажатым.

Любые идеи?

Update: это как контекстное меню устанавливается

$('#contacts tbody tr').contextMenu('myMenu1', { 
    bindings: { 
     'sms': function(t) {}, 
     'delete': function(t) {} 
    } 
}); 

Поскольку я до сих пор не знаю, как решить мою проблему, я буду описывать его немного больше. Я использую легкий context-menu plugin в jQuery для отображения контекстных меню.

#contacts tbody tr 

являются строки таблицы и myMenu1 это контекстное меню, которое появляется на т.р. щелчком мыши.

На моей странице есть стол. Каждая строка имеет свое собственное контекстное меню, но всегда то же самое, но function(t) всегда ссылается на строку с щелчком.

Ну, таблица может быть пустой, поэтому я хочу отключить контекстное меню. Я считаю, что есть способы сделать это. Один из них - отменить событие щелчка, это не работает для меня.

Надеюсь, у кого-то есть идея.

ответ

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); 
+0

Что вы имеете в виду с кешем? –

+0

@ArtWorkAD - Кэш/магазин/сохранение. вместо того, чтобы объявлять функцию анонимно встроенной, сохраните ее в переменной. Я обновил ответ, чтобы сделать его более понятным. –

+0

Я пробовал это так, но я не уверен, что это работает, я обновил свой вопрос с помощью своего кода. Я не уверен, что кэшировать ... –

1

Взгляните на этот вопрос Rebind DOM Event with jQuery

решение Иосии предпочтительнее, но если вы действительно хотите, чтобы отвязать событие щелчка полностью я верю, что вы могли бы сделать это:

var storedClick = $('#test').data('events').click[0].handler; 
$('#test').unbind('click'); 
$('#test').bind('click', storedClick); 

Помните, что данные («события»). нажмите массив, так что вы должны были бы хранить обработчик для каждого члена массива.

+0

это не работает, возможно, это факт, что обработчик кликов применяется к каждому элементу tr в таблице ... –

+0

Вы пробовали решение Josiah? – jcuenod

+0

проблема в том, что в моем приложении нет обработчика кликов, в моем приложении у меня есть только код выше, вот и все, поэтому я не знаю, как получить clickHandle, что мне нужно связать его снова –

Смежные вопросы