Если вы используете стиль element.onclick = xxx;
, вы ограничиваете себя (и любые другие сценарии, которые используете на странице) единичным обработчиком событий для события в этом элементе (любой предыдущий обработчик для этого события забивается). С помощью механизма addEventListener
/ attachEvent
вы можете добавлять и удалять обработчики событий независимо друг от друга, без перекрестных помех.
Так, например, если вы делаете:
document.getElementById('foo').onclick = function() {
};
... тогда любой предыдущий обработчик click
в элементе foo
сдувается и больше не вызывается при нажатии foo
. Для сравнения:
document.getElementById('foo').addEventListener('click', function() {
});
Теперь вызывается ваш обработчик click
, но вызываются все другие click
обработчики, которые ранее были присоединены к элементу , также . Ты хорошо играешь с другими. : -)
Легко создать функцию, которая устраивает эти вещи для вас:
function hookEvent(element, eventName, handler) {
if (element.attachEvent) {
element.attachEvent("on" + eventName, handler);
}
else if (element.addEventListener) {
element.addEventListener(eventName, handler, false);
}
else {
element["on" + eventName] = handler;
}
}
... или если вы действительно хотите поехать в город:
var hookEvent = (function() {
function hookViaAttach(element, eventName, handler) {
element.attachEvent("on" + eventName, handler);
}
function hookViaAdd(element, eventName, handler) {
element.addEventListener(eventName, handler, false);
}
function hookDOM0(element, eventName, handler) {
element["on" + eventName] = handler;
}
if (document.attachEvent) {
return hookViaAttach;
}
if (document.addEventListener) {
return hookViaAdd;
}
return hookDOM0;
})();
... которая создает функцию, которая определяет один раз , какой тип обработчика использовать, а затем использует его повсюду.
Честно говоря, для этого полезно использовать работу других и использовать такую библиотеку, как jQuery , Прототип , YUI , Закрытие или любой из нескольких других .