2012-01-24 12 views
0

私は、次の(部分)コード持っている:どのセレクタがアクティブなセレクタであるかを知るには?

$("#input1, #input2").autocomplete({ 
    source:function(request, response) { 
    ... 
    }, ...); 

を[OK]を、私はsourceオプションの内側に、セレクタアクティブ、INPUT1またはINPUT2であるかを知ることができる方法を知りたいです。私は$(this).attr( "id")で試しましたが、未定義です。

Edition: "選択:"オプションで、$(this).attr( "id")は正常に動作します。

+0

jqueryのオートコンプリートのプラグイン:そこに関わる多くのコードだと、あなたが(ほぼ確実ではない問題である)、メモリにそれの2つのコピーを持っていることについて心配している場合は、単に別の関数に関数呼び出しを持っていますあなたは使っていますか? – ustun

+0

jquery ui autocompleteしかし、私はそれが問題ではないと思われます... – elvenbyte

+0

@elvenbyte:それは多くの場合、答えは完全にオートコンプリートプラグインの実装に依存します。 –

答えて

2

あなたはjQueryのUIの自動入力補完を使用しているとして、あなたは自動入力補完インスタンス上element文書化されていないプロパティから要素を取得することができます:

source: function(request, response) { 
    if (this.element && this.element[0]) { 
    display("source triggered for #" + this.element[0].id); 
    } 
} 

Live example

this.element jQueryのラッパーですオートコンプリータがアタッチされている要素のため、this.element[0]は未処理のDOM要素です。

しかし、文書化されていない情報を使用することは常に危険です。ドットリリースの間に変更または離脱する可能性があります。 SadullahCeranが提案したクロージャーを使用する方が信頼性が高くなります。私は若干異なり、それを行うだろう:

$("#input1, #input2").each(function(){ 
    var $element = $(this); // `element` is a jQuery wrapper around the element 
    $(element).autocomplete({ 
    source:function(request, response) { 
    // get the options relevant to `element` 
    }); 
}); 

...あなたはid値を使用してに頼っていないという理由だけで。しかしそれは小さな点です。そして、上記のように2つの関数オブジェクトを作成することになりますが、それはそれほど悪いことではありません。ある

$("#input1, #input2").each(function(){ 
    var $element = $(this); // `element` is a jQuery wrapper around the element 
    $(element).autocomplete({ 
    source:function(request, response) { 
    return getOptionsFor(element, request, response); 
    }); 
}); 
function getOptionsFor(element, request, response) { 
    // get the options for `element` 
} 
+0

ありがとうございます。 – elvenbyte

2

この回避策は問題ありません。 オートコンプリートプラグインのソース関数では、$(this)は元のjqueryオブジェクトを参照していない可能性があります。

$("#input1, #input2").each(function(){ 
    var id = $(this).attr('id'); 
    // Do something with id if you want 
    $(this).autocomplete({ 
    source:function(request, response) { 
    // Source function 
    }); 
}); 
+0

はい、そうですが、問題はそれが本当に長いコードなので、1つの文章を変更したいだけです。私は両方のセレクタのコードを繰り返す必要はありません...私はとにかくそれを試してみます... – elvenbyte

+0

いいえ、対応するイベントが関連付けられていないため、機能を入力しません... – elvenbyte

+0

There jqueryオブジェクトの "selector"属性ですが、$(this)オブジェクトは探しているjqueryオブジェクトではないので、取得できないと確信しています。試してみる価値がある。 – SadullahCeran

0

あなたが必要とするのは、$(this.element).attr( "id")です。プラグイン(およびあなたが渡したコールバック)の中で、これは一般にUIウィジェットオブジェクトを参照します。私は、あなたが使用しているウィジェットのいずれかが現在のDOMノードを参照するように、UIウィジェットを標準化することを目的としています。

+0

いいえ、それは私が探している要素ではありません。しかし、私はあなたに同意します。 "this"は常に現在のDOMノードを参照する必要があります。 – elvenbyte

+0

@elvenbyte:はい、そうですが、文書化されていません。'this'はオートコンプリータインスタンスで、' this.element'はオートコンプリートが使用する要素の周りのjQueryラッパーです。詳細は私の答えを見てください。そして、「これは本当に要素であり、オートコンプリートではない」ということに同意した。 –

+0

私はそれがウィジェットのプロパティとDOM要素に直接アクセスできるように、ウィジェットインスタンスではなくdom要素を参照するのが最善だと思います。 "this"がDOM要素の場合、$(this).data( "plugin_ui_autocomplete")のようなものを使用して実際のウィジェットにアクセスする必要があります – wheresrhys

関連する問題