2012-04-03 6 views
6

Предположим, у нас есть много досов. Мы используем $('body').on('click', '.todo', do_stuff) вместо $('.todo').click(do_stuff), поэтому мы присоединим только один прослушиватель событий к DOM.Есть два равных события jQuery .on, связанных дважды?

Однако, я использую небольшой MVC. Каждый, котор нужно сделать взгляд имеет этот код $('body').on('click', '.todo', do_stuff). Так что, если у нас есть 20 до душ, значит, у этого тела есть 20 при подключенных слушателей или только один? все ли они будут стрелять?

+0

Вы можете связать несколько прослушивателей событий с одним и тем же элементом, и все они могут запускаться. – webdevbyjoss

+0

@webdevbyjoss jQuery ... –

+0

С вашего вопроса, похоже, вы пытаетесь понять, как работает конструкция $ ('ddd'). Do(). Возможно стоит прочитать здесь: http://api.jquery.com/on/ – webdevbyjoss

ответ

5

Вы должны убить предыдущий обработчик события:

<script> 
    $('body').off('click','.todo', do_stuff); 
    $('body').on('click', '.todo', do_stuff); 
</script> 

в том числе фактические функции обработчика событий в функции off(), будет удалите только этот обработчик, а не все остальные, вызванные одними и теми же элементами/событиями. Также избегайте анонимных функций при этом.

В настоящее время предлагается отказаться от unbind() и kill(). on()/off() должен соответствовать всем вашим потребностям в обработке событий, включая будущие привязки в реальном времени и отложенные результаты.

+0

Кстати, я использую namespacing для анонные функции. 'click.yepdido' – CamelCamelCamel

+0

Тогда вам хорошо идти! ;) – keystorm

+0

Вас, возможно, заинтересует '.one()', который отсоединяет себя после первого события. Несколько вложений '.one()' все равно будут приводить к нескольким вызовам обработчика, поэтому '.off()' по-прежнему необходимо. – keystorm

4

Если вы выполнили этот код двадцать раз, вы в итоге получите двадцать обработчиков событий; и да, они все будут стрелять.

+0

Это ужасно! – CamelCamelCamel

+0

это функция! use unbind(), чтобы удалить прослушиватели событий, которые вам больше не нужны – webdevbyjoss

2

Это означает, что body имеет 1 прослушиватель, который проверяет все события кликов и проверяет структуру DOM целевой цели, чтобы увидеть, содержит ли она элемент .todo.

На теле будет только 1 слушатель, независимо от количества .todo элементов, которые у вас есть.

Пример (грубый код, готовый игнорировать обработчик и т.д.):

<script> 
    $('body').on('click', '.todo', myFunc); 
    // results in 1 handler on the Body, which will be called when each .todo element is clicked 
</script> 

<body> 
    <div class="todo">Foo</div> 
    <div class="todo">Bar</div> 
    <div class="todo">Baz</div> 
</body> 
+0

um, есть противоречивый ответ, так что скрипка или источник будут хорошими – CamelCamelCamel

+0

yep http://jsfiddle.net/kSAqM/ – CamelCamelCamel