javascript - 使用 ENTER 提交表单与单击提交按钮时的不同行为

标签 javascript jquery html forms google-maps

我有一个 HTML 表单输入元素,它使用 SearchBox来自 Google Maps Places API 的自动完成功能。在我的 JavaScript 中,我创建了一个 SearchBox 实例,如下所示:

var input = $('#spotsearch')[0];  // Refers to a form input with type="text" in my HTML
searchBox = new google.maps.places.SearchBox(input);

稍后在我的 JavaScript 中,我有以下内容:

$('#searchform').submit(function () {
    var places = searchBox.getPlaces();
    if (places) {
        var spotLat = searchBox.getPlaces()[0].geometry.location.lat();
        var spotLng = searchBox.getPlaces()[0].geometry.location.lng();
        $('#latitude').val(spotLat);
        $('#longitude').val(spotLng);
    }

});

这是我的问题:选择完成候选后,当我通过单击表单的提交按钮提交表单时,一切都按预期进行,并且 places 将引用具有单个对象的数组。但是,如果我通过按 ENTER 提交表单,匿名函数仍然会被调用,但地方返回一个空数组。在这两种情况下,发送的请求似乎完全相同。我在这里缺少什么?

我是 JavaScript 和 Goggle Maps API 的新手,所以我不确定我的错误源自何处。我的直觉是,这可能与某种时间安排有关,但这实际上只是一种模糊的预感。任何建议,将不胜感激。谢谢!

编辑:

为了提供更多细节,这是我的整个脚本:

var searchBox;
var places;
function initSearchBox() {
    var KCLatLng = new google.maps.LatLng({lat: 39.093201, lng: -94.573419});
    var bounds = new google.maps.LatLngBounds(KCLatLng);

    var input = $('#spotsearch')[0];
    searchBox = new google.maps.places.SearchBox(input);
    searchBox.setBounds(bounds);

    $('#searchform').submit(function () {
        var places = searchBox.getPlaces();
        if (places) {
            var spotLat = searchBox.getPlaces()[0].geometry.location.lat();
            var spotLng = searchBox.getPlaces()[0].geometry.location.lng();
            $('#latitude').val(spotLat);
            $('#longitude').val(spotLng);
        }

    });
}
当我加载 Goggle Maps API 时,

initSearchBox 将作为 callback 参数传递。

我也尝试过这样做:

var searchBox;
var places;
function initSearchBox() {
    var KCLatLng = new google.maps.LatLng({lat: 39.093201, lng: -94.573419});
    var bounds = new google.maps.LatLngBounds(KCLatLng);

    var input = $('#spotsearch')[0];
    searchBox = new google.maps.places.SearchBox(input);
    searchBox.setBounds(bounds);
    searchBox.addListener('places_changed', function() {
        var places = searchBox.getPlaces();
        if (places) {
            var spotLat = searchBox.getPlaces()[0].geometry.location.lat();
            var spotLng = searchBox.getPlaces()[0].geometry.location.lng();
            $('#latitude').val(spotLat);
            $('#longitude').val(spotLng);
        }
    });
}

但这给了我相同的结果(点击 ENTER 不会设置 #latitude#longitude 的值,但单击提交按钮执行)。

这是我的表单的 HTML(使用 Django 模板和 Bootstrap):

<form method="get" id="searchform" action="{% url 'spot_search' %}"
      class="navbar-form navbar-left plain" role="search">
    <div class="form-group">
        <input id="spotsearch" type="text" class="form-control plain"
               placeholder="Search spots" name="search_query">
    </div>

    <button type="submit" class="btn btn-default plain">
        <span class="glyphicon glyphicon-search"></span> Search
    </button>
    <input id="latitude" name="latitude" type="hidden">
    <input id="longitude" name="longitude" type="hidden">
</form>

最佳答案

这是否被提交到服务器?如果是这样,这可能是一个竞争条件。表单在提交到服务器之前不会等待隐藏字段设置。无论您是在表单提交事件中还是在 SearchBox 的 places_changed 事件中设置值,您仍然需要阻止 Enter 键将表单提交到服务器,或者阻止表单通过用户操作提交,以便您可以在设置数据后以编程方式提交。

要禁用回车键提交表单,请查看此处: Google Autocomplete - enter to select

要禁用表单提交,请按照 Juan 建议并包含 e.preventDefault();

关于javascript - 使用 ENTER 提交表单与单击提交按钮时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37733215/

相关文章:

javascript - 如何在 DC.js 系列图表中为不同的线条绘制不同的线条图案?

javascript - 比较javascript中不同实例的相似对象

Jquery - 选择器 - 选择 div 中的每个元素

javascript - 如何使用 jquery 获取所有 css 的设置?

javascript - 滑动时防止触摸启动

javascript - 使用javascript将文档标题更改为从数据库记录

javascript - 单击链接并将 ID 保存到变量

html - 我的输入和标签不是内联的

javascript - jquery 带定时器的下拉菜单

javascript - 如何将按钮与文本区域对齐