【问题标题】:Prevent Google place autocomplete from closing pick list (pac-container) when clicking outside pick list单击外部选择列表时,防止 Google 放置自动完成关闭选择列表(pac-container)
【发布时间】:2021-08-31 15:01:43
【问题描述】:

我希望 Google 地点自动完成选择列表在我单击选择列表外部时不隐藏,以便结果保持可见。

Example image pick list

示例视频
示例视频,其中通过单击选择列表之外的方式关闭了选择列表:
https://vimeo.com/563347070

检查元素
在 Google Inspect Element 工具中可以看到 pac-container 在点击外部选择列表时获取样式display: none;
https://vimeo.com/563350922

HTML

    <div class="content">
        <div id="search-container">
            <a class="icon-container"><img src="./Sources/Icons/arrow-back-outline.svg" id="backbtn" /></a>
            <form action="#" method="post" class="searchfield">
              <label for="userAddress"> 
                <input name="userAddress" id="searchfield" type="text" placeholder="where do you want to go?" value="" onfocus="this.value = this.value;"/>
              </label>
            </form>
            <a class="icon-container"><img src="./Sources/Icons/close-circle-outline.svg" id="emptybarbtn" /></a>  
          </div>
          <div id="resultAutocompletePlaces"></div>
          <button id="checkUserLocation">Current location</button> 
        </div>
    </div>

Javascript

function initializePlacesService() {
    //initialize places service to perform TextSearch
    var input = document.getElementById('searchfield');
    var options = {
      types: []
    };
    
    autocomplete = new google.maps.places.Autocomplete(input, options);

    //places pac-container inside #resultAutocompletePlaces div
    setTimeout(function(){ 
      $(".pac-container").prependTo("#resultAutocompletePlaces");
  }, 300)
};

$(function(){
    initializePlacesService(); 
 });

问题
如何确保在选择列表外部单击时不隐藏?

【问题讨论】:

  • 你从哪里得到.pac-container
  • 可以调试一个元素的变化,在元素中右键->中断->属性修改。我的意思是在检查员中。
  • 感谢您的考虑。如果我按照您的步骤操作,下面的行会亮起:Kla=function(a,b,c,d){for(var e=c.length;0&lt;=(b=a.indexOf(c,b))&amp;&amp;b&lt;d;){var f=a.charCodeAt(b-1);if(38==f||63==f)if(f=a.charCodeAt(b+e),!f||61==f||38==f||35==f)return b;b+=e+1}return-1};_.Nla=function(a,b){for(var c=a.search(Lla),d=0,e,f=[];0&lt;=(e=Kla(a,d,b,c));)f.push(a.substring(d,e)),d=Math.min(a.indexOf("&amp;",e)+1||c,c);f.push(a.substr(d));return f.join("").replace(Mla,"$1")};_.ru=function(a,b){_.Fm.Td?a.nodeValue=b:a.textContent=b};_.su=function(a,b){a.style.display=b?"":"none"};
  • 放入调用栈。
  • 不要试图破解小部件的行为,因为它是一种破解。如果您想要自定义行为,请使用 AutocompleteService class 并使用自定义行为构建您自己的小部件。

标签: javascript google-places-api google-places googleplacesautocomplete


【解决方案1】:

根据 MrUpsidown 的评论,我找到了这个 jsfiddle:

https://jsfiddle.net/woosmap/xs8a06nh/

function debounce(func, wait, immediate) {
  let timeout;
  return function() {
    let context = this,
      args = arguments;
    let later = function() {
      timeout = null;
      if (!immediate) func.apply(context, args);
    };
    let callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
}

function initAutocomplete() {
  let map = new google.maps.Map(document.getElementById('map'), {
    center: {
      lat: 48,
      lng: 4
    },
    zoom: 4,
    disableDefaultUI: true
  });

  // Create the search box and link it to the UI element.
  let inputContainer = document.querySelector('autocomplete-input-container');
  let autocomplete_results = document.querySelector('.autocomplete-results');
  let service = new google.maps.places.AutocompleteService();
  let serviceDetails = new google.maps.places.PlacesService(map);
  let marker = new google.maps.Marker({
    map: map
  });
  let displaySuggestions = function(predictions, status) {
    if (status != google.maps.places.PlacesServiceStatus.OK) {
      alert(status);
      return;
    }
    let results_html = [];
    predictions.forEach(function(prediction) {
      results_html.push(`<li class="autocomplete-item" data-type="place" data-place-id=${prediction.place_id}><span class="autocomplete-icon icon-localities"></span>                   <span class="autocomplete-text">${prediction.description}</span></li>`);
    });
    autocomplete_results.innerHTML = results_html.join("");
    autocomplete_results.style.display = 'block';
    let autocomplete_items = autocomplete_results.querySelectorAll('.autocomplete-item');
    for (let autocomplete_item of autocomplete_items) {
      autocomplete_item.addEventListener('click', function() {
        let prediction = {};
        const selected_text = this.querySelector('.autocomplete-text').textContent;
        const place_id = this.getAttribute('data-place-id');
        let request = {
          placeId: place_id,
          fields: ['name', 'geometry']
        };

        serviceDetails.getDetails(request, function(place, status) {
          if (status == google.maps.places.PlacesServiceStatus.OK) {
            if (!place.geometry) {
              console.log("Returned place contains no geometry");
              return;
            }
            var bounds = new google.maps.LatLngBounds();
            marker.setPosition(place.geometry.location);
            if (place.geometry.viewport) {
              bounds.union(place.geometry.viewport);
            } else {
              bounds.extend(place.geometry.location);
            }
            map.fitBounds(bounds);
          }
          autocomplete_input.value = selected_text;
          autocomplete_results.style.display = 'none';
        });
      })
    }
  };
  let autocomplete_input = document.getElementById('my-input-autocomplete');
  autocomplete_input.addEventListener('input', debounce(function() {
    let value = this.value;
    value.replace('"', '\\"').replace(/^\s+|\s+$/g, '');
    if (value !== "") {
      service.getPlacePredictions({
        input: value
      }, displaySuggestions);
    } else {
      autocomplete_results.innerHTML = '';
      autocomplete_results.style.display = 'none';
    }
  }, 150));
}

document.addEventListener("DOMContentLoaded", function(event) {
  initAutocomplete();
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2014-12-26
    • 2014-01-28
    相关资源
    最近更新 更多