3

автозаполнение работает отлично на нескольких статических полях ввода. Но когда я добавляю поле ввода с помощью автозаполнения кнопки, это не работает в этих полях ввода. Может быть, проблема в закрытии, но я не уверен из-за моего слабого Javascript. Может кто-нибудь мне помочь?Автозаполнение Google Places не работает с динамически генерируемыми элементами ввода

Вот код:

<!DOCTYPE html> 
<html> 
<head> 
<title>test</title> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
<meta charset="utf-8"> 

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places"></script> 
<script> 
var map = null; 
var marker = []; 
var autocomplete = []; 
var inputs = []; 
var types = []; 
var autocompleteOptions = { 
componentRestrictions: {country: "az"} 
}; 

Эта функция динамически создает до 5 полей ввода (я ставлю эту функцию в методе инициализации и diidn't работают либо):

$(document).ready(function(){ 
var count = 2; 
$("#addInputField").click(function(){ 
    count++; 
    $("#inputlar").append("<input id='pac-input" + count + "' class='controlsInput' type='text' placeholder='Enter your destination' /> <br />"); 
    var newInput = []; 
    var newEl = document.getElementById('pac-input' + count); 
    newInput[count-1] = newEl; 
    setupAutocomplete(autocomplete, newInput, count-1); 
    if (count === 7) { 
     $("#addInputField").remove(); 
    } 
});  

});

Эта функция вызывается из метода инициализации для поддержки автозаполнения на нескольких входах. Работает отлично:

function setupAutocomplete(autocomplete,inputs,i) { 

     autocomplete[i] = new google.maps.places.Autocomplete(inputs[i], autocompleteOptions); 
     autocomplete[i].bindTo('bounds', map); 

     google.maps.event.addListener(autocomplete[i], 'place_changed', function() { 
      var infowindow = new google.maps.InfoWindow(); 
      if (marker[i] && marker[i].setMap) { 
      marker[i].setMap(null); 
      marker[i] = null; 
      } 
      marker[i] = new google.maps.Marker({ 
       map: map 
      }); 
      infowindow.close(); 
      marker[i].setVisible(false); 
      var place = autocomplete[i].getPlace(); 
      if (!place.geometry) { 
      return; 
      } 

      // If the place has a geometry, then present it on a map. 
      if (place.geometry.viewport) { 
      map.fitBounds(place.geometry.viewport); 
      } else { 
      map.setCenter(place.geometry.location); 
      map.setZoom(17); // Why 17? Because it looks good. 
      } 

      marker[i].setPosition(place.geometry.location); 
      marker[i].setVisible(true); 

      var address = ''; 
      if (place.address_components) { 
      address = [ 
       (place.address_components[0] && place.address_components[0].short_name || ''), 
       (place.address_components[1] && place.address_components[1].short_name || ''), 
       (place.address_components[2] && place.address_components[2].short_name || '') 
      ].join(' '); 
      } 

      infowindow.setContent('<div><strong>' + place.name + '</strong><br>' + address); 
      infowindow.open(map, marker[i]); 
     }); 
    } 

И, наконец инициализировать метод:

function initialize() { 
     var mapOptions = { 
     center: new google.maps.LatLng(40.4700, 50.0000), 
     zoom: 10, 
     zoomControl:true, 
     zoomControlOptions: { 
      style:google.maps.ZoomControlStyle.SMALL 
     }, 
     mapTypeControl:true, 
     mapTypeControlOptions: { 
      style:google.maps.MapTypeControlStyle.DROPDOWN_MENU 
     } 
     }; 
     map = new google.maps.Map(document.getElementById('map-canvas'), 
     mapOptions); 
     types = document.getElementById('type-selector'); 
     map.controls[google.maps.ControlPosition.TOP_LEFT].push(types); 


     inputs = document.getElementsByClassName("controlsInput"); 
     for(var i = 0; i < inputs.length; i++) { 
     setupAutocomplete(autocomplete,inputs,i); 
     } 
     // Sets a listener on a radio button to change the filter type on Places 
     // Autocomplete. 
     function setupClickListener(id, types) { 
     var radioButton = document.getElementById(id); 
     google.maps.event.addDomListener(radioButton, 'click', function() { 
      for (var i=0 ; i<autocomplete.length; i++) { 
      autocomplete[i].setTypes(types); 
      } 
     }); 
     } 

     setupClickListener('changetype-all', []); 
     setupClickListener('changetype-establishment', ['establishment']); 
     setupClickListener('changetype-geocode', ['geocode']); 
    } 

    google.maps.event.addDomListener(window, 'load', initialize); 

</script> 
</head> 

И в HTML:

<body> 
    <table> 
       <tr> 
        <td> 
         <div> 
          <div id="inputlar"> 
          <input id="pac-input" class="controlsInput" type="text" placeholder="Marşrutunuzu haradan başlayırsınız" /> <br /> 
          <input id="pac-input2" class="controlsInput" type="text" placeholder="Haraya gedirsiniz"> <br /> 
          </div> <br /> 
          <input id="addInputField" type="button" value="Yolüstü dayanacaq əlavə et" class="styled-button-10"/> 

          <div hidden="hidden" id="type-selector" class="controls"> 
           <input type="radio" name="type" id="changetype-all" checked="checked"> 
           <label for="changetype-all">All</label> 

           <input type="radio" name="type" id="changetype-establishment"> 
           <label for="changetype-establishment">Establishments</label> 

           <input type="radio" name="type" id="changetype-geocode"> 
           <label for="changetype-geocode">Geocodes</label> 
          </div> 
         </div> 
        </td> 
        <td> 
         <div id="map-canvas" style="width:540px;height:380px;"></div> 
        </td> 
       </tr> 
      </table> 
</body> 
</html> 
+0

Пожалуйста обеспечивают [jsfiddle] (http://jsfiddle.net). Будет легче диагностировать проблемы. – MrUpsidown

+0

Спасибо. В следующий раз я попробую – gdrt

ответ

6

Проблема заключается в том, что вы не вызываете setupAutocomplete() после добавления новых элементов. Вы должны сделать что-то вроде этого (может быть улучшено с помощью JQuery):

$(document).ready(function(){ 
    var count = 2; 
    $("#addInputField").click(function(){ 
     count++; 
     console.log('add new input field'); 
     $("#inputlar").append("<input id='pac-input" + count + "' class='controlsInput' type='text' placeholder='Enter your destination' /> <br />"); 

     // added 
     var newInput = []; 
     var newEl = document.getElementById('pac-input' + count); 
     newInput.push(newEl); 
     setupAutocomplete(autocomplete, newInput, 0); 

     if (count === 7) { 
      $("#addInputField").remove(); 
     } 
    });  
}); 

Update:example at jsbin. setupAutocomplete() нужно немного изменить, прокомментированный код оставил там, чтобы увидеть разницу, idx вместо параметра i.

function setupAutocomplete(autocomplete, inputs, i) { 

    // autocomplete[i] = new google.maps.places.Autocomplete(inputs[i], autocompleteOptions); 
    autocomplete.push(new google.maps.places.Autocomplete(inputs[i], autocompleteOptions)); 
    var idx = autocomplete.length - 1; 
    //autocomplete[i].bindTo('bounds', map); 
    autocomplete[idx].bindTo('bounds', map); 

    //google.maps.event.addListener(autocomplete[i], 'place_changed', function() { 
    google.maps.event.addListener(autocomplete[idx], 'place_changed', function() { 
    ... 

Примечание: Я не проверял, что произойдет, когда вы достигнете 7 автозаполнения входов. Возможно, вам нужно будет кое-что сделать.

+1

Спасибо за ваш ответ, теперь работает автозаполнение. Но его маркер и infowindow теперь переопределяют маркер другого входа и infowindow. – gdrt

+0

Я сделал массив ввода глобальным и использовал ваш метод. Посмотрите на измененный код. Но это не помогло автозаполнению не работает – gdrt

+1

Большое вам спасибо. У меня был другой подход. Оба они работают. Если вы хотите посмотреть на изменения – gdrt

4

Я разработал скрипт, который дает поиск по местоположению в Google для начала местоположения, конечного местоположения, а также для путевых точек, и это довольно. Если вы попробуете один раз. Вот код. Загрузите его и запустите в любом браузере и наслаждайтесь ..!

Google directions with waypoints search waypoints

Смежные вопросы