2009-07-29 69 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); 
    } 
});