0

我在一个输入字段上有两个事件监听器。一个会在更改时调用,一个会在您单击 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

感谢您的任何回答!

4

2 回答 2

2

第一种方法:监听keyup事件而不是change,确定处理程序中的按键类型(过滤掉箭头键、制表符和返回键),并且仅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()
  ...

change当多个事件被快速触发时,这也可以防止多次调用。您可能需要将超时(此处:100 毫秒)调整为合适的值。

于 2012-04-18T21:32:00.203 回答
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 感到抱歉,但我不喜欢咖啡脚本:/

于 2012-04-18T20:33:18.593 回答