Google Place Autocomplete-choisir le premier résultat sur la touche Enter? [dupliquer]

cette question a déjà une réponse ici:

  • Google maps place API V3 autocomplete - sélectionner la première option enter 15 réponses

J'utilise un Google Places Autocomplete et je veux simplement qu'il sélectionne l'élément supérieur dans la liste des résultats lorsque la touche enter est pressée dans le domaine de forme et des suggestions existent. Je sais que cela a déjà été demandé:

Google maps Lieux de l'API V3 de saisie semi-automatique - sélectionnez la première option, entrez

Google maps Lieux de l'API V3 de saisie semi-automatique - sélectionnez la première option sur enter (et ont-il rester de cette façon)

mais les réponses à ces questions ne semblent pas réellement fonctionner, ou elles traitent de la fonctionnalité ajoutée spécifique.

il semble aussi que quelque chose comme ce qui suit devrait fonctionner (mais il ne fonctionne pas):

$("input#autocomplete").keydown(function(e) {
  if (e.which == 13) {          
    //if there are suggestions...
    if ($(".pac-container .pac-item").length) {
      //click on the first item in the list or simulate a down arrow key event
      //it does get this far, but I can't find a way to actually select the item
      $(".pac-container .pac-item:first").click();
    } else {
      //there are no suggestions
    }
  }
});

toute suggestion serait grandement appréciée!

26
demandé sur Community 2013-01-30 14:23:45

9 réponses

Je reposter ma réponse de Google maps Places API V3 autocomplete - sélectionner la première option sur ENTRER :

il semble qu'il y ait une solution bien meilleure et propre: utiliser google.maps.places.SearchBox au lieu de google.maps.places.Autocomplete . Un code est presque le même, on obtient juste le premier à partir de plusieurs endroits. En appuyant sur L'entrée la liste correcte est retournée - de sorte qu'il sort de la boîte et il n'y a pas besoin de piratages.

voir l'exemple Page HTML:

http://rawgithub.com/klokan/8408394/raw/5ab795fb36c67ad73c215269f61c7648633ae53e/places-enter-first-item.html

l'extrait de code correspondant est:

var searchBox = new google.maps.places.SearchBox(document.getElementById('searchinput'));

google.maps.event.addListener(searchBox, 'places_changed', function() {
  var place = searchBox.getPlaces()[0];

  if (!place.geometry) return;

  if (place.geometry.viewport) {
    map.fitBounds(place.geometry.viewport);
  } else {
    map.setCenter(place.geometry.location);
    map.setZoom(16);
  }
});

le code source complet de l'exemple est à: https://gist.github.com/klokan/8408394

8
répondu Klokan Technologies 2017-05-23 12:34:34

j'ai lu les nombreuses réponses de cette question, et des réponses des questions liées tant de fois, avant de conclure que la meilleure réponse est celle-ci (Note: malheureusement, ce n'est pas la réponse acceptée!).

j'ai modifié 2 ou 3 lignes pour en faire une fonction prête à l'emploi que vous pouvez copier/coller dans votre code et appliquer à de nombreux éléments input si nécessaire. Le voici:

var selectFirstOnEnter = function(input){      // store the original event binding function
    var _addEventListener = (input.addEventListener) ? input.addEventListener : input.attachEvent;
    function addEventListenerWrapper(type, listener) { // Simulate a 'down arrow' keypress on hitting 'return' when no pac suggestion is selected, and then trigger the original listener.
    if (type == "keydown") { 
      var orig_listener = listener;
      listener = function (event) {
      var suggestion_selected = $(".pac-item-selected").length > 0;
        if (event.which == 13 && !suggestion_selected) { var simulated_downarrow = $.Event("keydown", {keyCode:40, which:40}); orig_listener.apply(input, [simulated_downarrow]); }
        orig_listener.apply(input, [event]);
      };
    }
    _addEventListener.apply(input, [type, listener]); // add the modified listener
  }
  if (input.addEventListener) { input.addEventListener = addEventListenerWrapper; } else if (input.attachEvent) { input.attachEvent = addEventListenerWrapper; }
}

