Правильно привязать события javascript

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

Ответы

Ответ 1

Есть два разных способа сделать это. Только один будет работать; который зависит от браузера. Здесь используется метод утилиты, который использует оба:

function bindEvent(element, type, handler) {
   if(element.addEventListener) {
      element.addEventListener(type, handler, false);
   } else {
      element.attachEvent('on'+type, handler);
   }
}

В вашем случае:

bindEvent(window, 'load', function() {
    // all elements such as images are loaded here
});

Ответ 2

Я знаю, что вы только спрашивали о том, как связать события. Но мальчик Оооу, это не заканчивается. Там гораздо больше, чтобы получить этот правильный кросс-браузер, чем просто первоначальное связывание.

@d. ответа будет достаточно просто для конкретного случая события load window, которое вы ищете. Но это может дать начинающим читателям вашего кода ложное представление о том, "правильно ли это". Просто потому, что вы связали мероприятие, это не значит, что вы позаботились о его нормализации. Возможно, вам лучше всего установить window.onload:

window.onload = (function(onload) {
  return function(event) {
    onload && onload(event);

    // now do your thing here
  }
}(window.onload))

Но для общего случая привязки события @d. ответ настолько далек от удовлетворения, что разочаровывает. Единственное, что он делает правильно - это использование функции обнаружения, в отличие от обнаружения браузера.

Не нужно слишком много говорить о том, но привязка событий JavaScript, вероятно, является причиной №1 для библиотеки JavaScript. Мне все равно, кто это, другие люди исправляли эту проблему снова и снова. Ниже приведены вопросы, связанные с реализацией дома в вашей функции обработчика:

  • Как мне получить объект event?
  • Как предотвратить действие по умолчанию для события (например, нажатие на ссылку, но не навигация)
  • Почему this постоянно указывает на объект window?
  • (события мыши мыши) Каковы координаты x/y события?
  • Какая кнопка мыши вызвала событие?
  • Был ли это щелчок Ctrl или просто обычный клик?
  • Каким элементом было инициировано событие?
  • Каким будет элемент? (т.е. relatedTarget, скажем, для blur)
  • Как отменить всплеск события через его родительский DOM?
  • (переполнение события Re), какой элемент на самом деле получает событие сейчас? (т.е. currentTarget)
  • Почему я не могу получить freaking char код из этого события keydown?
  • Почему моя страница пропускает память, когда я добавляю все эти обработчики событий? Argh!
  • Почему я не могу отменить эту анонимную функцию, связанную раньше?

И этот список продолжается...

Единственная веская причина, чтобы катиться в наши дни, - это обучение. И это прекрасно. Тем не менее, прочитайте PPK Введение в события браузера. Посмотрите на источник jQuery. Посмотрите Источник прототипа. Вы не пожалеете об этом.

Ответ 3

Что-то вроде этого

window.onload = (function(onload) {
    return function(event) {
        onload && onload(event);

        $(".loading-overlay .spinner").fadeOut(300),
            $(".loading-overlay").fadeOut(300);
            $("body").css({
                overflow: "auto",
                height: "auto",
                position: "relative"
            })
    }
}(window.onload));

Ответ 4

window.onload = function() {
   // ...
};