javascript - события - где их размещать?

Я надеюсь, что в сообществе разработчиков js у нас может быть консенсус по этому поводу:

Должны ли мы объявлять события onclick, onkeyup... и т.д. внутри или вне нашего HTML-документа?

1) Я предпочитаю иметь их отдельно. Истинный. 2) Я также знаю, что HTML5 добавляет в игру новые интерактивные элементы...

С уважением, МЕМ.


person MEM    schedule 23.08.2010    source источник


Ответы (4)


В идеале, если вы можете определить свой код события и прикрепить эти события к соответствующим элементам в отдельных файлах JS. Разделяйте JS и HTML везде, где это возможно.

person Paul Hadfield    schedule 23.08.2010
comment
@ALL - А как насчет новинки html5. Можем ли мы сделать то же самое. У Html5 есть новые события для игры, не так ли? Мне интересно, можем ли мы использовать эту технику и там... За этим я вижу, что мне не ясно, о природе этих событий, либо они принадлежат ядру DOM, либо они принадлежат ядру javascript не? - person MEM; 23.08.2010
comment
Я не могу предвидеть, что HTML5 изменит рекомендации по разделению кода JS и HTML — надеюсь, люди просто найдут лучшие и более понятные способы сделать это. - person Paul Hadfield; 23.08.2010
comment
@MEM: ничего не изменилось с HTML5. У вас новые события, но практика та же. - person Sasha Chedygov; 23.08.2010
comment
И здесь у меня есть отношение: DOM требуется сценариям JavaScript, которые хотят динамически проверять или изменять веб-страницу. Другими словами, объектная модель документа — это то, как JavaScript видит содержащуюся в ней HTML-страницу и состояние браузера. - person MEM; 23.08.2010

Рекомендуем прочитать о ненавязчивом JavaScript и jQuery.

person sanmai    schedule 23.08.2010

Написание встроенных обработчиков событий было абсолютно плохой идеей, по крайней мере, десятилетие.

Даже доступ к таким свойствам, как «element.onkeyup», — довольно плохая идея.

Используйте слушателей. А еще лучше каркас.

EDIT: И вот почему комментарий Тима Дауна нелеп:

  1. Если обоснование ЛЮБОГО решения по программированию начинается со слов "если вы знаете, что вам когда-нибудь понадобится...", то не делайте этого. Серьезно.

  2. «Все браузеры с поддержкой сценариев» на самом деле означают IE5.5+ FF2+ Safari 3+ Opera 9+. Это охватывает более 99% веб-пользователей, и все эти браузеры поддерживают прослушиватели событий. Прослушиватели событий имеют большие преимущества по сравнению с доступом к свойствам обработчиков событий — большое из них заключается в том, что для любого события может быть более одного прослушивателя. В современном программировании на Javascript это происходит постоянно. Использовать специальный код для использования устаревшей системы обработки событий только потому, что вы можете это сделать, — ужасная идея, враждебная по отношению к действительно хорошим идеям, таким как использование библиотек и написание ненавязчивого, согласованного кода.

  3. return false; — это совершенно нелогичный и антисемантический способ означать «прекратить всплывать/распространять это событие вверх/вниз по дереву DOM». Знаете, что интуитивно? Общие выражения в коде библиотеки, такие как event.stop().

person Triptych    schedule 23.08.2010
comment
Большое спасибо за советы слушателей, а также за фреймворк... Я постараюсь узнать больше о прослушивателях событий. - person MEM; 23.08.2010
comment
Бред какой то. Если вы знаете, что вам понадобится только один обработчик событий на element, тогда element.onkeyup — это то, что вам нужно. Во-первых, он работает во всех браузерах, поддерживающих сценарии, и работает во всех них одинаково (за исключением того, откуда вы получаете объект события). Во-вторых, механизм предотвращения поведения по умолчанию для события просто return false; во всех браузерах. - person Tim Down; 23.08.2010
comment
Понятно. Ну, правда в том, что мне нужен только один. Но я глупый медленный программист, который хочет быть как можно более солидным программистом. Один день. :) Возможно, поэтому я использую PDO в базе данных со 100 или менее записями. Да ладно... Однако иногда нам нужно это сделать, я просто надеюсь, что, когда этот день наступит на стороне js, я смогу сказать: да, я быстро напишу js listener ;) Но для этого... я верю, что нам действительно нужно страдать. И это были я знаю. :) К. С уважением. :) - person MEM; 23.08.2010
comment
МЭМ: Извините. Моя ерунда. был чрезмерно агрессивен и направлен на Триптих. - person Tim Down; 23.08.2010
comment
Триптих: 1. Что? Это широкое заявление — рецепт чрезмерного проектирования и ничего не выполненного. Вы ничего не можете сделать, не определив сначала свои требования. 2. Я не совсем понимаю вашу точку зрения о конкретных браузерах. Моя заключалась в том, что больше браузеров поддерживают свойства обработчика событий, чем поддерживают addEventListener/attachEvent. Если бы вы считали, что браузеры, которые не поддерживают слушателей, теперь в значительной степени неактуальны, я бы с этим согласился. Кроме того, устаревшее не значит плохое. 3. return false означает не то, что вы говорите. Это означает, что не следует выполнять действие браузера по умолчанию. - person Tim Down; 23.08.2010
comment
3. (продолжение) return false не останавливает распространение события. Моя первоначальная точка зрения о return false заключалась в том, что она поддерживается повсеместно. Я не пытался ничего сказать о том, является ли return false разумным выбором синтаксиса для того, что он делает; Я не уверен, что event.stop() лучше (остановить что именно?), и в любом случае не служит той же цели. - person Tim Down; 23.08.2010
comment
@Triptych: event.stop кроссбраузерный? Разве вам не нужна библиотека JS, чтобы использовать его? - person Marco Demaio; 23.08.2010
comment
@Triptych: я вернулся к этому вопросу с намерением изменить свой ответ, который заходит слишком далеко в пользу атрибутов и свойств обработчиков событий в своем энтузиазме, чтобы бросить вызов общепринятой мудрости о том, что они плохие и злые. Глядя на наши разногласия здесь и отбрасывая само разногласие, кажется немного несправедливым помещать ваше опровержение моих первоначальных тезисов в ваш ответ (который всегда отображается большим текстом), а не в комментарии (что я и делаю). ограничивается, отображается мелким текстом и не отображается по умолчанию), а затем не утруждайте себя ответом на мои последующие комментарии. - person Tim Down; 10.02.2011