Usage:

selectFirstOnEnter(input1);
selectFirstOnEnter(input2);
...
8
répondu Basj 2017-05-23 12:02:37

sur mon site pour réaliser cette même fonctionnalité j'ai eu besoin du plugin jQuery simulate ( https://github.com/jquery/jquery-simulate ) et ensuite joindre l'événement:

$("input#autocomplete").focusin(function () {
    $(document).keypress(function (e) {
        if (e.which == 13) {
            $("input#autocomplete").trigger('focus');
            $("input#autocomplete").simulate('keydown', { keyCode: $.ui.keyCode.DOWN } ).simulate('keydown', { keyCode: $.ui.keyCode.ENTER });
        }
    });
});

le plugin va simuler l'action de presser la touche vers le bas puis entrer, entrer lui-même ne fonctionne pas et je ne pouvais pas trouver une autre façon de sélectionner la première option.

Espérons que cette aide

3
répondu Mangiucugna 2013-07-26 06:49:17

solution de travail qui écoute si l'Utilisateur a commencé à naviguer dans la liste avec le clavier plutôt que de déclencher la fausse navigation à chaque fois

https://codepen.io/callam/pen/RgzxZB

Ici sont les choses importantes

// search input
const searchInput = document.getElementById('js-search-input');

// Google Maps autocomplete
const autocomplete = new google.maps.places.Autocomplete(searchInput);

// Has user pressed the down key to navigate autocomplete options?
let hasDownBeenPressed = false;

// Listener outside to stop nested loop returning odd results
searchInput.addEventListener('keydown', (e) => {
    if (e.keyCode === 40) {
        hasDownBeenPressed = true;
    }
});

// GoogleMaps API custom eventlistener method
google.maps.event.addDomListener(searchInput, 'keydown', (e) => {

    // Maps API e.stopPropagation();
    e.cancelBubble = true;

    // If enter key, or tab key
    if (e.keyCode === 13 || e.keyCode === 9) {
        // If user isn't navigating using arrows and this hasn't ran yet
        if (!hasDownBeenPressed && !e.hasRanOnce) {
            google.maps.event.trigger(e.target, 'keydown', {
                keyCode: 40,
                hasRanOnce: true,
            });
        }
    }
});

 // Clear the input on focus, reset hasDownBeenPressed
searchInput.addEventListener('focus', () => {
    hasDownBeenPressed = false;
    searchInput.value = '';
});

// place_changed GoogleMaps listener when we do submit
google.maps.event.addListener(autocomplete, 'place_changed', function() {

    // Get the place info from the autocomplete Api
    const place = autocomplete.getPlace();

    //If we can find the place lets go to it
    if (typeof place.address_components !== 'undefined') {          
        // reset hasDownBeenPressed in case they don't unfocus
        hasDownBeenPressed = false;
    }

});
2
répondu Callam 2017-07-19 14:11:59

C'est ce que j'ai fait et ça marche:

HTML:

<input name="location" id="autocomplete" autocomplete="off" type="text" class="textbx" placeholder="Enter Destination" required>

