2011-01-26 10 views
6

私は、テキスト入力とテキストエリアのぼかし/フォーカスにクラスを追加/削除するのにうまく動作するこのスクリプトを持っていますが、ページの後に追加されたコンテンツ負荷をAJAX経由で:jQueryはAJAXのロードされたコンテンツにフォーカス/ブラーイベントをバインドします

$(function() { 
    $('input[type=text], textarea').addClass("idleField"); // reset all ## 
    $('input[type=text], textarea').bind("focus", function(event){ 
     $(this).removeClass("idleField").addClass("focusField"); 
     if (this.value == this.defaultValue){ 
     this.value = ''; 
    } 
    if(this.value != this.defaultValue){ 
     this.select(); 
     } 
    }).bind("blur", function(event){ 
    $(this).removeClass("focusField").addClass("idleField"); 
     if ($.trim(this.value) == ''){ 
     this.value = (this.defaultValue ? this.defaultValue : ''); 
    } 
    }); 

}); 

これは新しいコンテンツ、つまりアイデアをバインドしていませんか?

答えて

10

代わりの.bindを用いては、.on()を使用する:

$(document).on('focus', 'input[type=text], textarea', function() { 
    // stuff here will be applied to present and *future* elements 
}); 
+0

10/10 - どの速度ですか? - これが私の最初の投稿です - どうやってポイントを獲得できますか? –

+1

'input [type = text]'は単に 'input:text'にすることができます。ここで、textは[pseudo-selector]です(http://api.jquery.com/category/selectors/)。 – karim79

+1

私は今、廃止されたメソッドの代わりに '.on()'を使うように答えを変えました。 – JJJ

1

.bind()方法は、現在存在する要素のためのものです。イベントハンドラをDOM およびに存在する要素に追加するには、将来の要素が存在する可能性があります。.live()メソッドを使用する必要があります。イベントをDOMの最上部にバブルさせたくない場合は、.delegate()メソッドを使用することもできます。

さらに、.toggleClass()メソッドを使用すると、1つの関数呼び出しで要素のクラスを切り替えることができます。したがって、あなたのコードは次のようになります:

$(function() { 
    $('input[type=text], textarea').addClass("idleField"); // reset all ## 
    $('input[type=text], textarea').live("focus", function(event){ 
     $(this).toggleClass("focusField idleField"); 
     if (this.value == this.defaultValue) { 
      this.value = ''; 
     } 
     if (this.value != this.defaultValue) { 
      this.select(); 
     } 
    }).live("blur", function(event){ 
     $(this).toggleClass("focusField idleField"); 
      if ($.trim(this.value) == ''){ 
      this.value = (this.defaultValue ? this.defaultValue : ''); 
     } 
    }); 
});
関連する問題