Google自动填充 - 输入以选择

时间:2012-07-09 01:48:15

标签: autocomplete

我为HTML表单的文本字段设置了 Google自动填充功能,并且它运行正常。

然而,当出现建议列表,并且您使用箭头滚动并选择使用回车时,它会提交表单,但仍有待填写的框。如果您单击以选择建议它可以正常工作,但是按输入提交。

我该如何控制?如何阻止输入提交表单,而是从自动填充中选择建议?

谢谢! {S}

10 个答案:

答案 0 :(得分:102)

你可以使用preventDefault来阻止输入被点击时提交的表单,我使用了这样的内容:

  var input = document.getElementById('inputId');
  google.maps.event.addDomListener(input, 'keydown', function(event) { 
    if (event.keyCode === 13) { 
        event.preventDefault(); 
    }
  }); 

答案 1 :(得分:50)

使用Google事件处理似乎是正确的解决方案,但它对我不起作用。这个jQuery解决方案对我有用:

$('#inputId').keydown(function (e) {
  if (e.which == 13 && $('.pac-container:visible').length) return false;
});

.pac-container是包含自动填充匹配的div。我们的想法是,当匹配可见时,Enter键将只选择活动匹配。但是当比赛被隐藏时(即选择了一个地方),它将提交表格。

答案 2 :(得分:17)

我合并了@sren和@mmalone的前两个答案来制作这个:

var input= document.getElementById('inputId');
google.maps.event.addDomListener(input, 'keydown', function(e) { 
    if (e.keyCode == 13 && $('.pac-container:visible').length) { 
        e.preventDefault(); 
    }
}); 

在页面上完美运行。当建议容器(.pac-container)可见时,防止提交表单。现在,当用户按下回车键时,会选择自动完成下拉列表中的一个选项,他们必须再次按下该按钮才能提交表单。

我使用此解决方法的主要原因是因为我发现如果在选择选项后立即发送表单,则通过回车键,纬度和经度值不会足够快地传递到其隐藏的表单元素中。

归功于原始答案。

答案 3 :(得分:5)

这个对我有用:

dots: false,

可以轻松地从ES6转换为任何与浏览器兼容的代码。

答案 4 :(得分:4)

我对@ sren的回答的问题是它总是阻止提交事件。我喜欢@mmalone的答案,但它表现得随机,就像有时当我点击ENTER选择位置时,处理程序在隐藏容器后运行。所以,这就是我最终做的事情

var location_being_changed,
    input = document.getElementById("js-my-input"),
    autocomplete = new google.maps.places.Autocomplete(input),
    onPlaceChange = function () {
        location_being_changed = false;
    };

google.maps.event.addListener( this.autocomplete,
                               'place_changed',
                               onPlaceChange );

google.maps.event.addDomListener(input, 'keydown', function (e) {
    if (e.keyCode === 13) {
        if (location_being_changed) {
            e.preventDefault();
            e.stopPropagation();
        }
    } else {
        // means the user is probably typing
        location_being_changed = true;
    }
});

// Form Submit Handler
$('.js-my-form').on('submit', function (e) {
    e.preventDefault();
    $('.js-display').text("Yay form got submitted");
});
<p class="js-display"></p>
<form class="js-my-form">
    <input type="text" id="js-my-input" />
    <button type="submit">Submit</button>
</form>

<!-- External Libraries -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="//maps.googleapis.com/maps/api/js?sensor=false&libraries=places"></script>

该标志确保如果位置正在改变&amp;用户点击进入,事件被阻止。最终,Google地图的false事件将该标记设置为place_changed,然后允许在点击回车键时提交表单。

答案 5 :(得分:1)

这是一个对我有用的简单代码(不使用jquery)。

const googleAutcompleteField = this.renderer.selectRootElement(this.elem.nativeElement);
this.selectOnEnter(googleAutcompleteField);

遵循上面的代码,这段代码用于实现google maps自动完成功能(带有或不带有此问题中寻求的Enter键功能):

this.autocomplete = new google.maps.places.Autocomplete(googleAutcompleteField, this.googleMapsOptions);
this.autocomplete.setFields(['address_component', 'formatted_address', 'geometry']);
this.autocomplete.addListener('place_changed', () => {
  this.zone.run(() => {
    this.googleMapsData.emit([this.autocomplete.getPlace()]);
  })
})

