Подтвердить что ты не робот

Имитация "фокуса" и "размытия" в методе jQuery.live()

Обновление: Начиная с jQuery 1.4, $.live() теперь поддерживает события focusin и focusout.


jQuery в настоящее время 1 не поддерживает "размытие" или "фокус" в качестве аргументов для $. live(). Какой тип работы можно было бы реализовать для достижения следующего:

$("textarea")
  .live("focus", function() { foo = "bar"; })
  .live("blur",  function() { foo = "fizz"; });

1. 29.07.2009, версия 1.3.2

4b9b3361

Ответ 1

Рабочее решение:

(function(){

    var special = jQuery.event.special,
        uid1 = 'D' + (+new Date()),
        uid2 = 'D' + (+new Date() + 1);

    jQuery.event.special.focus = {
        setup: function() {
            var _self = this,
                handler = function(e) {
                    e = jQuery.event.fix(e);
                    e.type = 'focus';
                    if (_self === document) {
                        jQuery.event.handle.call(_self, e);
                    }
                };

            jQuery(this).data(uid1, handler);

            if (_self === document) {
                /* Must be live() */
                if (_self.addEventListener) {
                    _self.addEventListener('focus', handler, true);
                } else {
                    _self.attachEvent('onfocusin', handler);
                }
            } else {
                return false;
            }

        },
        teardown: function() {
            var handler = jQuery(this).data(uid1);
            if (this === document) {
                if (this.removeEventListener) {
                    this.removeEventListener('focus', handler, true);
                } else {
                    this.detachEvent('onfocusin', handler);
                }
            }
        }
    };

    jQuery.event.special.blur = {
        setup: function() {
            var _self = this,
                handler = function(e) {
                    e = jQuery.event.fix(e);
                    e.type = 'blur';
                    if (_self === document) {
                        jQuery.event.handle.call(_self, e);
                    }
                };

            jQuery(this).data(uid2, handler);

            if (_self === document) {
                /* Must be live() */
                if (_self.addEventListener) {
                    _self.addEventListener('blur', handler, true);
                } else {
                    _self.attachEvent('onfocusout', handler);
                }
            } else {
                return false;
            }

        },
        teardown: function() {
            var handler = jQuery(this).data(uid2);
            if (this === document) {
                if (this.removeEventListener) {
                    this.removeEventListener('blur', handler, true);
                } else {
                    this.detachEvent('onfocusout', handler);
                }
            }
        }
    };

})();

Протестировано в IE/FF/Chrome. Должна работать точно так, как вы планировали.

UPDATE: теперь работают Teardown.

Ответ 2

Эта функциональность теперь включена в ядро ​​jQuery (начиная с 1.4.1).

Ответ 3

live() представляет собой jQuery ярлык для делегирование событий. Чтобы ответить на ваш вопрос, см. Делегирование событий фокуса и размытия.

Это довольно остроумно: для совместимых со стандартами браузеров он использует захват событий, чтобы уловить эти события. Для IE он использует собственные для IE события focusin (для focus) и focusout (для blur), которые делают пузырь, позволяя традиционное делегирование событий.

Я оставил его перенос в jQuery в качестве упражнения.

Ответ 4

они добавлены в jquery 1.4.1... теперь функция .live() поддерживает события fucus и blur =) Приветствия

Ответ 5

Похоже, проблема заключается в том, что при проверке event.type он возвращает "focusin" и "focusout"

$('input').live("focus blur", function(event){
    if (event.type == "focusin") {
        console.log(event.type);
    }else{
        console.log(event.type);
    }
});

Ответ 6

еще одно дополнение: это решение не поддерживает более одного параметра.

Я попытался:

$(el).live("focus blur",  function(e) {
  if (e.type == "focus") {

и др.

и он только активировал событие размытия.

тем не менее это решение оказалось полезным.