我在一个输入字段上有两个事件监听器。一个会在更改时调用,一个会在您单击 Google 的自动完成下拉菜单时调用。我的问题是,当您单击此类自动完成时,两个处理程序都会被调用并向 google api 发出请求。
我尝试绑定 onchange 事件并在 google 自动完成 ajax 调用被触发时取消绑定它,但首先执行 onchange 事件。所以它不会解绑。那么,是否有可能检测用户是手动输入还是通过自动提示输入的?我只想在用户进行手动输入并且不使用自动完成下拉菜单时才执行“请求位置”功能。我尝试了其他一些事件处理程序,例如“focus-out”,但没有成功。
此行进行绑定:
autoCompleteInput.on "change", requestlocation
这是被调用的函数:
requestlocation = () ->
address = autoCompleteInput.val()
geocoder = new google.maps.Geocoder()
geocoder.geocode
address: address, (results, status) ->
if status is google.maps.GeocoderStatus.OK
if results[0].address_components.length > 1
city = results[0].address_components[0].long_name
country = results[0].address_components[results[0].address_components.length-1].long_name
setHiddenFields results[0].geometry.location.lat(), results[0].geometry.location.lng(), city, country
autoCompleteInput.val(city+", "+country)
else
city = null
country = results[0].address_components[0].long_name
setHiddenFields results[0].geometry.location.lat(), results[0].geometry.location.lng(), city, country
autoCompleteInput.val(country)
setMarker new google.maps.LatLng(latInput.val(), lngInput.val())
else
console.log "Geocode was not successful for the following reason: " + status
这是自动完成处理程序发出请求的代码:
google.maps.event.addListener autocomplete, 'place_changed', ->
autoCompleteInput.off "change", requestlocation
place = autocomplete.getPlace()
if !!place.geometry
autoCompleteInput.attr "data-valid", "true"
setMarker place.geometry.location
address = place.address_components
if address.length > 1
setHiddenFields place.geometry.location.lat(), place.geometry.location.lng(), address[0].long_name, address[address.length-1].long_name
else
setHiddenFields place.geometry.location.lat(), place.geometry.location.lng(), null, address[0].long_name
else
autoCompleteInput.attr "data-valid", "false"
autoCompleteInput.on "change", requestlocation
感谢您的任何回答!