JS Prototype: предотвращение привязки обработчика событий к одному и тому же объекту несколько раз - PullRequest
1 голос
/ 20 сентября 2011

Таким образом, с новыми функциями ajax мы должны повторно инициализировать наши обработчики событий javascript каждый раз, когда выполняется вызов ajax, поскольку вызов ajax может привести к довольно сильному перерисовыванию всей страницы, что приведет к неинициализированным объектам.

Взгляните на этот jsfiddle: Javascript-обработчик событий, добавленный несколько раз к одному и тому же объекту

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

    MyCompany.field.bindedOnfocusSelector = MyCompany.field._focusEventHandler.bindAsEventListener(MyCompany.field);

просто чувствует себя не так.И у него нет возможности передать больше аргументов функции.

Как еще один автор предложил прототип $ (smth) .on (событие), у меня есть проблемы, чтобы заставить его работать - я помню проблемы, касающиеся междоусобного подхода (например, в IE 8).вещи не работали, которые работали в Firefox), и даже в этом простом примере jsFiddle проблема с on ('focus') :

1 Ответ

2 голосов
/ 20 сентября 2011

Как насчет того, чтобы зарегистрировать респондента ajax и добавить методы после завершения запроса

Ajax.Responders.register({
    onComplete: function(transport) {
        MyCompany.field._initTextInputFields();
    }
});

ОБНОВЛЕНИЕ

Хорошо, учитывая ваш комментарий,как насчет просмотра всей страницы, т. е. body и определения того, произошло ли событие ввода, например:

 $("#body").on("focus", "input[type=text]:not([readonly])", function(event, element) {
    // ....
 });

Я думаю, это поможет вам, поскольку вы добавляете только одного наблюдателя, и вам никогда не нужно его удалять, всеВаша логика может содержаться.

PS: обратите внимание, что Event.on доступен только в прототипе 1.7

ОБНОВЛЕНИЕ

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

Обновленная скрипка

...