2012-10-10 7 views
31

Kliknięcie wydaje się ognia zdarzenie i ustawić ciasteczka ale prasowaniem wprowadzić do przedstawienia nie ustawia cookies i zamiast strona przekierowuje bez cookies.Jak ogień place_changed imprezę dla Google umieszcza autouzupełnianie na klawisz Enter

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 }); 
      } 
     }); 
}); 

Lokalizacja .search jest klasą dla wielu pól tekstowych. Istnieje przycisk przesyłania, który pobiera wartości z plików cookie i przekierowań (po stronie serwera)

+0

To nie jest kwestia API Mapa Google. – Marcelo

+12

jest w bibliotece Google Maps API v3 Places Library –

+0

Pytanie dotyczy wypalania zdarzenia na elemencie DOM, a nie interfejsu API Map Google. – Marcelo

Odpowiedz

35

Adaptacja Jonathana Caulfield za odpowiedź:

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

Dobra odpowiedź. Byłem w stanie to łatwo zaadaptować, aby zrobić to, co chciałem, co było podpaleniem autouzupełniacza, a następnie przesłać formularz. –

+5

Minęło trochę czasu, odkąd to zostało odebrane, więc być może coś się zmieniło w google's Autocomplete widget, ale jeśli użyję tego kodu, metoda 'getPlace()' na obiekcie 'autocomplete' zwróci wartość null. Standardowy program obsługi 'place_changed' wydaje się być uruchamiany przy naciśnięciu klawisza, więc samo zwracanie z tego powodu jest wystarczające (dla mnie) do zatrzymania wysyłania formularza zawierającego. –

1

Może nie jest to najbardziej przyjazne dla użytkownika rozwiązanie, ale można użyć JQuery, aby wyłączyć klawisz Enter.

Coś takiego ...

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

Próbowałem kod, ale myślę, że autouzupełnianie ma fokus, gdy klawisz jest wciśnięty, a nie pole tekstowe. –

+1

Nie odpowiada na pytanie i sugeruje zrobienie czegoś, co jest bardzo złym UX. –

+0

Zostało to użyte i dostosowane jako zaakceptowana odpowiedź. –

5

Oba powyższe odpowiedzi są dobre odpowiedzi na ogólne pytanie o wypalanie pytanie, kiedy użytkownik naciśnie "wchodzić." Jednak - wystąpił bardziej szczegółowy problem podczas korzystania z funkcji autouzupełniania w Miejscach Google, która mogła być częścią problemu PO. Aby zdarzenie place_changed mogło wykonać cokolwiek pożytecznego, użytkownik musi wybrać jedną z opcji autouzupełniania. Jeśli po prostu wywołasz 'place_changed', blok if() jest pomijany, a plik cookie nie jest ustawiony.

Jest to bardzo dobra odpowiedź na drugą część pytania tutaj: https://stackoverflow.com/a/11703018/1314762

UWAGA: Odpowiedź amirnissim, a nie wybrana odpowiedź jest jedna używać ze względów będziesz napotkasz jeśli masz więcej niż jedno uzupełnienie autouzupełniania na tej samej stronie.

4

jakie napotkał ten problem, jak również i wpadł dobrym rozwiązaniem. Na mojej stronie internetowej chciałem zapisać autocomplete.getPlace(). Formatted_address w ukrytym sygnale przed przesłaniem. Operacja ta działała zgodnie z oczekiwaniami po kliknięciu przycisku przesyłania formularza, ale nie po naciśnięciu klawisza Enter w menu rozwijanym autouzupełniania. Moje rozwiązanie było następujące:

$(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(); 
     } 
    }); 
}); 

To rozwiązanie wydaje się działać dobrze.

Powiązane problemy