2013-02-01 79 views
13

我正在使用JavaScript Google自动填充API v3。它工作正常,但我想知道是否有办法强制从自动完成选择,这是输入,不会接受任何自由形式的文本。我看了看文档,并没有看到这样的选择,但认为我只是为了保证安全。我敢肯定,我可以用一些JavaScript来解决这个问题,但是如果可用的话,更愿意使用已经构建的方法。谢谢!Google Places自动完成力量选择

回答

8

Google Places API目前不支持此功能。如果您认为这将是一个有用的功能,请提交Places API - Feature Request

+0

我正在使用变通方法...相反,我使用自动完成预测API来默认选择第一个结果。 – nicolasbui

+0

http://code.google.com/p/gmaps-api-issues/issues/detail?id=8456投票,如果您也受到影响。 –

+0

不要这样做。这是一个可怕的想法,因为谷歌往往是错误的。例如,对于新道路,您将有一年的延迟,直到识别出正确的地址。见下面的答案。 – eraoul

0

我遇到了同样的问题,下面是我提出的一个解决方法。这可以与诸如onchange或onkeyup等事件结合使用。希望能帮助到你!

//Arguments:

address - string containing the place that you want to validate address_success_div - div object specifically used for displaying validation

function is_location_valid(address, address_success_div) 
{ 
    var geocoder = new google.maps.Geocoder(); 

    geocoder.geocode({"address": address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) 
     { 
      address_success_div.innerHTML = "SUCCESS"; 
     } 
     else 
     { 
      address_success_div.innerHTML = "FAILURE"; 
     } 
    }); 
} 
9

其实,我们所做的是以下几点:
- 每次的位置从自动完成列表中选择;我们填充一些一些隐藏的字段来自JSON响应的字段(城市名称,国家名称,经度和纬度)
- 表单提交后,我们检查这些字段是否具有val如果他们不这样做,这意味着用户不是从列表中选择一个位置,他只是自己输入了一个值。

这不是以JS的方式解决问题,但它仍然有窍门就好!

+2

值得注意的是,如果用户删除选定的位置,然后手动输入位置,则还应从这些隐藏的输入中删除这些值。 – digout

+3

它不会工作。首先假设我从自动完成中选择了合适的位置,因此根据您隐藏的字段值将被填充,然后如果我从自动填充框中删除了一些文本然后提交,那么错误的地址将作为隐藏字段值插入到数据库中已经有了一些价值。 – Milan

3
<script src="http://maps.googleapis.com/maps/api/js?sensor=false&amp;libraries=places" 
    type="text/javascript"></script> 
<script> 
    var IsplaceChange = false; 
    $(document).ready(function() {    
     var input = document.getElementById('txtlocation'); 
     var autocomplete = new google.maps.places.Autocomplete(input, { types: ['(cities)'] }); 

     google.maps.event.addListener(autocomplete, 'place_changed', function() { 
      var place = autocomplete.getPlace(); 

      IsplaceChange = true; 
     }); 

     $("#txtlocation").keydown(function() { 
      IsplaceChange = false; 
     }); 

     $("#btnsubmit").click(function() { 

      if (IsplaceChange == false) { 
       $("#txtlocation").val(''); 
       alert("please Enter valid location"); 
      } 
      else { 
       alert($("#txtlocation").val()); 
      } 

     }); 
    }); 
</script> 




+1

尝试添加说明或解释以帮助人们了解如何解决问题 – Illidanek

+0

如果输入内容并按Enter键,则会抛出place_changed事件,并且get place对象将返回一个包含您输入的文字。 – lcguida

-1

Hia的 我已经成功地做到这一点每个用户集中在输入字段时创建自动完成的对象,并检查它的值会在每次所迷离时间:

var autocompleteField; 
var input = document.getElementById('YOUR_INPUT'); 

$('#YOUR_INPUT').focus(function(e){ 

    if(autocompleteField){ 
     autocompleteField=null; 
    } 
    autocompleteField = new google.maps.places.Autocomplete(input); 

}); 

$('#YOUR_INPUT').blur(function(e){ 

    var results = autocompleteField.getPlace(); 
    if(!results){ 
     $(this).attr('value',''); 
    } 
}); 
-1

我解决了这个问题,结合了来自这里的几个不同答案的建议。用户输入地址的我的Textfield称为txtPlaces。这里是我的代码:

var pac_input = document.getElementById('txtPlaces'); 

(function pacSelectFirst(input) { 
    // store the original event binding function 
    var _addEventListener = (input.addEventListener) ? input.addEventListener : input.attachEvent; 

    function addEventListenerWrapper(type, listener) { 
     // Simulate a 'down arrow' keypress on hitting 'return' when no pac suggestion is selected, 
     // and then trigger the original listener. 
     if (type == "keydown") { 
      var orig_listener = listener; 
      listener = function(event) { 
       var suggestion_selected = $(".pac-item-selected").length > 0; 
       if ((event.which == 13 || event.which == 9) && !suggestion_selected) { 
        var simulated_downarrow = $.Event("keydown", { 
         keyCode: 40, 
         which: 40 
        }); 
        orig_listener.apply(input, [simulated_downarrow]); 
       } 

       orig_listener.apply(input, [event]); 
      }; 
     } 



     _addEventListener.apply(input, [type, listener]); 
    } 

    input.addEventListener = addEventListenerWrapper; 
    input.attachEvent = addEventListenerWrapper; 

    var autocomplete = new google.maps.places.Autocomplete(input); 

})(pac_input); 

$('#txtPlaces').blur(function(e){ 
    selectFirstAddress(pac_input); 
}); 


////Ensuring that only Google Maps adresses are inputted 
function selectFirstAddress (input) { 
    google.maps.event.trigger(input, 'keydown', {keyCode:40}); 
    google.maps.event.trigger(input, 'keydown', {keyCode:13}); 
} 

这将正确地对Enter或Tab键以及用户选择另一个字段作出反应。希望这可以帮助!

-1

WTF,人?!?!?谷歌通常没有正确的信息。不要将他们的自动完成API用于强制选择!这就是为什么一大堆网站不允许我使用他们的服务:我住的地方是谷歌把地址锁定的地方。我并不孤单。

如果您必须使用USPS地址验证 - 至少他们是最新的。理想情况下允许自动完成,但允许手动覆盖;不要为了我们这么多人而懒惰,让生活变得困难!

相关问题