2013-09-18 2 views
0

Так что это своего рода отрывочно.Mootools Событие стрельбы

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не разработчик MooTools; почти никогда не касался его.

Я пытаюсь запустить событие MooTools.

У меня есть сетка отслеживания времени, которую я пытаюсь автоматически заполнить в AtTask с помощью букмарклета JavaScript. Я написал это, чтобы вставить числа во входные элементы на странице, но проблема, с которой я сталкиваюсь, заключается в том, что, поскольку я вставляю значения через JS, события не запускают запланированные MooTools, поэтому изменения не распознаются. В результате, когда я пытаюсь сохранить страницу, значения не сохраняются.

Я использовал VisualEvent, чтобы узнать о мероприятии.

Есть ли способ

+2

если ваши Bookmarklet изменения 'element.value' напрямую, вы должны позволить слушателям знать через:' element.fireEvent ('изменения') ' –

+0

Это это то, что я предполагал, но у меня возникают трудности с запуском события на правильном элементе, который я предполагаю. Я думаю, что прослушиватель событий находится на столе, а не каждый отдельный элемент ввода, но я не уверен. Если на столе мне нужно запустить событие изменения для каждого измененного ввода или для всех вводов сразу? – kalisjoshua

+2

, если он находится на столе, он использует делегирование событий, так как 'table.addEvent ('change: relay (input, select, textarea)', fn);' - вам нужно будет выполнить 'table.fireEvent ('change ', {target: element}) 'или что-то, чтобы вызвать делегирование. делегирование изменений является изворотливым для старого IE, где он «нормализует» его через «onPropertyChange» хаки для радиостанций и флажков ... размещает некоторый код для привязки событий. –

ответ

1

Итак, давайте говорить прямо сейчас у вас есть список, и ваш веб-страница выглядит немного как это:

  • Один
  • Два
  • Три

Вы добавляете событие 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!"); 
    }); 

}); 
+0

Я полностью понимаю различия между делегацией событий и слушателями. Но то, что вы упомянули выше «click: relay (.item)», означает, что мне нужно будет сделать что-то вроде '$$ ('# table'). FireEvent ('change: relay (.item)')' в порядке для запуска конкретного события на элементе? – kalisjoshua

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