Google автозаполнение-введите, чтобы выбрать
У меня есть Автозаполнение Google настройка для текстового поля HTML-формы, и он работает отлично.
однако, когда появляется список предложений, и вы используете стрелки для прокрутки и выбора с помощью enter, он отправляет форму, хотя все еще есть поля для заполнения. Если вы нажмете, чтобы выбрать предложение он работает нормально, но нажав введите подчиняется.
Как я могу контролировать это? Как я могу остановить ввод от отправки формы, и вместо этого будет выбор предложения из автозаполнения?
спасибо! {S}
7 ответов:
можно использовать
preventDefault
чтобы остановить отправку формы при нажатии enter, я использовал что-то вроде этого:var input = document.getElementById('inputId'); google.maps.event.addDomListener(input, 'keydown', function(event) { if (event.keyCode === 13) { event.preventDefault(); } });
использование обработки событий Google кажется правильным решением, но это не работает для меня. Это решение jQuery работает для меня:
$('#inputId').keydown(function (e) { if (e.which == 13 && $('.pac-container:visible').length) return false; });
.pac-container
- это div, который содержит совпадения автозаполнения. Идея заключается в том, что когда совпадения видны, клавиша Enter просто выберет активное совпадение. Но когда совпадения скрыты (т. е. место было выбрано), он отправит форму.
Я объединил первые два ответа от @sren и @mmalone, чтобы произвести это:
var input= document.getElementById('inputId'); google.maps.event.addDomListener(input, 'keydown', function(e) { if (e.keyCode == 13 && $('.pac-container:visible').length) { e.preventDefault(); } });
отлично работает на странице. предотвращает отправку формы, когда контейнер предложений (.Пак-контейнер) - это видно. Итак, теперь опция из выпадающего списка автозаполнения выбирается, когда пользователи нажимают клавишу enter, и они должны нажать ее снова, чтобы отправить форму.
моя главная причина для использования этого метода в том, что я обнаружил, что если форма отправлена как только опция выбрана, с помощью клавиши enter, значения широты и долготы не были переданы достаточно быстро в их скрытые элементы формы.
все заслуги перед оригинальными ответами.
проблема, которую я имел с ответом @sren, заключалась в том, что он всегда блокирует событие submit. Мне понравился ответ @mmalone, но он вел себя случайным образом, как иногда, когда я нажимаю
ENTER
чтобы выбрать расположение, обработчик выполняется после того, как контейнер скрыт. Итак, вот что я в конечном итоге делаетvar location_being_changed, input = document.getElementById("js-my-input"), autocomplete = new google.maps.places.Autocomplete(input), onPlaceChange = function () { location_being_changed = false; }; google.maps.event.addListener( this.autocomplete, 'place_changed', onPlaceChange ); google.maps.event.addDomListener(input, 'keydown', function (e) { if (e.keyCode === 13) { if (location_being_changed) { e.preventDefault(); e.stopPropagation(); } } else { // means the user is probably typing location_being_changed = true; } }); // Form Submit Handler $('.js-my-form').on('submit', function (e) { e.preventDefault(); $('.js-display').text("Yay form got submitted"); });
<p class="js-display"></p> <form class="js-my-form"> <input type="text" id="js-my-input" /> <button type="submit">Submit</button> </form> <!-- External Libraries --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script src="//maps.googleapis.com/maps/api/js?sensor=false&libraries=places"></script>
флаг гарантирует, что если местоположение изменяется и пользователь нажимает enter, событие блокируется. В конце концов флаг устанавливается в
false
по карте googleplace_changed
событие, которое затем позволяет отправить форму при нажатии клавиши enter.
Это один работал для меня:
google.maps.event.addDomListener(input, 'keydown', e => { // If it's Enter if (e.keyCode === 13) { // Select all Google's dropdown DOM nodes (can be multiple) const googleDOMNodes = document.getElementsByClassName('pac-container'); // Check if any of them are visible (using ES6 here for conciseness) const googleDOMNodeIsVisible = ( Array.from(googleDOMNodes).some(node => node.offsetParent !== null) ); // If one is visible - preventDefault if (googleDOMNodeIsVisible) e.preventDefault(); } });
может быть легко преобразован из ES6 в любой совместимый с браузером код.
я подправил код Алекса, потому что он сломался в браузере. Это работает идеально подходит для меня:
google.maps.event.addDomListener( document.getElementById('YOUR_ELEMENT_ID'), 'keydown', function(e) { // If it's Enter if (e.keyCode === 13) { // Select all Google's dropdown DOM nodes (can be multiple) const googleDOMNodes = document.getElementsByClassName('pac-container'); //If multiple nodes, prevent form submit. if (googleDOMNodes.length > 0){ e.preventDefault(); } //Remove Google's drop down elements, so that future form submit requests work. removeElementsByClass('pac-container'); } } ); function removeElementsByClass(className){ var elements = document.getElementsByClassName(className); while(elements.length > 0){ elements[0].parentNode.removeChild(elements[0]); } }
Я пробовал приведенные выше короткие ответы, но они не работали для меня, а длинные ответы я не хотел их пробовать, поэтому я создал следующий код, который работал довольно хорошо для меня. Посмотреть Демо
предположим, что это ваша форма:
<form action="" method=""> <input type="text" name="place" id="google-places-searchbox" placeholder="Enter place name"><br><br> <input type="text" name="field-1" placeholder="Field 1"><br><br> <input type="text" name="field-2" placeholder="Field 2"><br><br> <button type="submit">Submit</button> </form>
тогда следующий код javascript решит проблему:
var placesSearchbox = $("#google-places-searchbox"); placesSearchbox.on("focus blur", function() { $(this).closest("form").toggleClass('prevent_submit'); }); placesSearchbox.closest("form").on("submit", function(e) { if (placesSearchbox.closest("form").hasClass('prevent_submit')) { e.preventDefault(); return false; } });
и вот как выглядит полный код на HTML-странице (обратите внимание, что вам нужно заменить
YOUR_API_KEY
С вашим Google api ключ):<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>Prevent form submission when choosing a place from google places autocomplete searchbox</title> </head> <body> <form action="" method=""> <input type="text" name="place" id="google-places-searchbox" placeholder="Enter place name"><br><br> <input type="text" name="field-1" placeholder="Field 1"><br><br> <input type="text" name="field-2" placeholder="Field 2"><br><br> <button type="submit">Submit</button> </form> <!-- jQuery --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <!-- Google Maps --> <!-- Note that you need to replace the next YOUR_API_KEY with your api key --> <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places" async defer></script> <script> var input = document.getElementById("google-places-searchbox"); var searchBox = new google.maps.places.SearchBox(input); var placesSearchbox = $("#google-places-searchbox"); placesSearchbox.on("focus blur", function() { $(this).closest("form").toggleClass('prevent_submit'); }); placesSearchbox.closest("form").on("submit", function(e) { if (placesSearchbox.closest("form").hasClass('prevent_submit')) { e.preventDefault(); return false; } }); </script> </body> </html>