【问题标题】:Google Autocomplete Places API not triggering event on change via TABGoogle Autocomplete Places API 未通过 TAB 触发更改事件
【发布时间】:2015-03-19 11:27:36
【问题描述】:

根据 Google Autocomplete Places API 文档,getPlace() 调用应该返回一个包含所有位置数据的 Places 对象,或者,如果该位置不存在(即 - 用户忽略了建议),它应该返回一个存根仅填充了 Places 对象的 name 元素。但是,它仅在用户按 ENTER 时执行后一种操作,而不是当他们 TAB 离开该字段时。

我尝试查看更改事件,keyupkeydown 事件。我尝试在模糊等情况下使用keycode 13 触发keydown 事件等等。似乎没有任何效果。

有人解决过这个问题吗?很明显,用户会在表单中使用标签,而且他们总是有可能忽略这些建议。

【问题讨论】:

  • 你应该总是发布你的代码或者你尝试编码的东西。

标签: javascript jquery google-maps-api-3 dom-events


【解决方案1】:

pac-input 作为您的地点搜索输入,您可以执行以下操作:

// Trigger search on blur
document.getElementById('pac-input').onblur = function () {

    google.maps.event.trigger(this, 'focus', {});
    google.maps.event.trigger(this, 'keydown', {
        keyCode: 13
    });
};

或者使用谷歌地图事件监听器:

// Trigger search on blur
google.maps.event.addDomListener(document.getElementById("pac-input"), 'blur', function() {

    google.maps.event.trigger(this, 'focus', {});
    google.maps.event.trigger(this, 'keydown', {
        keyCode: 13
    });
});

编辑:如 cmets 中所述,这与用户通过鼠标单击选择地点的“正常行为”相混淆。

下面是一个使用纯 Javascript 的完整示例。对于(更简单的)jQuery 解决方案,请查看@ChrisSnyder's answer

function initialize() {

  var ac = new google.maps.places.Autocomplete(
    (document.getElementById('autocomplete')), {
      types: ['geocode']
    });

  ac.addListener('place_changed', function() {

    var place = ac.getPlace();

    if (!place.geometry) {

      // User entered the name of a Place that was not suggested and
      // pressed the Enter key, or the Place Details request failed.
      console.log("No details available for input: '" + place.name + "'");
      return;
    }

    console.log("You selected: '" + place.formatted_address + "'");
  });

  // Trigger search on blur
  google.maps.event.addDomListener(document.getElementById("autocomplete"), 'blur', function() {

    // Find the pac-container element
    var pacContainer = nextByClass(this, 'pac-container');

    // Check if we are hovering on one of the pac-items
    // :hover propagates to parent element so we only need to check it on the pac-container
    // We trigger the focus and keydown only if :hover is false otherwise it will interfere with a place selection via mouse click
    if (pacContainer.matches(':hover') === false) {

      google.maps.event.trigger(this, 'focus', {});
      google.maps.event.trigger(this, 'keydown', {
        keyCode: 13
      });
    }

  });
}

function hasClass(elem, cls) {
  var str = " " + elem.className + " ";
  var testCls = " " + cls + " ";
  return (str.indexOf(testCls) != -1);
}

function nextByClass(node, cls) {
  while (node = node.nextSibling) {
    if (hasClass(node, cls)) {
      return node;
    }
  }
  return null;
}
#autocomplete {
  width: 300px;
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=places&callback=initialize&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk" async defer></script>
<input id="autocomplete" placeholder="Enter your address" type="text"></input>

【讨论】:

  • 谢谢@MrUpsideDown。抱歉没有发布代码,当时不在我的电脑上。后一种选择效果更好。尝试了 addListener,但忘记了 addDomListener。再次感谢!
  • 请注意,这会导致用户单击下拉列表中的项目。
【解决方案2】:

以下内容扩展了@MrUpsidown 的解决方案,但试图避免在用户单击下拉列表中的项目时惹恼用户mentioned by @Jkk.jonah

// Trigger search on blur
google.maps.event.addDomListener(document.getElementById("pac-input"), 'blur', function() {
  if (jQuery('.pac-item:hover').length === 0 ) {
    google.maps.event.trigger(this, 'focus', {});
    google.maps.event.trigger(this, 'keydown', {
        keyCode: 13
    });
  } 
});

【讨论】:

  • 到目前为止,我在所有有关此问题的威胁中都有最佳答案。我已经处理这个问题好几个星期了,根本没有找到优雅的解决方案,这似乎工作得很好!
  • 确实,这里的解决方案很好。
【解决方案3】:

显然发生了一些变化,上面的代码在最后几天不起作用,控制台中出现了以下异常

 undefined is not an object (evaluating 'a.handled=!0')

需要在焦点事件的触发器上添加一个空对象

var inputSearch = document.getElementById('pac-input');

google.maps.event.trigger(inputSearch, 'focus', {})
google.maps.event.trigger(inputSearch, 'keydown', {
    keyCode: 13
});

【讨论】:

  • 很好看。我已经调整了我的答案。谢谢!
猜你喜欢
  • 2015-06-26
  • 2017-06-12
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
相关资源
最近更新 更多