【问题标题】:google maps api autocomplete on blur/focusout?谷歌地图API自动完成模糊/聚焦?
【发布时间】:2018-05-08 19:31:56
【问题描述】:

所以我使用 google maps api 在后端填写一些信息,但如果用户没有“点击”下拉选项,则后端永远不会填充数据。

我在这里找到了堆栈溢出的解决方法:link,但在模糊/聚焦时没有任何反应。

let address = document.getElementById('inputAddress');
(function pacSelectFirst(input) {
    // store the original event binding function
    var _addEventListener = (input.addEventListener) ? input.addEventListener : input.attachEvent;

    function addEventListenerWrapper(type, listener) {
        // Simulate a 'down arrow' keypress on hitting 'return' when no pac suggestion is selected,
        // and then trigger the original listener.
        if (type == "keydown" || type == 'blur') {
            var orig_listener = listener;
            listener = function(event) {
                var suggestion_selected = $(".pac-item-selected").length > 0;
                // if [enter] or [tab] is pressed
                if ((event.which == 13 || event.which == 9) && !suggestion_selected) {
                    var simulated_downarrow = $.Event("keydown", {
                        keyCode: 40,
                        which: 40
                    });
                    orig_listener.apply(input, [simulated_downarrow]);
                }

                orig_listener.apply(input, [event]);
            };
        }

        _addEventListener.apply(input, [type, listener]);
    }

    input.addEventListener = addEventListenerWrapper;
    input.attachEvent = addEventListenerWrapper;
    var autocomplete = new google.maps.places.Autocomplete(input);

})(address);

我了解代码在做什么。当您单击 tab 或 enter 时,它会模拟向下箭头键。我尝试添加一个监听器以进行模糊,但没有任何效果。该事件仍会被触发,但不会选择或更新。

希望对这种情况有所帮助。谢谢!

【问题讨论】:

    标签: javascript google-maps google-maps-api-3


    【解决方案1】:

    inputAddress 是您的自动完成输入,您可以执行以下操作:

    // Trigger search on blur
    document.getElementById('inputAddress').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("inputAddress"), 'blur', function() {
    
        google.maps.event.trigger(this, 'focus', {});
        google.maps.event.trigger(this, 'keydown', {
            keyCode: 13
        });
    });
    

    仅此一项就会干扰用户通过鼠标单击选择建议。因此,为了防止这种情况,您需要进行更多检查。下面是一个完整的例子。阅读代码 cmets 了解更多信息。

    如果您在项目中使用 jQuery,请查看 this answer,它的作用完全相同。

    function initialize() {
    
      var ac = new google.maps.places.Autocomplete(
        (document.getElementById('inputAddress')), {
          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("inputAddress"), '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;
    }
    #inputAddress {
      width: 300px;
    }
    <script src="https://maps.googleapis.com/maps/api/js?libraries=places&callback=initialize&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk" async defer></script>
    <input id="inputAddress" placeholder="Enter your address" type="text"></input>

    【讨论】:

    • 这行不通。当您模糊输入时,即使下拉菜单中有可用选项,它也会一直显示“没有可用的详细信息”。
    • 它有效。你只是不明白它的作用。输入内容,使用键盘箭头选择一个地点,然后通过标签或鼠标点击模糊,然后选择该位置。
    • 如果用户在文本输入上按 Enter 键(并且鼠标光标未悬停在 pac-container 上),这似乎无法解决这种情况。如果用户在下拉菜单中点击 Enter,它会正常工作。
    • ... 这又是 不是 OP 要求的,而 不是 我所说的代码所做的。
    【解决方案2】:

    您是否检查过输入字段是否绑定了多个下拉菜单? 其他实例

    var autocomplete = new google.maps.places.Autocomplete(input);
    

    其他地方?原来我们有三个。取出其中两个后,您的解决方案对我有用。

    【讨论】:

      猜你喜欢
      • 2014-06-29
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多