在jQuery .live()方法中模拟“焦点”和“模糊”

时间:2009-07-29 10:33:26

标签: javascript jquery

更新:从jQuery 1.4开始,$.live()现在支持 focusin 焦点事件。


jQuery目前 1 不支持“模糊”或“焦点”作为$.live()方法的参数。我可以实现什么类型的解决方案来实现以下目标:

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

1 即可。 07/29/2009,版本1.3.2

6 个答案:

答案 0 :(得分:31)

工作解决方案:

(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中测试过。应该按照你的预期工作。

更新:拆解现在正在工作。

答案 1 :(得分:5)

此功能现在包含在jQuery核心中(从1.4.1开始)。

答案 2 :(得分:2)

live()是jQuery的event delegation快捷方式。要回答您的问题,请参阅Delegating the focus and blur events

这非常巧妙:对于符合标准的浏览器,他使用event capturing来捕获这些事件。对于IE,他使用IE的专有focusin(针对focus)和focusout(针对blur)事件,这些事件会冒泡,允许传统的事件委派。

我将把它移植到jQuery作为练习。

答案 3 :(得分:2)

它们已被添加到jquery 1.4.1 ...现在.live()函数支持fucus和模糊事件=)问候

答案 4 :(得分:2)

看起来问题是在检查event.type时返回“focusin”& “事件的内容”

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

答案 5 :(得分:0)

另外一个补充:此解决方案不支持多个参数。

我试过了:

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

它只触发了模糊事件。

然而,这个解决方案很有帮助。