2009-07-29 55 views
26

更新:对于jQuery 1.4,$.live()现在支持的focusIn事件的内容事件。模拟jQuery中.live()方法 “焦点” 和 “模糊”


jQuery目前1不支持 “模糊” 或 “聚焦” 作为$.live()方法参数。什么类型的工作,围绕我能实现以实现以下目标:

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

。 07/29/2009,版本1.3.2

+0

$( 'textarea的')。绑定( '焦点')的作品......在您的代码示例没有你的意思是 “活的()”? – James 2009-07-29 11:33:50

+0

是的。对于那个很抱歉。 – Sampson 2009-07-29 11:36:17

回答

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 /铬测试。应该按照你的意图工作。

更新:Teardowns现在工作。

+4

现在转到jQuery bug跟踪器并提供修补程序。做得好。 – 2009-07-29 11:50:10

2

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

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

我将其作为练习留给jQuery使用。

+1

没有端口:)(请参阅我的回答) – James 2009-07-29 11:44:08

0

另外还有一点:此解决方案不支持多个参数。

我想:

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

,它只是发射了模糊事件。

不过这个解决方案有帮助。

5

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

2

他们已被添加的jQuery 1.4.1 ...现在.live()函数支持墨角藻和模糊事件=)问候

2

貌似问题检查返回“的focusIn”的event.type时& “事件的内容”

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