THE HAM MEDIA BLOG

$.fn.〜で選択したセレクタ利用して、.live()を実現

Clip to Evernote このエントリーをはてなブックマークに追加
カテゴリ:
jQuery
タグ:
jquery
ON
live

昨日『jQueryで選択したセレクタをハンドラ内で確認』というエントリーを書いたのですが、これを使えば独自メソッド内でliveのイベントを付けたい時にセレクタを簡単に使えると思ったので、昨日に続きメモエントリー。

.live(function(){})は$(document).on('Event','Selector',function(){})

jQuery 1.7での.live()は.on()に統合されています。同じように書くには、

$(document).on('Event','Selector',function(){
    //何か処理
});

この様に書く必要があります。

$.fn.◯◯〜のようなプラグインを作成して、プラグイン内部で.live()を使わずに.on()で同様の機能を得るためには、選択しているセレクタを書き入れる必要があります。そのため、利用しているセレクタの文字列が必要になったのです。

では簡単に、クリックした要素のテキストをアラートで表示するプラグインを書いてみましょう。

(function($){
    $.fn.alertSelector = function(){
        $(document).on('click',this.selector,function(){
            alert($(this).text());
        });
    };
})(jQuery);
jQuery(function($){
    $('#demo1 p').alertSelector();
    
    //要素の追加
    $('#demo1 button').on('click',function(){
        $('<p>クリックでアラート表示(alert($(this).text());)</p>').appendTo('#demo1');
    });
});

クリックでアラート表示(alert($(this).text());)

意図通りに、最初からあるp要素だけでなく、追加されたp要素でもアラートが出るようになっています。

これがベストな書き方かどうかはわかりませんが、とりあえずプラグインとしても動作します。

.live()ではなく、.delegate()での置き換えの場合、範囲を絞り込むセレクタをもう一つどこかに保持して、それを利用するようにする必要があります。ですが、今回は割愛しておきます。

.each()で作成してみる

では、今度はプラグインを.each()を使って作成してみます。

(function($){
    $.fn.alertSelectorEach = function(){
        return this.each(function(){
            $(this).on('click',function(){
                alert($(this).text());
            });
        });
    };
})(jQuery);
jQuery(function($){
    $('#demo2 p').alertSelectorEach();
    
    //要素の追加
    $('#demo2 button').on('click',function(){
        $('<p>クリックでアラート表示(alert($(this).text());)</p>').appendTo('#demo2');
    });
});

クリックでアラート表示(alert($(this).text());)

この書き方だと、最初からある要素ではアラートが表示されますが、追加した要素ではクリックしてもアラートがでません。

追加した要素にもイベントを付けておきたい場合などは、先程のような書き方をするのがよさそうです。

最後に

ちょっと前にもつぶやいたのですが、プラグインを作る上で、イベントを.live()や.delegate()でもたせておくのと、.each()で取得した要素のみにbindするのでは、どちらがいいのか現時点で把握できていません。もし使用する際は、そのへんは考えて作成するようお願いします。今回のが特別いい!という訳でもないので、ご理解ください。あくまでも、どのようにするかメモエントリー。

参考サイト:
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

トップに戻る

×

この広告は90日以上新しい記事の投稿がないブログに表示されております。