Кросс-браузерная обработка событий - PullRequest
3 голосов
/ 25 августа 2010

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

РЕДАКТИРОВАТЬ 1: Для ясности прокомментировал каждый блок с намерением браузера.Обновленный блок IE теперь не вызывает func (благодаря зорким глазам Энди Е. ).

РЕДАКТИРОВАТЬ 2: Обновлен блок IE для вызова func.call() с помощьюthis вместо elem.

РЕДАКТИРОВАТЬ 3: Обновлено, чтобы передать JSLint с "Добрыми частями".

function hookEvent(elem, evt, func)
{
    if (typeof elem === "string")
    {
        elem = document.getElementById(elem);
    }
    if (!elem)
    {
        return null;
    }
    var old, r;
    if (elem.addEventListener)  //w3c
    {
        elem.addEventListener(evt, func, false);
        r = true;
    }
    else if (elem.attachEvent)  //ie
    {
        elem[evt + func] = function ()
        {
            func.call(this, window.event);
        };
        r = elem.attachEvent("on" + evt, elem[evt + func]);
    }
    else                        //old
    {
        old = elem["on" + evt] ? elem["on" + evt] : function (e) { };
        elem["on" + evt] = function (e)
        {
            if (!e)
            {
                e = window.event;
            }
            old.call(this, e);
            func.call(this, e);
        };
        r = true;
    }
    return r;
}

1 Ответ

3 голосов
/ 25 августа 2010

В этой строке есть проблема:

r = elem.attachEvent("on" + evt, func.call(elem, window.event));

Это немедленно выполнит func () , вместо того, чтобы присоединять его в качестве обработчика для события.Вместо этого возвращаемое значение func () будет присвоено событию, которое выдаст ошибку, если его тип не "function".

Я могу понять, что вы неЯ не хочу использовать каркас, но многие ( многие ) другие написали кросс-браузерные фрагменты обработки событий. John Resig имеет одну версию, Google для «javascript addEvent» для многих других.

http://www.google.com/search?q=javascript+addevent

...