безопасно перехватывать события в javascript - PullRequest
2 голосов
/ 03 июня 2011

В исходном коде здесь http://www.daftlogic.com/sandbox-javascript-slider-control.htm

есть эти инструкции:

// safely hook document/window events
if (document.onmousemove != f_sliderMouseMove) {
window.f_savedMouseMove = document.onmousemove;
document.onmousemove = f_sliderMouseMove;
}

Я не понимаю, что он делает и почему было бы безопаснее сделать это таким образом, кто-то понимает?

Ответы [ 3 ]

3 голосов
/ 03 июня 2011

Возможно, какой-то другой код уже назначил обработчик события для document.onmousemove.Проблема этого метода, в отличие от addEventListener, заключается в том, что только одна функция может быть назначена на element.onXXXX.Таким образом, если вы слепо назначаете новый обработчик событий, уже существующий может быть перезаписан, а другой код может сломаться.

В таком случае я бы написал:

if (document.onmousemove) {
    (function() {
         var old_handler = document.onmousemove;
         document.onmousemove = function() {
            old_handler.apply(this, arguments);
            f_sliderMouseMove.apply(this, arguments);
         };
    }());
}
else {
    document.onmousemove = f_sliderMouseMove;
}

Таким образомгарантируется выполнение обоих обработчиков событий.Но я думаю, это зависит от контекста кода.Возможно f_sliderMouseMove звонит window.f_savedMouseMove в любом случае.

1 голос
/ 03 июня 2011

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

1 голос
/ 03 июня 2011

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

Это позволяет избежать штамповки на некоторых других хуках кодов, которые уже были установлены.

Можно ожидать, что код хука будет примерно таким:

f_sliderMouseMove = function(e) {
   // Do my thing

   // Do their thing
   window.f_savedMouseMove();
}

[обязательный плагин jquery] использует события jquery, и вы можете игнорировать подобные проблемы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...