2013-05-27 2 views
3

Я полагаю, что другие разработчики столкнулись с этим раньше. У нас есть большая база кода со многими компонентами этой модели следующие:закрытие HTML-шаблона, по большому проекту

$('#elm').on('click',function($e){ 
    $e.stopPropagation(); 
    //... do stuff (i.e. Open something); 
}); 

$('html').on('click',function($e){ 
    //... do oposite of stuff (i.e. Close something); 
} 

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

Я ищу решение, которое проще всего реализовать прямо сейчас, чтобы исправить наши ошибки и для нашей команды разработчиков Multi-разработчиков в будущем.

+0

+1 потому что это отличная идея! – pattyd

+1

Будет ли '$ e.preventDefault();' (http://api.jquery.com/event.preventDefault/) делать то, что вам нужно? –

+0

К сожалению, это останавливает действие по умолчанию, которое обычно выполняет браузер. Мне нужно обнаружить клики на элементе HTML, который не был первоначально из этого элемента. Я написал плагин: https://github.com/krismeister/jQuery.notMyEvent, но меня все еще интересует, что люди рекомендуют. – LessQuesar

ответ

1

Метод .live() обрабатывает события, как только они распространяются на верхней части документа, это не представляется возможным, чтобы остановить распространение с использованием живых событий это позволяет вам сделать хак и воспользоваться этим, потому что метод .live() связывает обработчик на $(document) и определяет, какой элемент инициировал событие вверху иерархии, используя свойство event.target.

stopPropagation останавливает распространение от пузырей вверх по иерархии DOM, но поскольку обработчик находится на уровне документа, нет верхнего места для распространения.

С другой стороны, обратите внимание, что события, обработанные .delegate(), будут пузыряться до элементов, к которым они привязаны; обработчики событий, связанные с любыми элементами под ним в дереве DOM уже будут выполнены к тому времени, когда делегированный обработчик событий будет вызван. Эти обработчики, таким образом, могут предотвратить делегированный обработчик от запуска, вызвав event.stopPropagation()

Смотрите этот пример: http://jsfiddle.net/knr3v/2/

Таким образом, вы можете использовать метод вместо щелчка, связывает live и delegate, по методе делать именно то, что вы объясняете.

+0

Вы прекрасно понимаете фазы событий в этом решении. $ .live был удален в jquery 1.9, но это отлично работает: http://jsfiddle.net/VmHpA/ Спасибо большое! – LessQuesar

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