Google Maps API — автоматическое заполнение адреса работает только один раз? (ASP.NET / jQuery / HTML)

#html #jquery #asp.net #google-maps #google-api

#HTML #jquery #asp.net #google-карты #google-api

Вопрос:

У меня есть программа с модальным интерфейсом, внутри которого есть адресная строка и несколько (отключенных) входных данных для управления формами. При использовании адресной строки выдаются предложения по автозаполнению, и как только пользователь выбирает свой адрес, элемент управления формой автоматически вводит соответствующую информацию, относящуюся к искомому адресу. jQuery, используемый для такой функциональности, был получен из: https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform

У меня есть 3 отдельных модала, все из которых, как предполагается, выполняют одно и то же, однако, в нынешнем виде работает только один из них. Я попытался переименовать все переменные в разделе HTML (добавив 1), и я повторил код jQuery (также добавив 1 ко всем повторяющимся переменным). Консоль Chrome не выдает ошибок, и код компилируется, как ожидалось, однако для двух других режимов функция автозаполнения вообще не работает.

Первый модальный (часть его кода), который работает:

                                 <div id="locationField">
                                    <input id="autocomplete1" class="form-control" placeholder="Enter your address" onFocus="geolocate1()" type="text" />
                                </div>

                                <br />

                                <div>
                                    <img class="map-image" src="~/Images/yellow-map.PNG" />
                                </div>

                                <div>
                                    <label class="label-address">Street address</label>

                                    <input class="form-control" id="street_number1" style="text-align: left" readonly /> 
                                    
                                    <input class="form-control" id="route1" readonly />

                                    <label class="label-address">City</label>

                                    <input class="form-control" id="locality1" readonly />

                                    <label class="label-address">Province</label>

                                    <input class="form-control" id="administrative_area_level_11" readonly />

                                    <label class="label-address">Zip Code</label>

                                    <input class="form-control" id="postal_code1" readonly />

                                    <label class="label-address">Country</label>

                                    <input class="form-control" id="country1" readonly />
                                </div>
  

Код jQuery (скопированный по ссылке, упомянутой выше) для модального, который работает:

  //Autocomplete Address Form (DONATOR)
    var placeSearch, autocomplete;

    var componentForm = {
        street_number: 'short_name',
        route: 'long_name',
        locality: 'long_name',
        administrative_area_level_1: 'short_name',
        country: 'long_name',
        postal_code: 'short_name'
    };

    function initAutocomplete() {
        // Create the autocomplete object, restricting the search predictions to
        // geographical location types.
        autocomplete = new google.maps.places.Autocomplete(
            document.getElementById('autocomplete'), { types: ['geocode'] });

        // Avoid paying for data that you don't need by restricting the set of
        // place fields that are returned to just the address components.
        autocomplete.setFields(['address_component']);

        // When the user selects an address from the drop-down, populate the
        // address fields in the form.
        autocomplete.addListener('place_changed', fillInAddress);
    }

    function fillInAddress() {
        // Get the place details from the autocomplete object.
        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 then fill-in 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;
            }
        }
    }

    // Bias the autocomplete object to the user's geographical location,
    // as supplied by the browser's 'navigator.geolocation' object.
    function geolocate() {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function (position) {
                var geolocation = {
                    lat: position.coords.latitude,
                    lng: position.coords.longitude
                };
                var circle = new google.maps.Circle(
                    { center: geolocation, radius: position.coords.accuracy });
                autocomplete.setBounds(circle.getBounds());
            });
        }
    }
  

Second Modal (part of its code) which does not work:

                                 <div id="locationField">
                                    <input id="autocomplete1" class="form-control" placeholder="Enter your address" onFocus="geolocate1()" type="text" />
                                </div>

                                <br />

                                <div>
                                    <img class="map-image" src="~/Images/yellow-map.PNG" />
                                </div>

                                <div>
                                    <label class="label-address">Street address</label>

                                    <input class="form-control" id="street_number1" style="text-align: left" readonly /> 
                                    
                                    <input class="form-control" id="route1" readonly />

                                    <label class="label-address">City</label>

                                    <input class="form-control" id="locality1" readonly />

                                    <label class="label-address">Province</label>

                                    <input class="form-control" id="administrative_area_level_11" readonly />

                                    <label class="label-address">Zip Code</label>

                                    <input class="form-control" id="postal_code1" readonly />

                                    <label class="label-address">Country</label>

                                    <input class="form-control" id="country1" readonly />
                                </div>
  

Код jQuery (скопированный по ссылке, упомянутой выше) для модального, который не работает:

 var placeSearch1, autocomplete;

    var componentForm1 = {
        street_number1: 'short_name',
        route1: 'long_name',
        locality1: 'long_name',
        administrative_area_level_11: 'short_name',
        country1: 'long_name',
        postal_code1: 'short_name'
    };

    function initAutocomplete1() {
        // Create the autocomplete object, restricting the search predictions to
        // geographical location types.
        autocomplete = new google.maps.places.Autocomplete(
            document.getElementById('autocomplete1'), { types: ['geocode'] });

        // Avoid paying for data that you don't need by restricting the set of
        // place fields that are returned to just the address components.
        autocomplete.setFields(['address_component']);

        // When the user selects an address from the drop-down, populate the
        // address fields in the form.
        autocomplete.addListener('place_changed', fillInAddress1);
    }

    function fillInAddress1() {
        // Get the place details from the autocomplete object.
        var place1 = autocomplete.getPlace();

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

        // Get each component of the address from the place details,
        // and then fill-in the corresponding field on the form.
        for (var i1 = 0; i1 < place1.address_components.length; i1  ) {
            var addressType1 = place1.address_components[i1].types[0];
            if (componentForm1[addressType1]) {
                var val1 = place1.address_components[i1][componentForm1[addressType1]];
                document.getElementById(addressType1).value = val1;
            }
        }
    }

    // Bias the autocomplete object to the user's geographical location,
    // as supplied by the browser's 'navigator.geolocation' object.
    function geolocate1() {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function (position) {
                var geolocation = {
                    lat: position.coords.latitude,
                    lng: position.coords.longitude
                };
                var circle = new google.maps.Circle(
                    { center: geolocation, radius: position.coords.accuracy });
                autocomplete.setBounds(circle.getBounds());
            });
        }
    }
  

Я предполагаю, что проблема заключается в повторяющемся коде jQuery? В противном случае я не уверен. Хотелось бы получить некоторые рекомендации.

Комментарии:

1. Используете ли вы разные входные идентификаторы для разных экземпляров автозаполнения? Опубликованный вами HTML-код используется autocomplete1 в обоих. Также, пожалуйста, можете ли вы предоставить воспроизводимый пример на jsbin или jsfiddle?

2. Кстати, я бы настоятельно рекомендовал вам повторно использовать свой код вместо его дублирования (см. DRY ).