防止表单提交字段输入键keydown? [复制]

Posted

技术标签:

【中文标题】防止表单提交字段输入键keydown? [复制]【英文标题】:Prevent form submit on field enter key keydown? [duplicate] 【发布时间】:2012-08-07 13:17:22 【问题描述】:

我已经构建了一个监听器来防止表单在特殊情况下提交。

我正在使用谷歌地图自动完成 api,基本上我不想在用户按 Enter 并显示“推荐结果框”时提交表单。当用户按下回车键从下拉框中选择一个值而不是提交表单时。

我已经构建了一个可以正确捕获事件的侦听器,但我不知道如何防止表单被提交。

$('body').live('keydown', function(e) 
    if($(".pac-container").is(":visible") && event.keyCode == 13) 
        e.preventDefault(); // Prevent form submission
        
    );

我尝试使用 e.preventDefault();但它仍然提交表单。表单ID为:updateAccountForm

我怎样才能防止它发生?

编辑: 我必须指出,似乎直接在搜索输入上侦听按键与 Google API 使自动完成功能无效。所以没有$('input#search') keydown/keypress 是可能的

【问题讨论】:

e.stopPropagation() 和/或return false; 之后,解决问题? 我现在看到你在 body 上添加了监听器。所以keypress事件在输入提交后被触发。尝试查看.bind 并查看第三个参数preventBubble(我不确定,现在无法测试)。否则,我认为您应该在输入字段中附加侦听器或在表单上附加提交侦听器。 老实说,我无法从您的建议中弄清楚该怎么做。请将其添加为问题,我将对其进行测试!谢谢 完成!我已经过测试并且可以正常工作。 您检查过event.keyCode 中确实有任何内容吗?看起来你正在使用 jQuery,所以你应该检查e.which 【参考方案1】:

解决方案实际上非常简单。所有听众似乎都失败了,但添加:

onkeydown="if($('.pac-container').is(':visible') && event.keyCode == 13) event.preventDefault();"

直接输入就可以了。

【讨论】:

请原谅我的无知,但是当您说“直接将其添加到输入”时,您的意思是什么? 他的意思是直接将其添加到输入标签中:【参考方案2】:

我认为你应该尝试使用这样的东西......包装检查你的容器的可见性

$('body').keypress(function(e) 

  if (e.keyCode == '13') 
     e.stopPropagation()

   
);​

文章here有很好的解释。

【讨论】:

这对我不起作用,因为在触发 keypress 事件时 .pac-container 已经消失(我注意到您没有原始海报条件来检查 .pac-容器可见性)。因此,按照这种方式,所有 带有 Enter 的表单提交将被拒绝,这将不会真正起作用。似乎唯一有效的答案是下面的 Liso22 建议。 另外if子句也有错误,keyCode不是字符串:if (e.keyCode == 13)【参考方案3】:

试试这个

$('body').live('keydown', function(e) 
    if($(".pac-container").is(":visible") && e.keyCode == 13) 
        e.stopPropagation(); // Prevent form submission
    
);

请查看e.keyCode 而不是event.keyCode 和e.stopPropagation() 而不是e.preventDefault

【讨论】:

【参考方案4】:

为了防止回车键在Google Places API autocomplete's text field 上提交表单,我需要一个 keydown 处理程序...

$(document).on('keydown', '#my-autocomplete', function(e) 
    if (e.which == 13) 
      $('#my-autocomplete').show();
      return false;
    
);

... 和一个 place_changed 侦听器在实例化后附加到自动完成功能:

var my_autocomplete = new google.maps.places.Autocomplete(/*...*/);
google.maps.event.addListener(my_autocomplete, 'place_changed', function() 
    var place = my_autocomplete.getPlace();
    if (!place.place_id)  return; 
);

没关系,但它可能,这个解决方案在 jQuery Mobile Web 应用程序中工作。

【讨论】:

我认为上面的第一个代码示例就足够了,因为它允许您定位特定元素而不仅仅是整个文档。您可能希望在特定元素上的每个“除外”处使用 enter。不知道为什么没有投票。我想 OP 需要谷歌地图的一些功能,因为我不需要这样的解决方案,除了目标和元素并在按下“Enter/Return”时阻止提交。【参考方案5】:

阻止表单提交

 <form method="post">
    <input type="text" id="search">

    </form>
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
    <script>
        $('input#search').keypress(function(e) 
          if (e.keyCode == '13') 
             e.preventDefault();

           
        );​
    </script>

【讨论】:

在我应该指出之前我已经尝试过了。如果您直接向其中添加按键侦听器,Google API 似乎会有意或无意地使自动完成输入无效。这就是我试图倾听身体的原因。【参考方案6】:

相关问题:Google maps Places API V3 autocomplete - select first option on enter

当我使用 Google 地图自动完成框时,我想让“输入”和“选项卡”选择第一项。我按照上面链接的@amirnissim 的解决方案来模拟向下箭头键的按下,如果从输入元素按下输入/制表符。

当我对其进行编码时,我没有将这些输入作为表单的一部分。我不知道如何防止表单在输入键上发送(事实上我就是这样发现这个问题的)但是当我使用自动完成时,我的输入不是表单的一部分。

【讨论】:

以上是关于防止表单提交字段输入键keydown? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何防止表单提交在字段上点击输入? [复制]

停止输入/返回键提交表单[重复]

如何通过按键盘上的一个键来防止调用多个 KeyDown 事件?

HTML文本输入事件

如何防止在 jQuery 中提交 Enter 键? [复制]

防止表单重复提交的解决方案整理