prototypejs — создать событие нажатия для кнопки с классом

#javascript #events #event-handling #prototypejs

#javascript #Мероприятия #обработка событий #prototypejs

Вопрос:

Я попробовал это так:

 Event.observe('.add_select_row', 'click', function() {
    console.log("KLICK!");
});
  

Но я получаю «Неперехваченную ошибку типа: не удается прочитать свойство ‘get’ неопределенного»

Я также пробовал:

 Event.observe('add_select_row', 'click', function() {
    console.log("KLICK!");
});
  

… и …

 Event.observe($('.add_select_row'), 'click', function() {
    console.log("KLICK!");
});
  

введите описание изображения здесь

http://api.prototypejs.org/dom/Event/observe/

Комментарии:

1. Согласно предоставленной вами документации, кажется, что первым параметром должен быть элемент DOM или строка с идентификатором элемента DOM. Но, похоже, вы пытаетесь вызвать метод observe с объектом jQuery или со строкой, которая является классом элемента DOM.

2. Нет, это не jQuery, это prototypejs, который выглядит очень похоже на jQuery

Ответ №1:

Для работы Event.observe требуется элемент DOM или идентификатор элемента DOM. Если вы хотите привязать прослушиватель событий щелчка к коллекции из одного или нескольких элементов, имеющих одинаковое имя класса, тогда вам нужно по-другому сконструировать свой прослушиватель или привязать уникальный прослушиватель к каждому элементу, имеющему это имя класса.

Самый простой способ сделать то, что вы описываете здесь, — добавить идентификатор к элементу, который вы хотите прослушать. Если вы не можете этого сделать, вы можете переписать своего слушателя, чтобы он отвечал на другом уровне:

 $(document).observe('click', '.add_select_row', function(evt, elm){
  // evt is now bound to the click event, so you could keep it from bubbling:
  evt.stop();
  // elm is now bound to the element with the classname add_select_row
  // that triggered the click, so you can do something with that
  elm.addClassName('clicked');
  console.log('CLICK');
});
  

Этот шаблон известен как «ленивый наблюдатель», который использует тот факт, что события щелчка всплывают и в конечном итоге перехватываются самим документом. Вы также не ограничены использованием документа для этого. Вы также можете установить такого рода наблюдателя для любого родительского элемента кнопки, например:

 $('foo').on('click', '.add_select_row', function(evt, elm){});
  

если у вас был div#foo на каком-то уровне предка для этой кнопки.

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

Если вы действительно хотите иметь отдельного наблюдателя для каждой кнопки, вы могли бы присвоить каждому уникальный идентификатор. Если бы это было непрактично, вы могли бы сделать это (но не делайте этого — расточительно создавать наблюдателей для нескольких элементов, когда вас интересует только один):

 $$('.add_select_row').each(function(elm){
  elm.observe('click', function(evt){
    console.log('CLICK');
  });
});
  

Метод «двойной доллар» в Prototype позволяет использовать имена классов или любой другой CSS-селектор для идентификации коллекции элементов на странице. Даже если на странице есть только один возвращаемый соответствующий элемент, он всегда возвращает массив, содержащий этот элемент. Это похоже на то, как jQuery видит DOM, а в Prototype 1.7 и выше использует ту же библиотеку Sizzle CSS selector для выбора элементов.

Комментарии:

1. Спасибо! Проблема в том, что кнопка создается динамически во время выполнения, я думаю, что ваш первый пример будет работать. Я должен протестировать это в понедельник.

2. Спасибо, Geek Num 88 за быстрое исправление моего примера! Я настолько избалован TextMate, что легко забыть, что пары не автоматически сбалансированы при вводе здесь.