2012-01-17 16 views
3

私はjQueryの1.7を使用してのように、2個の異なるセレクター上の2つの異なるライブイベントに同じ機能をバインドする必要がありますよ:2セレクタ、2つの異なるイベント、同じ機能

function do_something(_this){ 
    // do something with _this 
    alert("test"); 
} 

$("input").live("keyup", function({ 
    do_something($(this)); 
}); 

$("select").live("change", function({ 
    do_something($(this)); 
}); 

これは動作しますが、私は希望何とかこれを何らかのステートメントにまとめることができれば本当に好きです。

// pseudo code 
($("input").live("keyup") || $("select").live("change")).bind(function(){ 
    // do something with $(this) 
    alert("test"); 
}); 

これは可能ですか?

+5

あなたは以前のバージョンがはるかに読み秒以下だと思いませんか? –

+0

真実ですが、もし私が優雅なソリューションを持っていれば、私はここで尋ねません:)私の擬似コードを例にして説明してください。 – jetsie

+0

私は実際に関数で$(これ)を使って何かをする必要があるので、私の質問を編集したので、私は単一のセレクタを好む理由です。私の最初の編集で完全にはっきりしなかったかもしれない何か... – jetsie

答えて

4

do_something()関数を直接関数.live()に入れて、匿名関数を避けることができます。それはいくつかの文字を節約します。 jQueryの1.7構文に変換するには

$("input").live("keyup", do_something); 
$("select").live("change", do_something); 

、あなたは(.live()があなたのためにやった)デリゲートを使用する必要があります。あなたの入力要素と選択要素がdocumentの場合は、<form>を使用できます。

$(document).on("keyup", "input", do_something); 
$(document).on("change", "select", do_something); 

そして、本当に1回の呼び出しでイベントとセレクタの両方を入れたい場合は、できます。とにかくあなたは同じ関数に行くので、デリゲートを使用しているので合計2つのイベントしかありません。実際に必要と思っている場合は、コールバックのイベントをチェックして、デモに表示されているようにセレクタに一致するイベントを確認することができます。

$(document).on("keyup change", "input, select", do_something); 

デモ:http://jsfiddle.net/ThinkingStiff/6ZUMa/

HTML:

<input /> 
<select> 
    <option>1</option> 
    <option>2</option> 
</select> 

スクリプト:jQueryの1.7のように、.live()方法は推奨されていることを

$(document).on('keyup change', 'input, select', do_something); 

function do_something(event) { 

    //this if() statement probably isn't needed for your purposes 
    if((event.type == 'keyup' && event.target.tagName.toLowerCase() == 'input') 
     || (event.type == 'change' && event.target.tagName.toLowerCase() == 'select')) { 

     //process event here 
     $('input').val(event.type); 

    }; 

}; 
+1

はい。また、 'live'の代わりに' on'を使う方がいいです(OPのjQuery 1.7を参照)。 –

+0

真実、それはいくつかのクラッタを削除します。それでも、私が望んでいた場所に私を得ることはできませんが、アイデアに感謝します。 – jetsie

+0

@RobW良い点。 – ThinkingStiff

0
$(".my_selector").live("keyup change", function({ 
    do_something(); 

});

これは、クラスにmy_selectrorクラスを追加する場合に有効です。

+0

これは2つのイベントを同じセレクタにバインドし、他のイベントは省略します。各セレクタは1つのイベントしか取得できません。 –

+0

ああ、私はそれを逃した。 – giker

-1

.liveメソッドは厳重に推奨されていません。 jQueryの1.7のよう http://api.jquery.com/live/

、.live()メソッドは推奨されています。イベントハンドラを添付するには、.on()〜 を使用します。古いバージョンのjQueryを使用する場合は、.live()より優先して .delegate()を使用する必要があります。フォーカスアウトイベント、任意の入力フィールドや選択項目がフォーカスを失ったとき、あなたが何かを行うことができます(つまり、ユーザと

$("input, select").on("focusout", function(){ 
    alert("focus lost on " + $(this).attr("id")); 
}); 

:.on()メソッドで

、あなたのようなことを行うことができます現在フォーカスされている別のアイテムに移動しました)。

+1

これはどのようにして質問に答えますか? –

+0

1.ポスターは非推奨の方法を使用しています。私はこれをメモし、基本的に同じ方法を使うことを提案するが、推奨されていません。 2.異なる2つのオブジェクトを2つの異なるイベントにバインドすることは、実際には1つのステートメントでは実行できません。 jQueryは両方のイベントを両方のアイテムにバインドするか、または1つのイベントを1つのアイテムにバインドすることをどのように知っていますか?あなたは一回の選択でそれをすることはできません。ただし、「フォーカスアウト」は、どちらの場合でも有効な有効なイベントです。次に、1つのイベントしか持たないので、同じイベントに関数をバインドすることができます。 – Flater

+0

@Flater 'change'は正常に動作しますが、理由のために' keyup'を使いたいと思います。 – kapa

4
$('input').on('keyup', do_something); 
$('select').on('change', do_something); 

注意。代わりに.on()を使用してイベントハンドラをアタッチします。古いバージョンのjQueryを使用する場合はを.live()より優先して使用する必要があります。あなたはlive()様機能が必要な場合

、使用:

$(document).on('keyup change', 'input, select', do_something); 
+0

+1は 'live()'が非難されていることにも言及しています。かなり長い間*推奨されていないにもかかわらず、人々がそれを使用をやめさせるのは難しいでしょう。 – kapa

+0

ありがとうございました。 – jetsie

+0

この形式の '.on()'は '.live()'と等価ではなく、 '.bind()'と同じです。 – ThinkingStiff

関連する問題