Выбор опции HTML datalist не вызывает событие поиска
Я разрабатываю поисковую систему для веб-сайта; сейчас она отлично работает и реагирует на вводимые ключевые слова поиска без каких-либо проблем при взаимодействии с локальным веб-сервером (основанным на Django). Проблема (на самом деле их две, но я представляю здесь только одну) заключается в списке данных. Когда я выбираю вариант из списка, хотя он попадает в поле ввода поиска, ничего не происходит, пока я не нажимаю кнопку submit.
Я написал слушателя событий для каждого варианта, но я явно что-то упускаю (важное). Вот мой минимальный рабочий код:
HTML
<form id="search-form" action ="{% url 'search' %}" method='POST'>
{% csrf_token %}
<input id="enter" type="search" list="options" name="query" />
<datalist id="options">
<option class="option" value="Happy">
<option class="option" value="Puzzled">
</datalist>
<button id="go" type="submit"><strong>🔎︎</strong></button>
<button id="reset" type="reset"><strong>X</strong></button>
</form>
JavaScript
<script>
const searchForm = document.getElementById('search-form');
const enter = document.getElementById('enter');
let options = document.querySelectorAll(".option");
options.forEach((item, index) => {
item.addEventListener("click", () => {
return searchForm.action;
})
})
</script>
Возможно, событие должно быть каким-то другим; я пробовал "keydown" и щелчок дважды, но ничего не помогло.
Попробуйте использовать событие input
, срабатывающее на элементе ввода. Свойство data
события ввода отображает только последнее добавление к значению ввода при щелчке на опции, вводе или вставке, в то время как свойство value
отображает все введенные значения. Проверьте это во фрагменте.
Слушатели событий на элементах опций никогда не вызываются - вероятно, лучше оставить их без внимания.
"use strict";
const enter = document.getElementById('enter');
let options = document.querySelectorAll(".option");
options.forEach((item, index) => {
item.addEventListener("click", () => {
console.log("clicked option ", this.value);
return searchForm.action;
})
// debug:
enter.oninput = e=>console.log('event.data: %s, enter.value: %s',e.data,enter.value);
})
<form id="search-form" action ="" method='' onsubmit="console.log(event);return false">
<input id="enter" type="search" list="options" name="query" />
<datalist id="options">
<option class="option" value="Happy">
<option class="option" value="Puzzled">
</datalist>
<button id="go" type="submit"><strong>🔎︎</strong></button>
<button id="reset" type="reset"><strong>X</strong></button>
</form>
В ответ на мой вопрос вот решение, которое я адаптировал из статьи Кита (2020) и которое сработало для меня:
JavaScript
const enter = document.getElementById('enter');
document.querySelectorAll('#enter[list]').forEach( function (formfield) {
var options = document.getElementById('options');
var lastlength = formfield.value.length;
var checkInputValue = function (inputValue) {
if (inputValue.length - lastlength > 1) {
options.querySelectorAll('option').forEach( function(item) {
if (item.value === inputValue) {
formfield.form.submit();
}
});
}
lastlength = inputValue.length;
};
formfield.addEventListener('input', function () {
checkInputValue(this.value);
}, false);
});
Ссылка:
Keith, J. (2020) Submitting a form with datalist. Available from: https://adactio.com/journal/17337 [Accessed October 31, 2022]