2012-01-24 38 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

相关问题