selectOnEnter(在上面的第一段代码中被调用)定义:

selectOnEnter(inputField) {
  inputField.addEventListener("keydown", (event) => {
    const selectedItem = document.getElementsByClassName('pac-item-selected');
    if (event.key == "Enter" && selectedItem.length != 0) {
      event.preventDefault();
    }
  })
}

此代码使Google Maps自动填充字段选择用户使用向下箭头按键选择的项目。一旦用户按下Enter键选择一个选项,就不会发生任何事情。用户必须再次按Enter才能触发onSubmit()或其他命令

答案 6 :(得分:0)

我调整了Alex的代码,因为它在浏览器中崩溃了。这对我来说非常适合:

google.maps.event.addDomListener(
    document.getElementById('YOUR_ELEMENT_ID'),
    'keydown',
    function(e) {
          // If it's Enter
          if (e.keyCode === 13) {
            // Select all Google's dropdown DOM nodes (can be multiple)
            const googleDOMNodes = document.getElementsByClassName('pac-container');
            //If multiple nodes, prevent form submit.
            if (googleDOMNodes.length > 0){
                e.preventDefault();
            }
            //Remove Google's drop down elements, so that future form submit requests work.
            removeElementsByClass('pac-container');
          }
    }
);

function removeElementsByClass(className){
    var elements = document.getElementsByClassName(className);
    while(elements.length > 0){
        elements[0].parentNode.removeChild(elements[0]);
    }
}

答案 7 :(得分:0)

我已经尝试过以上简短的答案,但它们对我不起作用,而且我不想尝试它们的长答案,所以我创建了以下代码:对我来说工作得很好。 See Demo

假设这是您的表格:

<form action="" method="">
      <input type="text" name="place" id="google-places-searchbox" placeholder="Enter place name"><br><br>
      <input type="text" name="field-1" placeholder="Field 1"><br><br>
      <input type="text" name="field-2" placeholder="Field 2"><br><br>
      <button type="submit">Submit</button>
</form>

然后以下javascript代码将解决问题:

var placesSearchbox = $("#google-places-searchbox");

placesSearchbox.on("focus blur", function() {
    $(this).closest("form").toggleClass('prevent_submit');
});

placesSearchbox.closest("form").on("submit", function(e) {
    if (placesSearchbox.closest("form").hasClass('prevent_submit')) {
        e.preventDefault();
        return false;
    }
});

以下是HTML页面中完整代码的外观(请注意,您需要使用google api密钥替换YOUR_API_KEY):

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Prevent form submission when choosing a place from google places autocomplete searchbox</title>
</head>
<body>
  <form action="" method="">
      <input type="text" name="place" id="google-places-searchbox" placeholder="Enter place name"><br><br>
      <input type="text" name="field-1" placeholder="Field 1"><br><br>
      <input type="text" name="field-2" placeholder="Field 2"><br><br>
      <button type="submit">Submit</button>
  </form>

  <!-- jQuery -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

  <!-- Google Maps -->
  <!-- Note that you need to replace the next YOUR_API_KEY with your api key -->
  <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places"
     async defer></script>
  <script>
    var input = document.getElementById("google-places-searchbox");
    var searchBox = new google.maps.places.SearchBox(input);

    var placesSearchbox = $("#google-places-searchbox");

    placesSearchbox.on("focus blur", function() {
        $(this).closest("form").toggleClass('prevent_submit');
    });

    placesSearchbox.closest("form").on("submit", function(e) {
        if (placesSearchbox.closest("form").hasClass('prevent_submit')) {
            e.preventDefault();
            return false;
        }
    });
  </script>
</body>
</html>

答案 8 :(得分:0)

$("#myinput").on("keydown", function(e) {
if (e.which == 13) {

if($(".pac-item").length>0)
        {
            $(".pac-item-selected").trigger("click");
}

}

如果要选择第一个结果,请使用$('.pac-item:first').trigger('click');

答案 9 :(得分:0)

您可以在香草味中做

element.addEventListener('keydown', function(e) {
    const gPlaceChoices = document.querySelector('.pac-container')
    // No choices element ? 
    if (null === gPlaceChoices) {
        return
    }
    // Get choices visivility
    let visibility = window.getComputedStyle(gPlaceChoices).display
    // In this case, enter key will do nothing
    if ('none' !== visibility && e.keyCode === 13) {
        e.preventDefault();
     }
 })