Есть ли способ автозаполнения/текстового заполнения поля формы, как пользователь, с первым возвращаемым значением местоположения Google?

У меня есть стандартное поле в форме для местоположения, использующее Google Places API.

<div><input class="input_standard fakeWaitlistCity" placeholder="Location" id="autocomplete"></input></div>

Когда пользователь печатает, он показывает предложения ниже. Есть ли настройка для заполнения поля первым возвращаемым значением?

Вот как это выглядит в настоящее время:

введите здесь описание изображения

Цель здесь в том, чтобы пользователь не мог просто ввести «Нью-Йорк». Если они перестанут печатать, все поле уже будет заполнено «Нью-Йорк, штат Нью-Йорк, США».

Это идеальный опыт, когда пользователь печатает:

введите здесь описание изображения

Спасибо!

ОБНОВЛЕНИЕ. Я нашел это обсуждение о том, как это называется.

Вот изображение по ссылке выше, о чем я говорю:

введите здесь описание изображения


person gwalshington    schedule 20.03.2018    source источник


Ответы (3)


// Bind dollar signs to query selector (IE8+)
var $ = document.querySelector.bind(document);

function preventStandardForm(evt) {
    // prevent standard form from submitting
    evt.preventDefault();
}

function autoCallback(predictions, status) {
    // *Callback from async google places call
    if (status != google.maps.places.PlacesServiceStatus.OK) {
        // show that this address is an error
        pacInput.className = 'error';
        return;
    }

    // Show a successfull return
    pacInput.className = 'success';
    pacInput.value = predictions[0].description;
}


function queryAutocomplete(input) {
    // *Uses Google's autocomplete service to select an address
    var service = new google.maps.places.AutocompleteService();
    service.getPlacePredictions({
        input: input,
        componentRestrictions: {
            country: 'us'
        }
    }, autoCallback);
}

function handleTabbingOnInput(evt) {
    // *Handles Tab event on delivery-location input
    if (evt.target.id == "pac-input") {
        // Remove active class
        evt.target.className = '';

        // Check if a tab was pressed
        if (evt.which == 9 || evt.keyCode == 9) {
            queryAutocomplete(evt.target.value);
        }
    }
}

// ***** Initializations ***** //
// initialize pac search field //
var pacInput = $('#pac-input');
pacInput.focus();

// Initialize Autocomplete
var options = {
    componentRestrictions: {
        country: 'us'
    }
};
var autocomplete = new google.maps.places.Autocomplete(pacInput, options);
// ***** End Initializations ***** //

// ***** Event Listeners ***** //
google.maps.event.addListener(autocomplete, 'place_changed', function () {
    var result = autocomplete.getPlace();
    if (typeof result.address_components == 'undefined') {
        queryAutocomplete(result.name);
    } else {
        console.log(result.address_components);
    }
});

// Tabbing Event Listener
if (document.addEventListener) {
    document.addEventListener('keydown', handleTabbingOnInput, false);
} else if (document.attachEvent) { // IE8 and below
    document.attachEvent("onsubmit", handleTabbingOnInput);
}

// search form listener
var standardForm = $('#search-shop-form');
if (standardForm.addEventListener) {
    standardForm.addEventListener("submit", preventStandardForm, false);
} else if (standardForm.attachEvent) { // IE8 and below
    standardForm.attachEvent("onsubmit", preventStandardForm);
}
// ***** End Event Listeners ***** //
<link rel="stylesheet" href="${createLinkTo(dir:'asset/vendor/bootstrap/dist/css',file:'bootstrap.css')}">
		<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=places&key=AIzaSyBI9iSbSEo3h0LdqlqRFwnayYApQfmNXuE"></script>
		
   <form id="search-shop-form" class="search-form" name="searchShopForm" action="/impl_custom/index/search/" method="post">
    <label for="pac-input">Delivery Location</label>
    <input id="pac-input" type="text" placeholder="Los Angeles, Manhattan, Houston" autocomplete="off" />
    <button class="search-btn btn-success" type="submit">Search</button>
</form>

Обновление:

Примечание. В соответствии с вашими требованиями для Google Places доступен любой вариант. Таким образом, у вас есть время ожидания изменения в секундах в соответствии с вашим требованием. Я предполагаю, что с 300 мс я получу предложения в раскрывающемся списке.

