如何在调用另一个时禁用事件处理程序

时间:2012-04-18 20:27:52

标签: javascript jquery google-maps coffeescript

我在一个输入字段上有两个事件侦听器。当您点击谷歌的自动完成下拉菜单时,会有一个被称为变更。我的问题是当你点击这样一个自动完成时,两个处理程序都被调用并向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

感谢您的回答!

2 个答案:

答案 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:/