Ответ 1
В вашей функции я вижу, что вы используете как elemenet
, так и element
, где они должны быть одинаковыми. Это будет по крайней мере частью проблемы.
Я также вижу, что ваша функция addEvents
- это функция самоисполнения, которая не имеет смысла в этом отношении. Похоже, что это должна быть нормальная функция.
Здесь функция кросс-браузера. Помимо создания одной функции для добавления обработчиков событий, она также нормализует указатель this
и объект events
, чтобы их можно было обрабатывать одинаково в любом браузере.
// add event cross browser
function addEvent(elem, event, fn) {
// avoid memory overhead of new anonymous functions for every event handler that installed
// by using local functions
function listenHandler(e) {
var ret = fn.apply(this, arguments);
if (ret === false) {
e.stopPropagation();
e.preventDefault();
}
return(ret);
}
function attachHandler() {
// set the this pointer same as addEventListener when fn is called
// and make sure the event is passed to the fn also so that works the same too
var ret = fn.call(elem, window.event);
if (ret === false) {
window.event.returnValue = false;
window.event.cancelBubble = true;
}
return(ret);
}
if (elem.addEventListener) {
elem.addEventListener(event, listenHandler, false);
return {elem: elem, handler: listenHandler, event: event};
} else {
elem.attachEvent("on" + event, attachHandler);
return {elem: elem, handler: attachHandler, event: event};
}
}
function removeEvent(token) {
if (token.elem.removeEventListener) {
token.elem.removeEventListener(token.event, token.handler);
} else {
token.elem.detachEvent("on" + token.event, token.handler);
}
}
Если вам нужна более простая версия без опций распространения и предотвращения по умолчанию, но с нормализацией this
и event
, это будет следующим:
// add event cross browser
function addEvent(elem, event, fn) {
if (elem.addEventListener) {
elem.addEventListener(event, fn, false);
} else {
elem.attachEvent("on" + event, function() {
// set the this pointer same as addEventListener when fn is called
return(fn.call(elem, window.event));
});
}
}