2012-10-10 8 views
31

Der Klick scheint das Ereignis auszulösen und die Cookies zu setzen, aber durch Drücken der Eingabetaste werden die Cookies nicht festgelegt und stattdessen wird die Seite ohne die Cookies umgeleitet.So feuern Sie das Ereignis place_changed für die automatische Vervollständigung von Google-Orten auf die Eingabetaste

function locationAuto() { 
     $('.search-location').focus(function() { 
     autocomplete = new google.maps.places.Autocomplete(this); 
     searchbox = this; 

     google.maps.event.addListener(autocomplete, 'place_changed', function() { 
      var thisplace = autocomplete.getPlace(); 
      if (thisplace.geometry.location != null) { 
       $.cookie.raw = true; 
       $.cookie('location', searchbox.value, { expires: 1 }); 
       $.cookie('geo', thisplace.geometry.location, { expires: 1 }); 
      } 
     }); 
}); 

Der .search-Speicherort ist eine Klasse für mehrere Textfelder. Es gibt eine Schaltfläche senden, die die Werte aus den Cookies und Weiterleitungen (Server-Seite)

+0

Dies ist keine Google Mapa-API-Frage. – Marcelo

+12

its in der Google Maps API v3 Places-Bibliothek –

+0

Die Frage bezieht sich auf das Auslösen eines Ereignisses auf einem DOM-Element, nicht auf das Google Maps-API. – Marcelo

Antwort

35

Angepasst von Jonathan Caulfield Antwort:

$('.search-location').keypress(function(e) { 
    if (e.which == 13) { 
    google.maps.event.trigger(autocomplete, 'place_changed'); 
    return false; 
    } 
}); 
+0

Schöne Antwort. Ich war in der Lage, dies leicht anzupassen, um das zu tun, was ich wollte, was der Autocomplete-Hörer war und dann weitermachen und das Formular einreichen. –

+5

Es ist eine Weile her, dass dies beantwortet wurde, also hat sich vielleicht etwas im google Autocomplete-Widget geändert, aber wenn ich diesen Code verwende, gibt die Methode 'getPlace()' auf dem 'Autocomplete'-Objekt null zurück. Der Standard-'place_changed'-Handler scheint bei Tastendruck ausgelöst zu werden, also reicht es einfach aus, wenn ich hier von false zurückgebe (für mich), dass das enthaltende Formular nicht gesendet wird. –

1

Vielleicht nicht die benutzerfreundlichste Lösung, aber Sie könnten JQuery verwenden, um die Eingabetaste drücken drücken.

So etwas ...

$('.search-location').keypress(function(e) { 
    if (e.which == 13) { 
    return false; 
    } 
}); 
+2

Ich habe den Code ausprobiert, denke aber, dass die automatische Vervollständigung den Fokus hat, wenn die Taste gedrückt wird und nicht die Textbox. –

+1

Beantwortet die Frage nicht und schlägt vor, stattdessen etwas zu tun, was sehr schlecht UX ist. –

+0

Dies wurde verwendet und angepasst als die angenommene Antwort. –

5

sind beide der oben genannten Antworten gute Antworten für die allgemeine Frage eine Frage des Brennens, wenn der Benutzer drückt "eingeben." Ich habe jedoch ein konkreteres Problem bei der Verwendung der Google Places Autocomplete festgestellt, die möglicherweise Teil des Problems des OPs war. Damit das Ereignis place_changed etwas Nützliches tut, muss der Benutzer eine der Optionen zur automatischen Vervollständigung ausgewählt haben. Wenn Sie nur 'place_changed' auslösen, wird der if() -Baustein übersprungen und der Cookie wird nicht gesetzt.

Es auf den zweiten Teil der Frage eine sehr gute Antwort ist hier: https://stackoverflow.com/a/11703018/1314762

HINWEIS: Antwort des amirnissim, nicht die gewählte Antwort, die man aus Gründen verwenden Sie den Weg laufen werden wenn Sie mehr haben als eine Autocomplete-Eingabe auf derselben Seite.

4

Ich habe dieses Problem auch, und kam mit einer guten Lösung. In meiner Website wollte ich die autocomplete.getPlace(). Formated_address in einer versteckten Eingabe vor der Einreichung speichern. Dies funktionierte wie erwartet, wenn Sie auf die Schaltfläche Senden des Formulars klicken, aber nicht, wenn Sie die Eingabetaste für die Auswahl im Dropdown-Menü der automatischen Vervollständigung drücken. Meine Lösung war wie folgt:

$(document).ready(function() { 

    // Empty the value on page load 
    $("#formattedAddress").val(""); 
    // variable to indicate whether or not enter has been pressed on the input 
    var enterPressedInForm = false; 

    var input = document.getElementById("inputName"); 
    var options = { 
     componentRestrictions: {country: 'uk'} 
    }; 
    autocomplete = new google.maps.places.Autocomplete(input, options); 

    $("#formName").submit(function(e) { 
     // Only submit the form if information has been stored in our hidden input 
     return $("#formattedAddress").val().length > 0; 
    }); 

    $("#inputName").bind("keypress", function(e) { 
     if(e.keyCode == 13) { 
      // Note that simply triggering the 'place_changed' event in here would not suffice, as this would just create an object with the name as typed in the input field, and no other information, as that has still not been retrieved at this point. 

      // We change this variable to indicate that enter has been pressed in our input field 
      enterPressedInForm = true; 
     } 
    }); 

    // This event seems to fire twice when pressing enter on a search result. The first time getPlace() is undefined, and the next time it has the data. This is why the following logic has been added. 
    google.maps.event.addListener(autocomplete, 'place_changed', function() { 
     // If getPlace() is not undefined (so if it exists), store the formatted_address (or whatever data is relevant to you) in the hidden input. 
     if(autocomplete.getPlace() !== undefined) { 
      $("#formattedAddress").val(autocomplete.getPlace().formatted_address); 
     } 
     // If enter has been pressed, submit the form. 
     if(enterPressedInForm) { 
      $("#formName").submit(); 
     } 
    }); 
}); 

Diese Lösung scheint gut zu funktionieren.

Verwandte Themen