$("#find").click(function(){
                  $("#geocomplete").trigger("geocode");
                });
         	
              $(function(){
                $("#geocomplete").geocomplete()        
                
              });
            $('.autoc').bind('keyup', function(e) {	  
            if(e.keyCode==13){
         $('#find').click()
            }else{
         setTimeout(function(){ 
         		var inputVal = $("#geocomplete").val();
         		var inpt = $("#geocomplete");
         		if( inputVal != "" ){
         		
         			var firstRowVal = firstRowValue();
         			if( firstRowVal != "" ){
         				if(firstRowVal.toLowerCase().indexOf(inputVal.toLowerCase()) === 0){
         					inpt.val(firstRowVal);//change the input to the first match
         					inpt[0].selectionStart = inputVal.length; //highlight from end of input
         					inpt[0].selectionEnd = firstRowVal.length;//highlight to the end
         				}
         			}
         		}
         	}, 300);// please change this 300 as per your internet connection speed.
         }
         });
         
         function firstRowValue() {
              var selected = '';
              // Check if any result is selected.
              if ($(".pac-item-selected")[0]) {
                selected = '-selected';
              }
         
              // Get the first suggestion's text.
              var $span1 = $(".pac-container:visible .pac-item" + selected + ":first span:nth-child(2)").text();
              var $span2 = $(".pac-container:visible .pac-item" + selected + ":first span:nth-child(3)").text();
         
              // Adds the additional information, if available.
              var firstResult = $span1;
              if ($span2) {
                firstResult += " - " + $span2;
              }
         
              return firstResult;
            }
<script src="https://maps.googleapis.com/maps/api/js?libraries=places&key=AIzaSyBI9iSbSEo3h0LdqlqRFwnayYApQfmNXuE"></script>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
      <script src="https://ubilabs.github.io/geocomplete/jquery.geocomplete.js"></script>
      <form>
         <input id="geocomplete" type="text" placeholder="Type in an address" size="50" class="autoc"/>
         <input id="find" type="button" value="find" size="10"/>
      </form>

Надеюсь, это поможет вам

ссылка здесь

person Rahul Mahadik    schedule 22.03.2018
comment
Привет - спасибо за ответ! Когда я запускаю ваш фрагмент кода, он не заполняет текстовый ввод — он просто имеет раскрывающийся список предлагаемых местоположений. - person gwalshington; 23.03.2018
comment
@gwalshington Я много работал над этой проблемой. Но не получил никакого решения. Вы можете проверить с помощью vue. jsfiddle.net/santiblanko/dqo6vr57 - person Rahul Mahadik; 23.03.2018
comment
Привет - спасибо, это интересное решение. Он выглядит как заполнитель, но на самом деле он не поддерживает функцию «автозаполнения». Если пользователь вводит New York и видит остальную часть в текстовом поле, он предполагает, что нажатие кнопки «Отправить» отправит всю строку, но ,NY, USA на самом деле не присутствует в поле ввода — это заполнитель. Имеет ли это смысл? Спасибо! - person gwalshington; 23.03.2018
comment
Пожалуйста, проверьте это jsfiddle.net/RyTuV/346 и извините, я не понимаю, что именно вы хотите . Спасибо. - person Rahul Mahadik; 23.03.2018
comment
Скрипка - это то, что я искал! Можете ли вы обновить свой ответ, используя Google Locations, чтобы показать, что вы делаете на скрипке, и я приму ответ. Спасибо! - person gwalshington; 23.03.2018
comment
Не могли бы вы завершить вопрос и обновить свой ответ? Спасибо - person gwalshington; 25.03.2018
comment
@gwalshington Я обновил ответ после долгих усилий. Я не знаю, полностью ли это соответствует вашим требованиям или нет. Но официально есть API или документация, доступная в google или других местах, относительно которых вы ожидаете - person Rahul Mahadik; 27.03.2018
comment
Привет! Это почти там. Вы запустили свой фрагмент? Я ищу тот, что в jsfiddle, но с Google Places вместо массива предопределенных строк. Фрагмент, который вы помещаете, принудительно вводит первый вариант и не позволяет пользователю продолжать печатать, если первый вариант не соответствует тому, что он пытается выбрать. Имеет ли это смысл? Я чувствую, что ваш ответ очень близок, но не совсем. - person gwalshington; 27.03.2018
comment
@gwalshington вы проверили 2-й фрагмент? Это с Google Places, а не с массивом предопределенных строк - person Rahul Mahadik; 27.03.2018
comment
да, это почти так, но второй фрагмент - он переводит курсор в конец строки, когда он автоматически заполняет поле ввода, поэтому пользователь не может продолжать печатать, если первое предложение не то, что он хочет? Имеет ли это смысл? jsfiddle - это именно то, что я искал, но как я могу сделать это с помощью Google Places? Спасибо!! - person gwalshington; 28.03.2018
comment
Прости. Это невозможно. Я пробовал много. Google не дает список предложений ни в одном объекте. теперь мы читаем предложения от html. Так что с моей стороны невозможно выполнить ваше требование. Тем не менее вы думаете, что это возможно. пожалуйста, обновите ответ. Спасибо : ) - person Rahul Mahadik; 28.03.2018
comment
Эй - спасибо за вашу помощь. Я думаю, что это возможно, поэтому я продолжу работу над решением, но я присудил вам награду, так как вы ближе всего подошли к решению. Спасибо большое за помощь! - person gwalshington; 29.03.2018

