如何延迟谷歌自动完成功能以节省信用

Posted

技术标签:

【中文标题】如何延迟谷歌自动完成功能以节省信用【英文标题】:How to delay the google autoComplete function to save credit 【发布时间】:2017-04-21 11:11:18 【问题描述】:

正如你所知,每次我们输入谷歌地图时,自动完成都会触发,我想为此设置一个延迟功能,例如 250 毫秒,这样给用户更多的输入时间并节省积分。我尝试添加 $timeout,但看起来它对我不起作用。请你帮我看看这个好吗?提前谢谢。 html:

<input name="google_places_ac" type="text" class="google_places_ac input-block-level" ng-model="address" placeholder="Please enter a location" ng-blur="updateMap()"/>

指令:

 link: function($scope, elm, attrs)   

                    $timeout(function()

                    var autocomplete = new google.maps.places.Autocomplete($(elm).find(".google_places_ac")[0], );  
                    google.maps.event.addListener(autocomplete, 'place_changed', function() 
                             var place = autocomplete.getPlace();
                            $scope.address = place.formatted_address;
                            $scope.location = 
                                formatted_address: place.formatted_address,
                                loglat: place.geometry.location
                            ;
                            $scope.$apply();
                            //pop up the event and index(if needed)
                            $scope.$emit('updatemap',$scope.indexposition);
                        );
                    ,1000);

每次我尝试输入搜索输入时,它都会立即弹出搜索结果列表,有什么办法可以延迟吗?所以用户可以输入更多的字符?

【问题讨论】:

【参考方案1】:

这是我所做的解决方案,希望对您有所帮助:

let lastCall = Date.now()

function initMap()
    var options = 
        types: ['address'],
        componentRestrictions: country: "es"
    ;

    var input = $('#pac-input')[0];
    if(input)
        var autocomplete = new google.maps.places.Autocomplete(input, options);
        google.maps.event.addListener(autocomplete, 'place_changed', function() 
            let coords = autocomplete.getPlace().geometry.location
            register([coords.lat(),coords.lng()])
        );
        $('#pac-input').keypress(function(event)
            let miliseconds = (Date.now() - lastCall)
            if(miliseconds <= 3000)
                event.preventDefault()
                $('#pac-input').val($('#pac-input').val()+event.key)
                setTimeout(function()
                    google.maps.event.trigger($('#pac-input')[0],'focus',);
                    lastCall = Date.now()
                , 2999);
            
            lastCall = Date.now()
        );
    

【讨论】:

【参考方案2】:

如果你使用 Angularjs,你可以试试这个:

ng-model-options=" debounce: 200 "

其中 200 - 以毫秒为单位的延迟

我的自动完成字段代码如下:

<input g-places-autocomplete 
           force-selection="true"
           enter="home.doSearch()"
           type="text"
           class="form-control"
           id="searchAddress"
           ng-model="home.searchAddress"
           name="searchAddress"
           options="home.autocompleteOptions"
           ng-model-options=" debounce: 1500 "
           autocomplete="off"
           placeholder=" 'YOUR_ROADTRIP_BEGINS' | translate "
           ng-keyup="home.checkForEnterButton($event)"
    >

【讨论】:

【参考方案3】:

我在搜索之前检查要输入的第一个 a-z 字符...似乎节省了一些元素查找。至少它从一开始就得到了一些相关的返回数据。请注意,这将在字母字符之后的下一个输入值上开始显示结果。您可能希望使用空格/空白作为触发器(例如... .value.match(/\s/))。 此外,您可能希望使用 Options 来指定 ComponentRestrictions 或 Bounds。这是文档的链接。 https://developers.google.com/maps/documentation/javascript/places-autocomplete

$scope.getDestinationLocation = function () 
    if (document.getElementById("daddress1").value.match(/[a-z]/i)) 
        var options = 
            types: ['address'],
            componentRestrictions:  country: "us" 
        ;
        var autocomplete = new google.maps.places.Autocomplete(
           (document.getElementById("daddress1")),
             options);
        autocomplete.addListener('place_changed', $.proxy(function () 
            var place = autocomplete.getPlace();
        ....

【讨论】:

【参考方案4】:

目前您无法通过 Maps JavaScript API 控制 Autocomplete 元素的地点预测请求的频率。

但是,公共问题跟踪器中有一个功能请求:

https://code.google.com/p/gmaps-api-issues/issues/detail?id=5831

Google 将此功能请求标记为已接受。我可以建议在此功能请求上加注星标,以表达您的兴趣并从 Google 获得进一步的更新。

【讨论】:

【参考方案5】:

你可以做一个带有超时的条件来处理这个

if(!$scope.isDelayed)
  $scope.isDelayed = true;
  $timeout(function()
     //call google maps api
     $scope.isDelayed = false;
  , 2500)

这样你将每 2500 毫秒调用一次,在你之前的代码中它总是会被执行,你只是在延迟执行,但是试试这个。

【讨论】:

感谢您的回复,但我想这样做的原因是为了省钱。每次我们输入时,它都会自动发送请求,我没有看到你的代码和我的代码有什么区别。我想在用户开始输入后设置一个时间延迟,以便用户有更多时间输入更多字符并节省 googleMaps 积分。 我不是很了解,我的代码每 2500 毫秒发出一次请求,我举个例子,如果用户在这 2500 毫秒之间输入,则只有在 2500 毫秒过去后才会发出另一个请求.所以你在请求之间做了一点延迟,你试过还是测试过?我还更新了代码

以上是关于如何延迟谷歌自动完成功能以节省信用的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图放置自动完成加载事件

如何打开和关闭谷歌地图自动完成功能?

谷歌浏览器的源码分析 6

谷歌将自动完成功能放在反应组件中

使用 jQuery Mobile 自动完成谷歌地图

为 jQuery 自动完成添加延迟