Я нашел в способ получить информацию, которую вы ищете, но мы надеемся, не лучший способ или единственный способ.
$(this).autocomplete({
select: function(event, ui){
// blah
},
open: function(event, ui) {
console.log($(this).next().next().children());
}
});
open event является «Срабатывает, когда меню предложение открыт или обновлен.» В этот момент виджет автозаполнения создал элементы dom со своими собственными кликами для выбора сразу после <input>
, к которому прикреплен автозаполнение. (Существует также <span>
, поэтому я дважды вызываю .next()
.) Но эта строка кода в функции open вернет вам список дочерних узлов <li>
на <ul>
, который создается внутри.
Matching против вашего примера, вы получите набор JQuery из <li>
элементов для следующего HTML-разметки:
<li class="ui-menu-item" role="presentation">
<a id="ui-id-0" class="ui-corner-all" tabindex="-1">apple</a>
</li>
<li class="ui-menu-item" role="presentation">
<a id="ui-id-1" class="ui-corner-all" tabindex="-1">pear</a>
</li>
<li class="ui-menu-item" role="presentation">
<a id="ui-id-2" class="ui-corner-all" tabindex="-1">orange</a>
</li>
Важное примечание:id
тег здесь не является числовой индекс элементов. Это вместо этого абсолютный идентификатор элемента в исходном источнике. Таким образом, у вас нет гарантии, что они последовательны. В качестве примера, если исходный источник на самом деле это: ["apple", "banana", "pear", "starfruit", "grape", "orange"]
, то идентификаторы <a>
тегов для результирующих данных на самом деле будут яблоками: ui-id-0
, груша: ui-id-2
, оранжевый: ui-id-5
. Вы не можете полагаться на этот идентификатор, чтобы дать вам заказ элемента, который пользователь нажал в списке, так как он равен абсолютным по отношению к источнику вместо относительно набора результатов.
(я первоначально имел идентификаторы в моем списке, начиная с 1, который, как Hogan указывает, что они начинаются с 0.)
В этот момент, вы можете сделать один из двух вещей, чтобы получить вам отдых кстати. Первый заключается в том, чтобы хранить коллекцию (необработанную или преобразованную, как и в формате объекта) в некоторой переменной, которая будет в области в обратном вызове события . Я бы рекомендовал преобразование списка в объект, как следующее:
lastResultSet = {
apple : 1,
pear : 2,
orange : 3
}
Тогда ваш .select
код мог бы просто сделать это:
var selectedIndex = lastResultSet[$(this).val(ui.item.value)];
Другой подход заключается в том, чтобы установить свои собственные .click
обратные вызовы на <li><a>
dom для захвата индекса в этой точке. Я не рекомендую это, потому что вы можете легко вмешиваться в поведение автозаполнения или вызывать утечку памяти, не доставляя обработчики кликов несвязанными и удаляемыми до того, как автодополнение будет уничтожено домом <li>
.
Независимо от того, я предлагаю вам задать тот же вопрос на jQuery UI forums or IRC support channel, и, надеюсь, кто-то может получить вам ответ, который не так хвалит полагаться на подразумеваемый порядок элементов Dom.
Вы пытаетесь найти количество предметов в поле выбора? – kennypu
Нет. Я пытаюсь получить количество элементов из выделения. – user1761160
Можете ли вы показать источник виджета автозаполнения? Вы можете получить «значение» выбора, но это, вероятно, не то, что вы хотите. Я предполагаю, что вы хотите, чтобы индекс в активном результирующем наборе, когда был сделан выбор? –