Как узнать, какой селектор является активным? - PullRequest
0 голосов
/ 24 января 2012

У меня есть следующий (частичный) код:

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

Хорошо, я хочу знать, как узнать, какой селектор активен, input1 или input2, внутри опции источника.Я пытался с $ (this) .attr ("id"), но он выбрасывает undefined.

Edition: в опции "select:", работает $ (this) .attr ("id")хорошо.

Ответы [ 3 ]

2 голосов
/ 24 января 2012

Поскольку вы используете автозаполнение пользовательского интерфейса jQuery, вы можете получить элемент из недокументированного свойства element в экземпляре автозаполнения:

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

Живой пример

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`
}
2 голосов
/ 24 января 2012

Этот обходной путь должен быть в порядке. В исходной функции плагина автозаполнения $ (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 голосов
/ 24 января 2012

Я думаю, что вам нужно $ (this.element) .attr ("id"). В плагине (и для любых обратных вызовов, которые вы передаете) это обычно относится к объекту виджета пользовательского интерфейса. Я полагаю, что цель состоит в том, чтобы стандартизировать пользовательские интерфейсы, чтобы, среди прочего, this.element ссылался на текущий узел DOM, какой бы пользовательский интерфейс не использовался.

...