【问题标题】:How to adapt Event DOM Listener to Google Maps JavaScript API v3.35如何使 Event DOM Listener 适应 Google Maps JavaScript API v3.35
【发布时间】:2018-12-21 08:52:19
【问题描述】:

我曾经使用以下代码来捕获用户的 Enter 键事件,如果用户没有选择任何一个(即没有 pac-item),则自动从自动完成结果(pac-items)中选择第一个结果标记为 pac-item-selected)。

var input = document.getElementById('pac-input')
var autocomplete = new google.maps.places.Autocomplete(input)

google.maps.event.addDomListener(input, 'keypress', function(e) {
    if (e.keyCode===13 && !e.triggered) {
        var suggestion_selected = document.querySelectorAll('.pac-item-selected').length > 0
        if (!isLatLngInInputBox && !suggestion_selected) {
            google.maps.event.trigger(this,'keydown',{keyCode:40})
            google.maps.event.trigger(this,'keydown',{keyCode:13,triggered:true})
        }
    }
})

但是,从 Google Maps JavaScript API v3.35 开始,我会在 google.maps.event.trigger(this,'keydown',{keyCode:40}) 的行中收到类似 Uncaught TypeError: a.stopPropagation is not a function 的错误。

结果,我查看了文档,发现 google.maps.event 的触发方法发生了变化。第三个参数现在声明为 eventArgs 而不是 var_args。

我试图弄清楚如何适应它并修改了如下代码:

google.maps.event.addDomListener(input, 'keypress', function(e) {
    console.log(e.key)
    if (e.key==="Enter" && !e.triggered) {
        var suggestion_selected = document.querySelectorAll('.pac-item-selected').length > 0
        if (!isLatLngInInputBox && !suggestion_selected) {
            google.maps.event.trigger(this,'keydown',{key:"ArrowDown"})
            google.maps.event.trigger(this,'keydown',{key:"Enter",triggered:true})
        }
    }
})

虽然 Enter 键可以完美捕捉,但 ArrowDown 键无法按预期工作。

事实上,我可以使用console.log(e.key) 捕获 ArrowDown 键,但实际上什么也没发生。另外,当我按下键盘上的 ArrowDown 键时,console.log(e.key) 没有捕捉到任何东西,这让我很困惑。

有没有人遇到过类似的问题?感谢您的任何建议!

【问题讨论】:

    标签: javascript google-maps-api-3


    【解决方案1】:

    使用new Event() 创建适当的事件对象作为第三个参数,并在addDomListener 中使用keydown 而不是keypress

    var input = document.getElementById('pac-input')
    var autocomplete = new google.maps.places.Autocomplete(input)
    google.maps.event.addDomListener(input, 'keydown', function(e) {
      var suggestion_selected = document.querySelectorAll('.pac-item-selected').length > 0
      if (suggestion_selected) {
        console.log(document.querySelectorAll('.pac-item-selected'));
      } else {
        if (e.key === "Enter" && !e.triggered) {
          var ex1 = new Event('keydown');
          ex1.code = "ArrowDown";
          ex1.key = "ArrowDown";
          ex1.keyCode = 40;
          google.maps.event.trigger(this, 'keydown', ex1);
    
          var ex2 = new Event('keydown');
          ex2.code = "Enter";
          ex2.key = "Enter";
          ex2.keyCode = 13;
          ex2.triggered = true;
          google.maps.event.trigger(this, 'keydown', ex2);
        }
      }
    });
    

    编辑:

    我在这里有一个工作小提琴https://jsfiddle.net/ergec/e6wsdb85/

    【讨论】:

    • 感谢您的建议。事实上,我曾尝试将keypress 更改为keydown,但没有成功。行为是一样的。
    • @CliffordYen 我测试了我的代码捕获所有键。这是小提琴jsfiddle.net/ergec/e6wsdb85
    • 令人印象深刻!为什么使用keydown 而不是keypress 会有所不同?不幸的是,虽然它可以捕获 ArrowDown 键,但它仍然无法从 Google 地图自动填充结果中选择第一个结果。
    • 我可以选择所有结果,包括第一个结果。您可以在 jsfiddle 上复制您的问题以便我检查吗?
    • 对不起 Ergec,我应该说“如果用户在没有选择任何结果的情况下按 Enter,它仍然无法自动选择第一个结果。”我知道我可以从自动完成结果中选择任何结果。对于 jsfiddle,如果不提供 Google Maps API 密钥,我似乎无法使自动完成工作。所以很抱歉,可能很难准确地显示问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2017-12-14
    • 2020-05-11
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多