2017-01-06 11 views
0

Я использую JQuery 1.12. По какой-то причине обработчик щелчка становится установлен в два раза, несмотря на то, что я отменяя щелчок перед установкой его снова ...Как предотвратить двойной настройку обработчика кликов?

$styledSelect.unbind('click') 
    console.log("setting click") 
    $styledSelect.click(function(e) { 
    console.log("opened"); 
    e.stopPropagation(); 
    $('div.select-styled.active').each(function() { 
     $(this).removeClass('active').next('ul.select-options').hide(); 
    }); 
    $(this).toggleClass('active').next('ul.select-options').toggle(); 
    }); 

, но все же, когда я нажимаю мое меню, чтобы открыть его, вы видите «открыт» заявление напечатано дважды. Смотрите мою скрипку - http://jsfiddle.net/6fjnnu55/1/. Кто-нибудь знает, как я могу правильно настроить мой обработчик кликов, чтобы не устанавливать его дважды?

+1

HOw это дубликат? Этот ответ рекомендует добавить «this.unbind (« click »)», который уже является первой строкой в ​​фрагменте кода, который я опубликовал. – Dave

+0

Нет, это не дубликат. @Dave: добавьте 'console.log (e)' в ваш обработчик кликов и посмотрите, что он фактически обрабатывает разные события. Последний является «естественным» (пользовательским), все остальные генерируются самим скриптом. – raina77ow

+0

Да, это не обман, но основанный * исключительно * на этом вопросе и не используемый внешний jsFiddle, который содержит страницы и страницы кода, которые никто не должен ожидать читать, это выглядит так. Вам нужно научиться делать [mcve]. – DavidG

ответ

2

Проблема, кажется, на линиях 35-36:

}).focus(function() { 
    $(this).find('.select-styled').click() 

кажется «в центре внимания» вы щелкаете выберите виджет ... Я предполагаю, что вы либо не хотите нажимать на фокус все время или, возможно, даже не на всех ...

UPDATE

так, глядя на события, как было предложено, я думаю, не будет реально помочь, потому что нужно различать случаи, когда у НУ есть одно событие из тех, где оба уволены ... Я хотел бы использовать переменную флаг для этого, увидеть мою обновленную скрипку, в частности, линии 30, 39 и 75

http://jsfiddle.net/6fjnnu55/3/

Надежда это помогает!

+0

Точно. Причина в том, что собственное событие «click» запускается после 'focus' one - если элемент уже не находится в фокусе. – raina77ow

+0

Привет @MacPrawn, спасибо, что отождествляли это. Действительно, мне нужна только функция «щелчка», вызываемая при вызове функции фокуса, потому что кто-то нажал клавишу «Tab», чтобы добраться до элемента (в отличие от щелчка по нему с домом). Как я могу отличить эти два? – Dave

+0

Вы можете либо задержать это, либо просто проверить само событие внутри обработчика. Существует несколько отличий для инициируемых событий (флаг isTriggered установлен среди самых известных)). – raina77ow