Как вы запускаете событие выбора автозаполнения вручную в jQueryUI?

Я использую автозаполнение jQueryUI, и у меня есть функция, сопоставленная с событием выбора, например:

$("#someId").autocomplete({
    source: someData,
    select: function (event, ui) { ... },
    focus: function (event, ui) { ... }
});

У меня есть особый случай: пользователь сосредоточился на элементе в раскрывающемся списке автозаполнения (но не выбрал его), и мне нужно инициировать событие выбора вручную из другой функции. Это возможно? Если да, то как?


person Jon Lemmon    schedule 03.10.2011    source источник


Ответы (10)


Вот что сработало для меня:

$(this).data('ui-autocomplete')._trigger('select', 'autocompleteselect', {item:{value:$(this).val()}});
person temuri    schedule 20.06.2013
comment
хороший, есть ли лучшее решение? - person Developerium; 12.11.2013
comment
Отлично! это единственное решение, которое фактически запускает событие, а не просто имитирует взаимодействие пользователя с пользовательским интерфейсом. - person yossi; 11.02.2014
comment
Это лучше, чем выбранный ответ, потому что он передает важные данные пользовательского интерфейса. - person SemanticZen; 15.07.2014
comment
Ошибка: невозможно получить свойство _trigger неопределенной или нулевой ссылки - person Joseph Norris; 26.06.2015
comment
@JosephNorris Вместо этого попробуйте... $(this).data('autocomplete')._trigger('select', 'autocompleteselect', {item:{value:$(this).val()}}); - person Ian Warburton; 03.10.2018
comment
Мне нужно было изменить «значение» на «id», иначе ui.item.id не определено. - person Ian Warburton; 04.10.2018
comment
Если у вас возникла та же проблема, что и у Джозефа Норриса (невозможно прочитать свойство '_trigger' неопределенного), попробуйте console.log($(this).data());. В моем случае это было «customTableAutocomplete». - person kurdtpage; 03.12.2019

Вы можете сделать:

$("#someId").trigger("autocompleteselect");
person Nicola Peluchetti    schedule 03.10.2011
comment
Это потому, что это будет работать, только если события связаны с $().on('autocompleteselect'), а не связаны с построением с $().autocomplete({select:function() {}}). Используйте $().data('autocomplete')._trigger(), затем - person HenningCash; 27.02.2013
comment
Можете ли вы объяснить больше, как выбрать параметр в выборе? - person Developerium; 12.11.2013

Вы можете сделать это так, как команда jQuery делает это в своих модульных тестах - см. этот ответ

person Rune Vejen Petersen    schedule 21.03.2013

Просто вызовите следующую функцию

setAutocomplete("#txt_User_Name","rohit");

function setAutocomplete(autocompleteId,valuetoset)
    {
        $(autocompleteId).val(valuetoset);
        $(autocompleteId).autocomplete("search", valuetoset);
        var list = $(autocompleteId).autocomplete("widget");
        $(list[0].children[0]).click();
    }
person Rohit More    schedule 27.06.2017
comment
Мне пришлось добавить к этому тайм-аут, так как мой поиск не был завершен вовремя (это вызов ajax) - person Matt Kemp; 12.11.2017

1 линейное решение

$('.ui-menu-item .ui-corner-all:contains(\"123")').autocomplete({autoFocus:true}).mouseenter().click()
person cegprakash    schedule 27.11.2013
comment
Использование .mouseenter().click() помогло мне правильно выбрать элемент из результатов - person Luksurious; 01.11.2016

Если мы хотим инициировать поиск чего-то конкретного:

$('#search-term').autocomplete('search', 'searching term');

или просто

$('#search-term').autocomplete('search');

$('#search-term').autocomplete({
    ...
    minLength: 0, // with this setting
    ...
});
person Alliswell    schedule 14.03.2016

Снаружи:

$($('#someId').data('autocomplete').menu.active).find('a').trigger('click');

Пример настройки срабатывания select при нажатии клавиш с горизонтальными стрелками внутри события автозаполнения «open»:

$('#someId').autocomplete({
    open: function(event, ui) {
        $(this).keydown(function(e){
            /* horizontal keys */
            if (e.keyCode == 37 || e.keyCode == 39) {
               $($(this).data('autocomplete').menu.active).find('a').trigger('click');
            }
        });
    }
});

К сожалению, этот хороший способ решить эту проблему, отмеченную как «успех», не работал в моем приложении в хроме 140.0.835.200.

person palmic    schedule 07.12.2011

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

$(this).data('ui-autocomplete').options.select(event, ui);

где я использую это

/**
 * The jQuery UI plugin autocomplete
 */
$.widget( "ui.autocomplete", $.ui.autocomplete, {
   options: {
      close: function( event, ui ) {
         if (typeof event.currentTarget == 'undefined') {
            $(this).val("");
            $(this).data('ui-autocomplete').options.select(event, ui);
         }
      }
   }
 });
person user7793758    schedule 24.10.2019

Я нашел очень простой способ заставить его работать. Ответы выше не работали для меня.

Мое определение ввода:

<div class="search_box">
<input type="text" class="inp disabled" id="search-user-id" placeholder="Search by user name or email" />
</div>

Определение автозаполнения:

$('#search-user-id').autocomplete({
    minChars: 3,
    paramName: 'searchTerm',
    deferRequestBy: 200, // This is to avoid js error on fast typing
    serviceUrl: '${pageContext.request.contextPath}/settings/reset/psw/query',
    type: 'POST',
    onSelect : function(suggestion) {
        showUserData(suggestion.dto);
    }, 
    onSearchError: function (query, jqXHR, textStatus, errorThrown) {
        $('.cev-error-fields.reset-password').find('.error_msg').text(errorThrown).show().fadeOut(7000);
    }
}); 

Запустите его: я запускаю ajax, определенный на другой странице, я не помещаю ajax здесь для простоты. Внутри ответа ajax я просто запускаю его следующим образом:

        $('#search-user-id').val(username);
        $('#search-user-id').focus();

Это сработало.

person lauer    schedule 10.12.2016

person    schedule
comment
действительно застрял с этим, большое спасибо, я использовал его для запуска изменения, например, $('#someId').data('uiAutocomplete')._trigger('change'); - person NinaNa; 31.08.2014