Каков наилучший способ добавить событие в JavaScript?

StackOverflow https://stackoverflow.com/questions/34126

Вопрос

Я вижу 2 основных способа установки событий в JavaScript:

  1. Добавьте событие непосредственно внутри тега следующим образом:

    <a href="" onclick="doFoo()">do foo</a>

  2. Установите их с помощью JavaScript следующим образом:

    <a id="bar" href="">do bar</a>

и добавьте событие в <script> раздел внутри <head> разделе или во внешнем файле JavaScript, например, если вы используете Прототипы:

Event.observe(window, 'load', function() {
    $('bar').observe('click', doBar);
}

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

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

Какой метод является лучшим?

Убийственный ответ будет по достоинству оценен!

Это было полезно?

Решение

По моему опыту, есть два основных момента этого:

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

2) второй вид, т.е. Event.observe() имеет преимущества, когда одно и то же или очень похожее действие предпринимается на нескольких событиях, потому что это становится очевидным, когда все эти вызовы находятся в одном месте. Кроме того, как отметил Конрад, в некоторых случаях это можно обработать с одним вызовом.

Другие советы

Я думаю, что первый метод легче читать и поддерживать

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

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

$$('#itemlist table th > a').invoke('observe', 'click', performSort);

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

Я считаю, что второй метод обычно предпочтительнее, потому что он хранит информацию о действии (то есть JavaScript) отдельно от разметки так же, как CSS отделяет презентацию от разметки.

Я согласен, что это затрудняет увидеть, что происходит на вашей странице, но хорошие инструменты, такие как Firebug, очень помогут вам в этом. Вы также найдете гораздо лучшую поддержку IDE доступной, если вы сохраните минимальное смешивание HTML и JavaScript.

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

Вы также можете использовать AddEventListener (не в IE) / AttachEvent (IE).

Проверить: http://www.quirksmode.org/js/events_advanced.html

Они позволяют прикрепить функцию (или несколько функций) к событию на существующем объекте DOM. Они также имеют преимущество в том, что он позволил не связать позже.

В общем, если вы используете серьезное количество JavaScript, может быть полезно сделать ваш JavaScript читаемо, в отличие от вашего HTML. Итак, вы могли бы сказать, что onclick=X В HTML очень ясно, но это и отсутствие разделения кода - еще одна синтаксическая зависимость между частями - и случай, в котором вы должны прочитать как HTML, так и JavaScript, чтобы понять динамическое поведение страницы Полем

Мое личное предпочтение - использовать jQuery во внешних файлах JS, чтобы JS полностью отделен от HTML. JavaScript должен быть ненавязчивым, поэтому встроенный (т. Е. Первый пример) не совсем лучший выбор, на мой взгляд. При просмотре HTML единственным признаком того, что вы используете JS, должен быть сценарий в голову.

Примером прикрепления (и обработки) событий может быть что -то подобное

var myObject = {

    allLinkElements: null,  

    init: function()
    {
        // Set all the elements we need
        myObject.setElements();

        // Set event handlers for elements
        myObject.setEventHandlers();
    },

    clickedLink: function()
    {
        // Handle the click event
        alert('you clicked a link');
    },

    setElements: function()
    {
        // Find all <a> tags on the page
        myObject.allLinkElements = $('a');

        // Find other elements...
    },

    setEventHandlers: function()
    {
        // Loop through each link
        myObject.allLinkElements.each(function(id)
        {   
            // Assign the handler for the click event
            $(this).click(myObject.clickedLink);
        });

        // Assign handlers for other elements...
    }
}

// Wait for the DOM to be ready before initialising
$(document).ready(myObject.init);

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

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

Библиотеки, такие как Yui и Jquery, предоставляют методы для добавления событий только после того, как DOM будет готов, который может быть до Window.onload. Они также гарантируют, что вы можете добавить несколько обработчиков событий, чтобы вы могли использовать сценарии из разных источников без различных обработчиков событий, перезаписывающих друг друга.

Итак, ваш практическое выбор;

Один. Если ваш сценарий прост и единственный, который когда -либо будет работать на странице, создайте функцию init, как SO:

window.onload = function () {
    init();
}
function init() {
    // actual function calls go here
    doFoo();
}

Два. Если у вас есть много сценариев или планируете сценарии сочетания из разных источников, используйте библиотеку и ее onDOMReady Метод для безопасного добавления обработчиков ваших событий

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top