googleautocompletecustomized.js:

        function initialize() {
      // Create the autocomplete object, restricting the search
      // to geographical location types.
      if($('#autocomplete').length){
          autocomplete = new google.maps.places.Autocomplete(
              (document.getElementById('autocomplete')),
              {
                types: ['(regions)'],
                componentRestrictions: {country: "in"}
              });
          google.maps.event.addListener(autocomplete, 'place_changed', function() {
            $('#autocomplete').closest('form').data('changed', true);
            fillInAddress();
          });         
      }

    //select first result
        $('#autocomplete').keydown(function (e) {
            if (e.keyCode == 13 || e.keyCode == 9) {
                $(e.target).blur();
                if($(".pac-container .pac-item:first span:eq(3)").text() == "")
                    var firstResult = $(".pac-container .pac-item:first .pac-item-query").text();
                else
                    var firstResult = $(".pac-container .pac-item:first .pac-item-query").text() + ", " + $(".pac-container .pac-item:first span:eq(3)").text();

                var geocoder = new google.maps.Geocoder();
                geocoder.geocode({"address":firstResult }, function(results, status) {
                    if (status == google.maps.GeocoderStatus.OK) {
                        placeName = results[0];
                        e.target.value = firstResult;
                        fillInAddress(placeName);
                        $('#datetimepicker1 .input-group-addon').click();
                    }
                });
            }

        });
    }

// [START region_fillform]
function fillInAddress(place) {
  // Get the place details from the autocomplete object.
  if(!place)
    var place = autocomplete.getPlace();

  for (var component in componentForm) {
    document.getElementById(component).value = '';
    document.getElementById(component).disabled = false;
  }

  // Get each component of the address from the place details
  // and fill the corresponding field on the form.
  for (var i = 0; i < place.address_components.length; i++) {
    var addressType = place.address_components[i].types[0];
    if (componentForm[addressType]) {
      var val = place.address_components[i][componentForm[addressType]];
      document.getElementById(addressType).value = val;

    }
  }

}
0
répondu Fronto 2016-03-07 08:13:28

C'est le moyen le plus facile qui m'a résolu:

autocomplete.addListener('place_changed', function() {
  if(event.keyCode == 13 || event.keyCode == 9) { // detect the enter key
    var firstValue = $(".pac-container .pac-item:first").text(); // assign to this variable the first string from the autocomplete dropdown
     }
    $('#search-address').val(firstValue); // add this string to input
    console.log(firstValue); // display the string on your browser console to check what it is
   //(...) add the rest of your code here
  });
}
0
répondu Fillype Farias 2018-02-22 14:20:04

placer l'élément d'entrée en dehors de l'élément de formulaire. Remplir le formulaire avec javascript.

document.getElementById("adress").value = place.formatted_address;
-1
répondu Gustav 2013-12-03 11:25:27

j'ai fait un peu de travail autour de cela et maintenant je peux forcer la 1ère option de Google placces en utilisant angular js et angular Autocomplete module.

Merci à kuhnza

mon code

<form method="get" ng-app="StarterApp"  ng-controller="AppCtrl" action="searchresults.html" id="target" autocomplete="off">
   <br/>
    <div class="row">
    <div class="col-md-4"><input class="form-control" tabindex="1" autofocus g-places-autocomplete force-selection="true"  ng-model="user.fromPlace" placeholder="From Place" autocomplete="off"   required>
    </div>
        <div class="col-md-4"><input class="form-control" tabindex="2"  g-places-autocomplete force-selection="true"  placeholder="To Place" autocomplete="off" ng-model="user.toPlace" required>
    </div>
    <div class="col-md-4"> <input class="btn btn-primary"  type="submit" value="submit"></div></div><br /><br/>
    <input class="form-control"  style="width:40%" type="text" name="sourceAddressLat" placeholder="From Place Lat" id="fromLat">
    <input class="form-control"  style="width:40%"type="text" name="sourceAddressLang" placeholder="From Place Long" id="fromLong">
    <input class="form-control"  style="width:40%"type="text" name="sourceAddress" placeholder="From Place City" id="fromCity">
    <input class="form-control"  style="width:40%"type="text" name="destinationAddressLat" placeholder="To Place Lat" id="toLat">
    <input class="form-control"  style="width:40%"type="text" name="destinationAddressLang" placeholder="To Place Long"id="toLong">
    <input class="form-control"  style="width:40%"type="text" name="destinationAddress"placeholder="To Place City" id="toCity">
</form>

voici un Plunker " 151950920

Remercier.

-1
répondu Murali 2015-07-26 05:22:38