简体   繁体   English

AngularJS谷歌地图点击事件不在ios设备ipad和iphone中触发

[英]AngularJS Google Maps Click Event not firing in ios devices ipad and iphone

I have integrated google maps API with my app for autocomplete suggestions, it is working fine on my laptop(Ubuntu) all browsers as well. 我已经将谷歌地图API与我的应用程序集成以获得自动完成建议,它在我的笔记本电脑(Ubuntu)所有浏览器上运行良好。 However, recently I have tested with iPad and iPhone it doesn't work. 但是,最近我用iPad和iPhone测试过它不起作用。 I'm unable to click the suggested places. 我无法点击建议的地点。 I'm using AngularJS and my code snippet is below: 我正在使用AngularJS,我的代码片段如下:

HTML HTML

<div class="row">
    <div class="col-md-6">
        <form name="searchForm" ng-submit="fillInAddress()">
            <div class="input-group well">
                <input type="text" class="form-control" id="autocomplete" name="city" placeholder="Enter your city" 
                onFocus="geolocate()" required />
                <span class="input-group-btn">
                    <button class="btn btn-primary" type="submit" ladda="ldloading.slide_left" data-style="slide-left" data-spinner-color="#000000"
                        ng-disabled="searchForm.$invalid">
                        <i class="fa fa-search"></i> Search
                    </button>
                </span>
            </div>
        </form>
    </div>
</div>

JS JS

 var placeSearch, autocomplete;

  function initAutocomplete() {
    autocomplete = new google.maps.places.Autocomplete((document.getElementById('autocomplete')),
    {types: ['geocode']});
    autocomplete.addListener('place_changed', fillInAddress);
  }

  function fillInAddress() {
    // Get the place details from the autocomplete object.
    var place = autocomplete.getPlace();
    locationfilter.lat=place.geometry.location.lat();
    locationfilter.lon=place.geometry.location.lng();
    $scope.getOrders($scope.reportParams,locationfilter);
  }

  $scope.getOrders = function(pagination, locationfilter) {
    $scope.working = true;
    sliveorders
      .getLocOrders(pagination, locationfilter)
      .then(function(res) {
        $scope.Orders=res.data;
        $scope.totalItems=res.total;  
        $scope.working = false;
      })
      .catch(function(err) {
        console.log('Location search err:', err);
        $scope.working = false;
      });  
  }

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

Here is a working (tested on iPad with IoS 9.2) example using ng-map , an AngularJS library for Google Maps. 这是一个工作(使用IoS 9.2在iPad上测试)的例子,使用ng-map ,一个用于谷歌地图的AngularJS库。

 angular.module("app", ['ngMap']).controller("MyCtrl", function($scope, NgMap) { var vm = this; //vm.types = "['geocode']"; vm.types = "['establishment']"; vm.usebounds = false; vm.placeChanged = function() { vm.place = this.getPlace(); console.log('location', vm.place.geometry.location); vm.map.setCenter(vm.place.geometry.location); } vm.geolocate = function() { if (navigator.geolocation) { console.log("geolocate"); navigator.geolocation.getCurrentPosition(function(position) { var geolocation = { lat: position.coords.latitude, lng: position.coords.longitude }; console.log("position", position); if (vm.usebounds) { vm.mybounds = { center: geolocation, radius: position.coords.accuracy }; } vm.map.setCenter(geolocation); }); } }; NgMap.getMap().then(function(map) { vm.map = map; }); }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script> <script src="https://rawgit.com/allenhwkim/angularjs-google-maps/master/build/scripts/ng-map.js"></script> <script src="https://maps.google.com/maps/api/js?libraries=places,visualization,drawing,geometry,places"></script> <div ng-app="app"> <div ng-controller="MyCtrl as vm"> Enter your city: <br/> <input places-auto-complete size=80 ng-model="vm.address" component-restrictions="{country:'us'}" types="{{types}}" ng-focus="vm.geolocate()" strict-bounds="true" circle-bounds="{{vm.mybounds}}" on-place-changed="vm.placeChanged()" /> <br/> <input type="checkbox" ng-model="vm.usebounds">use bounds <br/> <div ng-show="vm.place"> Address = {{vm.place.formatted_address}} <br/> Location: {{vm.place.geometry.location}}<br/> </div> <hr> bounds: {{vm.mybounds}} </div> <ng-map></ng-map> </div> 

And here is a jsfiddle: https://jsfiddle.net/beaver71/mu5u71sg/ 这里有一个jsfiddle: https ://jsfiddle.net/beaver71/mu5u71sg/

The place_changed event is hampered on IOS. 在IOS上, place_changed事件受到阻碍。 The fix is to wrap the placed_changed event inside a normal click event that then dispatches the place_changed event like this: 解决方法是将placed_changed事件包装在普通的click事件中,然后调度place_changed事件,如下所示:

document.getElementById('autocomplete')
  .addEventListener('click', e=>autocomplete.dispatchEvent('place_changed'));

so initAutoComplete() becomes: 所以initAutoComplete()变成:

  function initAutocomplete() {
    autocomplete = new google.maps.places.Autocomplete((document.getElementById('autocomplete')),
    {types: ['geocode']});
    document.getElementById('autocomplete')
       .addEventListener('click', e=>autocomplete.dispatchEvent('place_changed'));
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM