2012-01-24 60 views
0

我有以下的(部分)代碼:如何知道哪個選擇器是活動的?

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

好吧,我想知道我怎麼能知道哪個是選擇積極的,輸入1或輸入2,源選項裏面。我嘗試過使用$(this).attr(「id」),但它會引發undefined。

版本:在「select:」選項中,$(this).attr(「id」)正常工作。

+0

其中的jquery自動完成插件是你在用嗎? – ustun

+0

jquery ui自動完成,但我懷疑它不管... – elvenbyte

+0

@elvenbyte:這將很重要,答案完全取決於autocompleter插件的實現。 –

回答

2

當你使用jQuery UI autocompleter,你可以從無證element屬性的元素有關的autocompleter實例:

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值。但這是一個小問題。是的,上述確實最終創建了兩個函數對象,但這並不是什麼壞事。如果有大量的參與代碼和你擔心有它的兩個副本在內存中(這是幾乎可以肯定不是問題),只是有函數調用到另一個函數:

$("#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

是的,你是對的,但問題是這是一個很長的代碼,我只想改變一個句子。我不想重複這兩個選擇器的代碼...我會盡量嘗試... – elvenbyte

+0

不,它不會進入該功能,因爲我沒有相應的事件關聯... – elvenbyte

+0

有是jquery對象中的「選擇器」屬性,但我相信你不能得到它,因爲$(this)對象不是你正在尋找的jquery對象。值得嘗試。 – SadullahCeran

0

我想你需要的是$(this.element).attr(「id」)。在插件內(以及您傳入的任何回調)通常指的是UI控件對象。我相信這樣做的目標是使ui小部件標準化,以便除其他事項外,此e.element將引用當前DOM節點,無論您使用的是哪個ui小部件。

+0

不,這不是我正在尋找的元素。但我同意你的看法。 「this」總是指代當前的DOM節點。 – elvenbyte

+0

@elvenbyte:是的,但沒有記錄。'this'是自動完成器實例,'this.element'是自動完成器使用的元素周圍的jQuery包裝器。詳情請參閱我的回答。並同意,「這真的應該是元素,而不是自動完成者。 –

+0

我認爲這最好是指小部件實例而不是dom元素,因爲這樣可以直接訪問所有小部件的屬性和DOM元素。如果「this」是DOM元素,您必須使用類似$(this).data(「plugin_ui_autocomplete」)的東西來訪問實際小部件 – wheresrhys

相關問題