2009-07-29 5 views
26

更新: jQueryの1.4の時点で、$.live()は今 focusoutとfocusInとイベントをサポートしています。は、jQueryの.live()メソッドでは、 "フォーカス" や "ぼかし" をシミュレーション


jQueryは現在 $.live()メソッドの引数として "ぼかし" や "フォーカス" をサポートしていません。回避策どのような種類の私は、次のことを達成するために実装することができます:

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

。 07/29/2009、バージョン1.3.2

+0

$ "focusout" &( 'テキストエリア')。バインド( 'フォーカス')は動作します...あなたのコードサンプルでは、​​あなたが "ライブ()" を意味するものではありません? – James

+0

はい。申し訳ありません。 – Sampson

答えて

31

作業溶液:IE/FF/Chromeでテスト済み

(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); 
       } 
      } 
     } 
    }; 

})(); 

。あなたが意図した通りに正確に動作するはずです。

UPDATE:ティアダウンが機能するようになりました。

+4

jQueryのバグトラッカーに行き、パッチを提供してください。よくやった。 –

+0

'die()'はここで 'teardown'へのルートでしょうか? –

+1

うん、そうだと思う... jQueryはバックグラウンドで(処理を含む)大部分を処理する。適切なイベントが切り離されるようにティアダウンを更新しました。 – James

2

live()は、event delegationへのjQueryのショートカットです。質問にお答えするには、Delegating the focus and blur eventsをご覧ください。

標準的なブラウザでは、event capturingを使用してこれらのイベントをトラップしています。 IEの場合、彼はIEの独自のfocusinfocusの場合)とfocusoutblurの場合)のイベントを使用します。これらのイベントはバブル処理され、従来のイベントの委任が可能です。

私は練習としてjQueryにその移植を残しておきます。

+1

ポート:)(私の答えを参照) – James

0

もう1つ追加:このソリューションは複数のパラメータをサポートしていません。

私が試した:

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

など

、それが唯一のblurイベントを発射しました。

でも、この解決策は役に立ちました。

5

この機能は、jQueryコア(1.4.1以降)に含まれています。

+4

私はこれが私の質問に既に言及しました。 – Sampson

2

彼らは今.live()関数は、ヒバマタとぼかしのイベントをサポートしています... jQueryの1.4.1で追加されている=)挨拶

2

event.typeをチェックするとき、問題は、それが「とfocusIn」を返しているように見えます

$('input').live("focus blur", function(event){ 
    if (event.type == "focusin") { 
     console.log(event.type); 
    }else{ 
     console.log(event.type); 
    } 
}); 
関連する問題