我在一个输入字段上有两个事件侦听器。当您点击谷歌的自动完成下拉菜单时,会有一个被称为变更。我的问题是当你点击这样一个自动完成时,两个处理程序都被调用并向google api发出请求。
我尝试绑定onchange事件并在google自动完成ajax调用被触发时取消绑定,但是首先执行onchange事件。所以它不会被解除束缚。 那么,是否有可能检测用户是手动输入还是通过自动保护输入?我想执行" requestlocation"仅在用户进行手动输入且未使用自动完成下拉列表时才起作用。 我尝试了其他一些事件处理程序,例如"焦点",但没有成功。
此行生成绑定:
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
感谢您的回答!
答案 0 :(得分:2)
第一种方法:听取keyup
事件而不是change
,确定处理程序中按键的类型(过滤掉箭头键,制表符和返回键)并仅调用{{1}如果发生了适当的变化。可能无法正常工作,因为文本可以粘贴到输入字段中,不会触发任何键事件。
接下来尝试:使用小超时并在自动完成事件触发时停止。
requestlocation
在自动完成处理程序中,您应该终止正在运行的超时并执行通话:
autocomplete.on "change", ->
# stop previous timeouts
clearTimeout autocomplete.data('timeout')
# start a new timeout and store reference
timeout = setTimeout requestlocation, 100
autocomplete.data timeout: timeout
当快速触发多个google.maps.event.addListener autocomplete, 'place_changed', ->
# stop any running timeout
clearTimeout autocomplete.data('timeout')
# perform your autocompletion calls
place = autocomplete.getPlace()
...
事件时,这也可以防止多次调用。您可能需要将超时(此处:100ms)调整为适合的值。
答案 1 :(得分:0)
我不知道“请求位置”是怎样的。但是如何检查更改事件的不同事件属性。 (event.target / event.currentTarget)我现在无法测试它,但也许你可以发现它有所不同。只是一个想法
function requestlocation(event) {
console.log(event.target, event.currentTarget);
}
var timeout;
autoCompleteInput.on("input", function() {
clearTimeout(timeout);
timeout = setTimeout(requestlocation, 100);
});
抱歉普通的javascript,但我不是coffeescript:/