Ответ 1
Кажется, что запускается вход для запуска.
$(".typeahead").eq(0).val("Uni").trigger("input");
Протестировано на странице .
Я использую Twitter typeahead.js(https://github.com/twitter/typeahead.js/) в поле ввода, которое предварительно заполняется из строки запроса. После загрузки страницы я хотел бы программно запускать отображение результатов typeahead без необходимости вводить текст в поле формы.
Из-за поля typeahead.js запускается только в том случае, если пользователь вручную вводит что-то в поле ввода, и я не могу найти какой-либо метод в typeahead.js, который я мог бы вызвать для запуска отображения результатов.
Любые указатели будут очень благодарны.
Спасибо!
Кажется, что запускается вход для запуска.
$(".typeahead").eq(0).val("Uni").trigger("input");
Протестировано на странице .
Согласно моим тестам (см. fiddle), метод focus() необходим для отображения выпадающего списка. Итак:
theVal = $('.typeahead').val();
$(".typeahead").typeahead('val', '')
$(".typeahead").focus().typeahead('val',theVal).focus();
Я действительно нуждался в этом, чтобы настоятельно рекомендовать пользователям выбирать из предложений Bloodhound, исходящих из API API геокодирования, чтобы я мог обеспечить, чтобы координаты были получены клиентом до отправки формы.
$(".typeahead").typeahead('lookup').focus();
с существующим значением ввода. вы можете изменить значение заранее, конечно
Как и Typeahead v0.10.1, изменение значения typeahead вызовет другой запрос и откроет раскрывающееся меню:
var val = $(".typeahead").typeahead('val');
$(".typeahead").typeahead('val', '');
$(".typeahead").typeahead('val', val);
Кому-то, кто нашел эту проблему с twitter typeahead после версии 0.11.1, вот как я решил ее с одной строкой:
$(".typeahead-input").typeahead('val', "cookie")
.trigger("input")
.typeahead('open');
Я использовал twitter bootstrap typeahead и прописал, что в фокусе откроется список предложений. Ответы здесь не совсем сработали для меня, поэтому я написал эту простую директиву (требуется jquery):
.directive('typeaheadFocusTrigger', function() {
return {
limit: 'A',
link: function(scope, element, attrs) {
$(element).on('focus', function(e) {
var $target = $(e.target);
var origVal = $target.eq(0).val();
$target.eq(0).val('').trigger('input')
.eq(0).val(origVal).trigger('input');
});
}
}
});
Теперь просто добавьте этот атрибут, и он активирует фокус
<input typeahead-focus-trigger typeahead="">
Использование: Typeahead v0.10.5
Не использовать:
$('.typeahead').typeahead('open');
В настоящее время это не работает. Источник: https://github.com/twitter/typeahead.js/issues/798. В качестве временного исправления используйте пользовательское событие jQuery keydown (после того, как вы создали экземпляр typeahead):
var ttInstance = $('.typeahead').typeahead( config ); // Create Typeahead
ttInstance.typeahead('val', 'pancakes'); // Set an initial value
var evt = jQuery.Event('keydown');
evt.keyCode = evt.which = 40;
ttInstance.trigger(evt); // Opens the dropdown
Просматривая исходный код, он, как представляется, сохраняет объект TypeaheadView
в данных элемента под ключом typeahead
. Этот объект TypeaheadView
имеет внутренний метод _showDropdown
, который внутренне связан с событием фокуса (и несколькими другими).
Я бы не рекомендовал это делать, но вы должны иметь возможность вызвать этот внутренний метод вручную:
$('#yourTypeaheadElement').data('typeahead')._showDropdown();
В качестве альтернативы вы просто попробовали просто сосредоточиться на элементе typeahead при загрузке страницы (после инициализации его как элемента typeahead, конечно):
// after page loads and yourTypeaheadElement is initialized as a typeahead
$('#yourTypeaheadElement').focus();
Ни один из них не будет работать, если вы не намеренно ставите "typeahead" в классы вашего входного тега. Если вы не чувствуете необходимости делать это (для этого не нужно работать), вам лучше использовать класс, написанный на входном теге, с помощью typeahead.js. Это ".tt-input". Вот пример, который я вырезал из Sam_Butler, перекодированный для нового класса CSS. Это работает для меня в самом современном стиле: 0.10.5:
var theVal = jQuery('.tt-input').val();
jQuery(".tt-input").typeahead('val', 're')
jQuery(".tt-input").focus().typeahead('val',theVal).focus();
Я взглянул на исходный код и нашел этот недокументированный способ:
var $myinput = $('#myinput');
$myinput.data('typeahead')._showDropdown()
Это должно работать со "старым" плагином типа bootstrap:
$(".typeahead").eq(0).trigger("keyup");
Не тестировали с IE, к сожалению... Не знаю о новом плагине typeahead...
Здесь упрощенная версия работы @Sam_Butler: http://jsfiddle.net/rimian/hrnf9
<button type="button" id="button">Crick</button>
<input type="text" id="text" class="typeahead">
JavaScript:
$('#button').click(function() {
$("#text").focus().typeahead('val', 'London');
});
// instantiate the bloodhound suggestion engine
var locations = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'https://maps.googleapis.com/maps/api/geocode/json?address=%QUERY&components=country:GB&sensor=false®ion=uk', //add key
filter: function (locations) {
return $.map(locations.results, function (location) {
return {
value: location.formatted_address
};
});
}
}
});
locations.initialize();
$('#text').typeahead(null, {
name: 'value',
displayKey: 'value',
source: locations.ttAdapter()
});
Для тех, кто думает о триггерных типах поведения вручную (например, при нажатии кнопки), я настоятельно рекомендую вам не делать этого.
Я пришел для этого решения, и я потерял почти целый день, чтобы обходные пути работали правильно (в моем случае это был щелчок на кнопке).
Для тех, кто действительно хочет пойти темным путем, я разделяю с вами свой уродливый код, который заставляет его работать:
//Removes default features of typeahead
//This means that typeahead will not work like an "autocomplete", it only will be trigged when the user Click in #btnSearch button!
var txt = $("#typeahead");
//Save input events in variables (we'll need them)
eventInput = $._data(txt[0], "events").input[0];
eventBlur = $._data(txt[0], "events").blur[1];
//Remove input events
txt.unbind("blur");
txt.unbind("input");
//Set click event that triggers typeahead features manually
$("#btnSearch").click(function () {
//Clears the cache of engine for it call ajax again, without it when the term was already searched the ajax is not called!
engine.clearRemoteCache();
txt.focus(); //When we click in a button, the focus from input is lost, so we set it again to not lose the behaviors of keyboard keys (up, down, tab, etc)
txt.bind("input", eventInput); //Bind the event that we had saved
txt.trigger("input"); //Trigger input (like the answer from @epascarello)
txt.unbind("input"); //Removes it again
});
//Set event on parent of the suggestion div, this makes the sugestion div close when user click outside it
$("body").click(function () {
if (eventBlur != undefined) {
if ($(".tt-dropdown-menu:visible").length > 0) {
eventBlur.handler(); //This event closes the suggestion menu
}
}
});
Еще одна вещь, которую я сделал, это изменить код события "_ checkInputValue" на typeahead.js. Я изменяю это:
areEquivalent = areQueriesEquivalent(inputValue, this.query);
:
areEquivalent = false;//areQueriesEquivalent(inputValue, this.query);
Я устанавливаю его в false, потому что typeahead не отправляет два одинаковых запроса на сервер. Это происходит, когда пользователь дважды нажимает кнопку поиска (я имею в виду, когда он ищет более одного раза тот же текст, который он уже искал). В любом случае, если вы используете локальные данные, вам не нужно это делать.
Это сработало для меня.
$( document ).ready(function() {
$('#the-basics .typeahead').typeahead({
hint: false,
highlight: true,
minLength: 0
},
{
name: 'states',
displayKey: 'value',
source: substringMatcher(states)
});
//set a value to input to trigger opening
$(".typeahead").eq(0).val("a").trigger("input");
//remove value for end user
$(".typeahead").eq(0).val("");
});
См. здесь, например: http://joshuamaynard.com/sandbox/autocomplete
Другие ответы были полезны, но не решили мою проблему. Это решение не требует настройки любого из angular -ui-кода и служит только для запуска typeahead для получения результатов при явном нажатии кнопки.
Чтобы сделать это, мне пришлось наложить текстовое поле поверх другого (отключенного) текстового поля, которое является фактическим с помощью typeahead. Никто не узнает, что другой есть, но он должен быть там для angular -ui, чтобы запустить меню в правильном месте. Вы не можете сделать это скрытым полем, потому что оно не сможет отобразить меню в правильном месте.
В приведенной ниже директиве будут отображаться переменные typeaheadText
и typeaheadTrigger
, чтобы заполнить разбитое поле, когда кнопка запускает это действие (установив триггер в значение true). Директива имеет изолированную область видимости, поэтому она не зависит ни от чего, кроме пропущенного.
directive('typeaheadTrigger', function() {
return {
require: ["ngModel"],
scope: {
typeaheadText: '=',
triggerFlag: '='
},
link: function(scope, element, attr, ctrls) {
scope.$watch('triggerFlag', function(value) {
if (scope.triggerFlag) {
ctrls[0].$setViewValue(scope.typeaheadText);
scope.typeaheadText = '';
scope.triggerFlag = false;
}
});
}
};
})
Контроллер устанавливает для этого несколько вещей - переменные триггера и текстового поля внутри объекта. Это демонстрирует, как это сделать - в идеале вы бы обернули все это в другую директиву, чтобы он мог использоваться в вашем приложении, скрывая детали.
Здесь plunk: http://plnkr.co/edit/UYjz6F5ydkMQznkZAlfx?p=preview
Я использовал это для ручного запуска выбора, когда в tt-наборе данных было 1 элемент. Это просто имеет смысл добавить это.
$("#mytypeahead").keyup(function (e) {
var charCode = (typeof e.which === "number") ? e.which : e.keyCode;
if (charCode == 13) {
if ($(this).parent().find(".tt-dataset").children().length == 1) {
//This is how we are submitting a single selection on enter key
$(this).parent().find(".tt-dataset").children(0).addClass("tt-cursor");
var kde = jQuery.Event("keydown");
kde.which = 13;
$(this).trigger(kde);
}
}
});
Я попробовал каждый метод здесь, но он не работал, только с помощью
$(".typeahead").val('hi').trigger('keyup');
$(".typeahead").val('hi').trigger('keydown');
Приведенный выше код работал у меня. Не знаю, что именно произошло, но использование ни одного не сработало, только с помощью обоих это сработало.