#javascript #android #jquery #ajax
#javascript #Android #jquery #ajax
Вопрос:
Я разрабатываю веб-приложение с текстовым вводом, которое предоставляет предложения через динамический список данных. В мобильном Chrome для Android у меня периодически, но часто повторяются первые 3 или 4 буквы, введенные во ввод. Похоже, что такое поведение проявляется в основном, когда я быстро вводю ввод после загрузки страницы.
Вот видео проблемы на YouTube (вероятно, оно поможет вам увидеть нажатия клавиш, если вы смотрите его в замедленном режиме … 0,5x или 0,25x).
Параметры datalist заполняются следующим образом: oninput
вызывает функцию javascript, отправляющую значение input
‘s через ajax в php-скрипт. Этот php-скрипт SELECT
обрабатывает результаты из базы данных MySQL, которые соответствуют input
значению. Результаты echo
возвращаются на исходную страницу в <option>
тегах. Я не включил никаких функций, которые изменяют значение input
s на основе запроса. Единственными затронутыми элементами являются <option>
буквы s в <datalist>
.
Я не заметил такого поведения при других вводах текста на моем сайте, и главное input
, что отличает это, — это вызов ajax. Я также не смог воспроизвести это поведение на рабочем столе, даже при эмуляции мобильных устройств с помощью DevTools. Иногда у меня очень странное поведение клавиатуры на моем телефоне Android при использовании некоторых собственных приложений, таких как, например, Facebook Messenger, но я чувствую, что этот пример не связан. Я использовал как LG Keyboard, так и Google Gboard, и проблема возникает с обоими.
HTML
<body>
<form id="regform" method="post" action="submit.php">
<legend>Input?</legend>
<input type="text" required="true" id="inp" name="inp" placeholder="input" oninput="sendquery();" list="options" autofocus />
<datalist id="options">
</datalist><input type="submit" value="Submit" />
</form>
</body>
JAVASCRIPT
<script>
function sendquery() {
var sendstr = $('#inp').val();
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 amp;amp; this.status == 200) {
$('#options').html(this.responseText);
}
};
xhttp.open("GET", "getoptions.php?str=" sendstr, true);
xhttp.send();
}
</script>
Я не думаю, что мой CSS или PHP вызывают проблему, поэтому я пока опускаю это.
Очевидно, что желаемое поведение заключается в том, что каждое нажатие клавиши приводит к тому, что этот символ вводится во ввод один раз. Кроме того, для datalist предоставить сужающийся список предложений. Если я печатаю несколько медленнее, чем предпочитаю, это то, что происходит (или, по крайней мере, я не заметил этого при медленном наборе текста).
Что может быть причиной этого?
Комментарии:
1. Я предлагаю вам не выполнять вызовы XHR при прослушивании событий ввода или, по крайней мере, отменить обратный вызов, чтобы предотвратить перегрузку запроса. Возможно, это и есть причина проблемы. Проверьте, как отменить функцию здесь levelup.gitconnected.com /…
2. @MaxiDiaz это хорошее предложение, несмотря ни на что, но оно не решило мою проблему, когда я его реализовал.