2012-03-19 3 views
1

Могу ли я использовать атрибут данных для источника моего автозаполнения?Автозаполнение с использованием атрибута данных для источника?

, например

HTML

<input type="text" class="autocomplete" data-source="/search.php" /> 

Javascript

$(".autocomplete").autocomplete({ 
     source : $(this).data('source'), 
     minLength:1, 
     select: function(event, ui) { 
      console.log(ui.item ? 
       "Selected: " + ui.item.value + " aka " + ui.item.id : 
       "Nothing selected, input was " + this.value); 
     } 
    }); 

Я попробовал это, но это всегда дает мне ошибку. Что случилось с моим кодом?

Uncaught TypeError: Property 'source' of object #<Object> is not a function

+0

Это не является хорошим решением. При каждом нажатии клавиши вы повторно инициализируете виджет автозаполнения, что означает даже после умеренного использования, сотни слушателей событий будут добавлены к каждому элементу '.autocomplete'. Я настоятельно рекомендую вам использовать другое решение. (Возможно, один из трех перечисленных ниже?) – Xavi

+0

Если вы его исправили, напишите _answer_. Ответы не входят в вопросы. –

ответ

5

вот затруднительное положение

$('.autocomplete').keypress(function(){ 
    $(this).autocomplete({ 
     source: $(this).data('source'), 
     minLength: 1, 
     select: function(event, ui) { 
      console.log(ui.item ? "Selected: " + ui.item.value + " aka " + ui.item.id : "Nothing selected, input was " + this.value); 
     } 
    }); 
}); 

Я добавил функцию нажатия, так что он будет получить текущий элемент.

+0

Отличное решение, всегда задавался вопросом, как это сделать. Лично я заменил .each в противном случае (предположительно), вся автозаполнение получает отскок при каждом нажатии клавиши. –

+1

Так что это довольно плохо, так как он каждый раз запускает элемент управления автозаполнением, когда в этом поле нажата клавиша. Вы можете просто получить '$ ('. Autocomplete'). Data ('source')' отдельно, а затем передать это для автозаполнения. – Milimetric

1

this указатель не относятся к элементу .autocomplete - this только равно выбранный элемент внутри обратных вызовов, выполняемых с помощью JQuery. Похоже, что вы хотите сделать что-то вроде этого:

$(".autocomplete") 
    .autocomplete({ 
     minLength:1, 
     select: function(event, ui) { 
      console.log(ui.item ? 
       "Selected: " + ui.item.value + " aka " + ui.item.id : 
       "Nothing selected, input was " + this.value); 
     } 
    }) 
    .each(function() { // Goes through `.autocomplete` elements and sets source 
     $(this).autocomplete("option", "source", $(this).data('source')); 
    }) 
; 
+0

работает, но получает все возвращаемые значения источника. – rjmcb

+2

Я не уверен на 100%, что вы имеете в виду, но это звучит как проблема на стороне сервера. Убедитесь, что вы являетесь серверным кодом, который фильтрует ваш список по значению в параметре запроса url, называемом 'term'. – Xavi

1

каждое нажатие клавиши автозаполнения вызовет удаленный запрос, если источник является URL. что вы можете сделать, чтобы предотвратить «предварительную выборку» данных (обязательно верните массив JSON-valid), а затем добавьте возвращаемые данные в качестве источника для автозаполнения. Таким образом, данные извлекаются только один раз, и автозаполнение ссылается на эти данные.

jQuery autocomplete уже имеет возможность фильтрации. вам просто нужен полный список элементов, и он будет фильтровать его для вас.

//get all input boxes with class "autocomplete" 
$('.autocomplete').each(function(){ 

    //reference input and get it's url 
    var input = $(this); 
    var url = input.data('source'); 

    //get list array only ONCE for each input using their specified urls 
    $.get(url, function(data) { 

     //when request is received, add autocomplete using the returned data 
     input.autocomplete({ 
      source: data, 
      minLength: 1, 
      select: function(event, ui) { 
       console.log(ui.item ? "Selected: " + ui.item.value + " aka " + ui.item.id : "Nothing selected, input was " + this.value); 
      } 
     }); 
    }); 
}); 
+0

спасибо, но у меня много элементов автозаполнения. он получает только источник данных первого элемента – rjmcb

+0

, чтобы найти все входы '.autocomplete' – Joseph

7

В источнике можно использовать this.element, который относится к входу

$(".autocomplete").autocomplete({ 
    source : this.element.attr('data-source'), 
    minLength:1, 
    select: function(event, ui) { 
    console.log(ui.item ? 
      "Selected: " + ui.item.value + " aka " + ui.item.id : 
      "Nothing selected, input was " + this.value); 
    } 
}); 
+0

Хороший ответ. Nice и simple :-) –

+0

В моем контексте 'this' относится к элементу окна, поэтому это решение не работает. Я хочу избежать обращения к источнику данных, не обращаясь к классу .autocomplete. – gitb

Смежные вопросы