Итак, давайте говорить прямо сейчас у вас есть список, и ваш веб-страница выглядит немного как это:
Вы добавляете событие click для каждого из элементов списка.
$$('.list-item').addEvent('click', function(e) {
console.log("You clicked me!");
});
Давайте полужирный эти элементы таким образом, мы можем представить себе, что происходит, по полужирным те, которые будут реагировать на событие щелчка.
Теперь, если мы добавили еще несколько пунктов, наш список будет выглядеть так, так как события, не автоматически присоединение к новым элементам:
Эта проблема решается что-то называется делегированием событий.
События JavaScript «пузырь», что означает, что они продолжаются через родительские узлы цели события. Поскольку цель события привязана к событию, становится возможным присоединить события к внешнему родительскому элементу, который проверяет, соответствует ли цель события выбранному селектору.
Таким образом, вместо того, чтобы присоединять кучу событий, один для каждого списка пункта, мы добавим одно событие на весь список, который будет срабатывать только тогда, когда элемент списка был щелкнули.
Мы можем сделать это с использованием синтаксиса делегирования событий MooTools (по общему признанию, не самого большого интерфейса).
Давайте переместим наш обработчик событий на родительский элемент, а не на каждый элемент отдельно.
$('myList').addEvent('click', function() {
console.log("You clicked somewhere on my list!");
}
Теперь это произойдет даже тогда, когда пользователь нажимает в любом месте родителя, а не только на элементы списка. Чтобы ограничить то, что происходит, мы используем синтаксис делегирования событий MooTools (что, по общему признанию, довольно странно).
$('myList').addEvent('click:relay(.item)', function() {
console.log("You clicked on a list item!");
}
Вы можете также использовать Eve.js, которая является основой делегирования контекстного событий, который работает поверх MooTools.
код в Еве будет выглядеть следующим образом:
Eve.scope('#myList', function() {
this.listen('click', '.item', function() {
console.log("You clicked on a list item!");
});
});
если ваши Bookmarklet изменения 'element.value' напрямую, вы должны позволить слушателям знать через:' element.fireEvent ('изменения') ' –
Это это то, что я предполагал, но у меня возникают трудности с запуском события на правильном элементе, который я предполагаю. Я думаю, что прослушиватель событий находится на столе, а не каждый отдельный элемент ввода, но я не уверен. Если на столе мне нужно запустить событие изменения для каждого измененного ввода или для всех вводов сразу? – kalisjoshua
, если он находится на столе, он использует делегирование событий, так как 'table.addEvent ('change: relay (input, select, textarea)', fn);' - вам нужно будет выполнить 'table.fireEvent ('change ', {target: element}) 'или что-то, чтобы вызвать делегирование. делегирование изменений является изворотливым для старого IE, где он «нормализует» его через «onPropertyChange» хаки для радиостанций и флажков ... размещает некоторый код для привязки событий. –