Текущее популярное мнение состоит в том, что все должно быть ненавязчивым, а это означает, что свойства обработчика событий, такие как someElement.onclick = function(e) { ... };, широко осуждаются, а атрибуты обработчика событий, такие как <input type="button" onclick="doSomething()">, полностью игнорируются. На самом деле, есть допустимые применения для обоих.

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

В заключение, для данной задачи используйте самый простой метод, который соответствует вашим потребностям.


Свойства обработчика событий

Пример

myElement.onclick = function(e) { alert("Clicked"); };

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

Преимущества

  • Отделяет поведение от контента
  • Работает во всех скриптовых браузерах
  • Работает одинаково во всех браузерах, за исключением вопроса о том, откуда берется объект Event (window.event в IE, параметр функции в других браузерах).
  • Универсально поддерживаемый метод предотвращения поведения браузера по умолчанию с помощью return false

Недостатки

  • Разрешает только одного слушателя для определенного объекта и события
  • Для элементов в исходном коде HTML обработчики обычно не назначаются до тех пор, пока документ не будет загружен.

Атрибуты обработчика событий

Пример

<input type="button" value="test" onclick="alert('Clicked');">

Это единственный подход, который работает, когда важно, чтобы элемент реагировал на событие до завершения загрузки документа (см. все еще" rel="nofollow noreferrer">http://peter.michaux.ca/articles/the-window-onload-problem-still для более подробного обсуждения этого вопроса). Кроме того, это самый простой способ добавить обработчики событий.

Преимущества

  • Работает во всех скриптовых браузерах
  • Работает одинаково во всех браузерах
  • Работает, как только элемент визуализируется
  • Самый простой способ добавить обработчик событий
  • Универсально поддерживаемый метод предотвращения поведения браузера по умолчанию с помощью return false
  • На очень простой странице это самый читаемый метод
  • Стандартизирован в спецификации HTML 4

Недостатки

  • Смешивает поведение с содержанием
  • Разрешает только одного слушателя для определенного объекта и события

addEventListener/attachEvent

Пример (аналог attachEvent не показан)

myElement.addEventListener("click", function(e) { alert("Clicked"); }, false);

Это единственный метод, позволяющий прикрепить несколько слушателей к конкретному событию на конкретном объекте. addEventListener стандартизирован в спецификации событий DOM Level 2.

Преимущества

  • Отделяет поведение от контента
  • Позволяет прослушивать несколько событий
  • addEventListener — это современный стандарт, поддерживаемый в IE 9, что означает, что все текущие основные браузеры будут поддерживаться после выпуска IE 9.

Недостатки

  • Немного сложно реализовать правильно кроссбраузерно
  • attachEvent в IE не совсем эквивалентно addEventListener
  • Для элементов в исходном коде HTML обработчики обычно не назначаются до тех пор, пока документ не будет загружен.
person Tim Down    schedule 23.08.2010
comment
+1 и кстати, когда вы говорите, что addEventListener/attachEvent сложно реализовать правильно в кросс-браузерном режиме, это не совсем так, вероятно, это потому, что люди настолько привыкли использовать JS-библиотеку, что даже не знают, насколько это может быть просто, посмотрите stackoverflow.com/questions/2631241/ и расскажите мне свои мысли. - person Marco Demaio; 23.08.2010
comment
Марко: Я уже писал кросс-браузерные обертки addEventListener/attachEvent и согласен, что это не слишком сложно, но есть несколько проблем, которые не сразу бросаются в глаза, например, проблема с this в функции прослушивателя и как вы передаете объект Event в функцию прослушивателя. И то, и другое легко решается, но знать о них нужно. - person Tim Down; 23.08.2010