Проверь это! это API автозаполнения Google Place, возможно, с этим вы сможете работать. https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete

person mat's    schedule 20.03.2018
comment
Привет - Большое спасибо!! На самом деле это то, что я использую для раскрывающегося списка, который вы можете увидеть в приведенном выше вопросе. Знаете ли вы, как сделать так, чтобы первая возвращенная опция автоматически заполняла текстовое поле (например, поиск Google), а не просто выпадающие варианты? Спасибо :) - person gwalshington; 21.03.2018

Я искал эффективное решение по вашему запросу, но не смог найти ничего работающего через Google (кроме самого Google!… =)).

Я пытался делать что-то с jQuery и jQuery-UI… и в конце концов начал с самого начала.

Так или иначе, вот то, что я прочитал и хочу поделиться с вами, я уверен, что вы найдете что-то интересное во всем этом.

О Google
Вот несколько ответов о том, как работает Google Instant:
Как работает Google Живой поиск?
https://searchengineland.com/how-google-instant-autocomplete-suggestions-work-62592

Кроме того, Google использует не только автозаполнение, но и алгоритм прогнозирования: https://support.google.com/websearch/answer/106230?hl=en
https://blog.google/products/search/google-search-autocomplete/

Визуально мы могли бы попытаться сделать что-то похожее на Google, и эта ссылка может быть полезной:
Как реализовать поле ввода, похожее на предложение Google?

Что я буду делать

Вот фрагмент, которым я закончил:

$(function() {
  var states = [
    'Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California',
    'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia',
    'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa',
    'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland',
    'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi',
    'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire',
    'New Jersey', 'New Mexico', 'New York', 'North Carolina',
    'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania',
    'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee',
    'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington',
    'West Virginia', 'Wisconsin', 'Wyoming'
  ];
  $("#tags").autocomplete({
    source: states,
    autoSelectFirst: true,
    autoFocus: true
  });
});
<head>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <link rel="stylesheet" href="/resources/demos/style.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
</head>

<body>
  <div class="ui-widget">
    <label for="tags">Tags: </label>
    <input id="tags">
  </div>
</body>

Поскольку мы не Google, мы не можем предсказать, что пользователь хочет написать.
Итак, в моем фрагменте им нужно нажать Enter или Tab, чтобы подтвердить автозаполнение. Нецелесообразно автоматически выбирать первое совпадение после того, как пользователь набрал всего два или три символа.

Но, если мы все равно сделаем автоматический выбор… Какой из них будет выбран автоматически?
Например, когда я начинаю вводить «Новый», автоматический выбор, безусловно, будет «Нью-Йорк», если мы последуем предложению Google. , «Нью-Гэмпшир», если исходить из алфавитного порядка, и это может быть «Нью-Мексико», если исходить из местоположения пользователя.

Надеюсь, это поможет, в любом случае.

person Takit Isy    schedule 28.03.2018
comment
Привет - большое спасибо за все ссылки! As we're not Google, we can't predict what the user wants to write. - мы действительно можем предсказать, что они хотят написать! Это местоположение хранится в Google Places — API, который я использую для проверки местоположения. Кроме того, я не ищу способ угадать, что пользователь хочет ввести — API Google Places уже делает это и добавляет список, подобный приведенному выше фрагменту. Я ищу функцию автозаполнения, пока они печатают. Большое спасибо за ваш вклад! - person gwalshington; 28.03.2018