通过按Enter提交表单(不带提交按钮)


322

好吧,我正在尝试通过按Enter键而不是显示“提交”按钮来提交表单。我不希望尽可能地使用JavaScript,因为我希望所有功能都可以在所有浏览器上运行(我知道的唯一JS方式就是使用事件)。

现在,表单如下所示:

<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" style="height: 0px; width: 0px; border: none; padding: 0px;" hidefocus="true" />
</form>

哪个效果很好。当用户按下Enter键时,提交按钮将起作用,并且该按钮在Firefox,IE,Safari,Opera和Chrome中不显示。但是,我仍然不喜欢该解决方案,因为很难知道它是否适用于所有浏览器的所有平台。

谁能提出更好的方法?还是说它尽可能地好?


7
小点可能会减少CSS上的几个字符,通常会自动成为缩小器-您不需要零长度测量单位。0px = 0pt = 0em =
0em

@pwdst感谢您指出这一点-我来自Python界,因此“显式优于隐式”,并真的怀疑CSS是否是这种情况,或者CSS创建者是否有其他习惯用法?
ericmjl

2
零是此处规则的例外@ericmjl-0px == 0em == 0%== 0vh == 0vh等。在其他(非零)长度测量中,这不仅是不习惯的做法,而且违反不指定单位和单位的标准您会在用户代理(浏览器)中看到各种行为。参见developer.mozilla.org/zh-CN/docs/Web/CSS/lengthdrafts.c​​sswg.org/css-values-3/#lengths
pwdst

2
如有疑问,换句话说,输入一个明确的长度单位。
pwdst

3
虽然将单位加0当然不会有什么坏处,但是无论哪种语言,任何单位都不应该是100%有效的,实际上一直都是数学抽象。OTOH,拥有或不拥有它们的方便用法是传达以下信息:给定的属性是否“真的意味着为0,并保持这种状态”(无单位),与“现在事物恰好为零”,但可以根据口味进行调整;或其他...”(带单位)。
Sz。

Answers:


237

尝试:

<input type="submit" style="position: absolute; left: -9999px"/>

这会将waaay按钮推到屏幕的左侧。这样做的好处是,禁用CSS时,性能会下降。

更新-IE7的解决方法

正如布莱恩·唐宁(Bryan Downing +)所建议的,tabindex以防止制表符到达此按钮(由Ates Goral):

<input type="submit" 
       style="position: absolute; left: -9999px; width: 1px; height: 1px;"
       tabindex="-1" />

9
刚刚在IE7中尝试过此解决方案,结果与Erebus相同。以下代码对其进行了修复:position: absolute; width: 1px; height: 1px; left: -9999px;
Bryan Downing 2010年

84
骇人听闻的骇客:(为什么HTML最初是这样的?在这种情况下,Enter是否有充分的理由不起作用?
nornagon 2011年

28
@nornagon:如果您认为此骇客是可怕的,请随时提出一个不太可怕的骇客。HTML是什么……
Ates Goral

13
@MooseFactorytabindex="-1"
Ates

14
“好事是……禁用CSS时的正常降级”?!我的意思是,这确实很有效,但是“正常降级”部分只是营销策略。直到我从2002年开始找到此页面之前,我什至没有听说过它。没错,首页上唯一的 Google搜索结果“是在浏览器中禁用了CSS”是10年前的结果(考虑到这个答案是在2009年提出的,则是7)。
Vicky Chijwani

97

我认为您应该走Javascript路线,或者至少我会:

<script type="text/javascript">
// Using jQuery.

$(function() {
    $('form').each(function() {
        $(this).find('input').keypress(function(e) {
            // Enter pressed?
            if(e.which == 10 || e.which == 13) {
                this.form.submit();
            }
        });

        $(this).find('input[type=submit]').hide();
    });
});
</script>


<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" />
</form>

6
不错,经过测试,工作正常。但是在尝试这种操作之前,请记住,通过Javascript提交表单不会导致某些浏览器提供密码保存功能。
andyk

3
这将导致“提交”按钮出现一会儿(直到页面加载并运行JS)。
nornagon

15
还会触发一次按键来进行自动完成的选择,即,如果用户正在输入电子邮件地址,并且他/她通过点击Enter从浏览器的自动完成中选择了先前给定的一个,则您的表单将被提交。不是您的用户所期望的。
cburgmer 2012年

2
keydown从改用以keypress获得更广泛的支持,但是如果您希望支持Chrome e.preventDefault();if则还需要添加。
Campbeln'2

1
您可以使用@Campbeln .on('keypress'...).on()看起来像它的文档会.preventDefault()为您打电话。
jinglesthula

79

你尝试过这个吗?

<input type="submit" style="visibility: hidden;" />

由于大多数浏览器都能理解visibility:hidden,但实际上并不能像一样工作display:none,不过我猜应该没问题。我自己还没有真正测试过它,所以CMIIW。


3
仅有一件事visibility: hidden:正如您在w3schools中可以看到的那样,可见性:没有任何东西会影响布局。如果要避免此空白,则绝对定位的解决方案对我来说似乎更好。
loybert 2012年

8
您可以将两种解决方案结合使用:<input type="submit" style="visibility: hidden; position: absolute;" />
VaclavSir 2013年

2
该死,这在IE8中不起作用(它没有提交表单),因此上述解决方案胜出:position: absolute; left: -100px; width: 1px; height: 1px;
VaclavSir 2013年

31

没有提交按钮的另一个解决方案:

的HTML

<form>
  <input class="submit_on_enter" type="text" name="q" placeholder="Search...">
</form>

jQuery的

$(document).ready(function() {

  $('.submit_on_enter').keydown(function(event) {
    // enter has keyCode = 13, change it if you want to use another button
    if (event.keyCode == 13) {
      this.form.submit();
      return false;
    }
  });

});

1
诡异的把戏。您将按钮放入文本框!但是,由于该技巧适用于所有浏览器,因此我功劳了!
珍娜·叶

谢谢@JennaLeaf ;-)无论如何,我认为它并不那么奇怪-许多在线表单都用作提交按键的简单“触发”。一个示例可能是google搜索栏(也许他们不完全使用此代码,但可能类似)。
damoiser '16

16

对于以后希望看到此答案的任何人,HTML5都会为表单元素实现一个新属性hidden,该属性会自动应用于display:none您的元素。

例如

<input type="submit" hidden />

尽管它似乎可以与台式机Chrome一起使用,但似乎不适用于iPhone上的Chrome或Safari。
乌尔夫·亚当斯

@UlfAdams它可与iPhone 12.1.2上的Chrome和Safari一起使用。
马修·坎贝尔

13

使用以下代码,可以解决所有3种浏览器(FF,IE和Chrome)中的问题:

<input  type="submit" name="update" value=" Apply " 
    style="position: absolute; height: 0px; width: 0px; border: none; padding: 0px;"
    hidefocus="true" tabindex="-1"/>

将上面的行添加为代码中的第一行,并带有适当的name和value值。


7

代替您当前用来隐藏按钮的技巧visibility: collapse;,在style属性中进行设置要简单得多。但是,我仍然建议使用一些简单的Javascript提交表单。据我了解,如今对此类事物的支持无处不在。


7

只需将hidden属性设置为true即可:

<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" hidden="true" />
</form>

4
隐藏的属性将通过按Enter禁用提交。
66Ton99 2013年

@ 66Ton99只需在FF中测试。它不会禁用提交功能
Eugen Konkov

1
“它在我的机器上工作”;)浏览器比firefox多得多。可以说,人们需要一种能够跨浏览器可靠运行的解决方案。
费利克斯·加侬-格雷尼尔

可在Chrome 63上使用
piotr_cz

目前无法在iPhone上的Chrome或Safari中使用。
乌尔夫·亚当斯

7

最优雅的方法是保留提交按钮,但将其边框,填充和字体大小设置为0。

这将使按钮尺寸为0x0。

<input type="submit" style="border:0; padding:0; font-size:0">

您可以自己尝试一下,通过为元素设置轮廓,您将看到一个点,该点是“包围” 0x0 px元素的外部边界。

不需要可见性:隐藏,但如果它使您晚上入睡,也可以将其放入混合中。

JS小提琴


5

如果“提交”按钮不可见,并且表单有多个字段,则IE不允许按ENTER键提交表单。提供1x1像素的透明图像作为提交按钮,以提供所需的内容。当然,它会占用布局的一个像素,但请注意隐藏它所要做的事情。

<input type="image" src="img/1x1trans.gif"/>

4

这是我的解决方案,已在Chrome,Firefox 6和IE7 +中进行了测试:

.hidden{
    height: 1px;
    width: 1px;
    position: absolute;
    z-index: -100;
}

似乎IE8不喜欢position:absolute,它不提交。
maxxyme 2014年

4
<input type="submit" style="display:none;"/>

效果很好,它是您要实现的最明确的版本。

请注意,有之间的差异display:nonevisibility:hidden其他表单元素。




2

对于那些与IE有问题的人,以及其他人。

{
    float: left;
    width: 1px;
    height: 1px;
    background-color: transparent;
    border: none;
}

我仍将使用position:absolute,float影响布局。
SuperDuck

似乎IE8不喜欢position:absolute,它不提交。我使用:
maxxyme,2014年

与相同float: left;,删除后将提交。
maxxyme 2014年

2

你也可以尝试这个

<INPUT TYPE="image" SRC="0piximage.gif" HEIGHT="0" WIDTH="0" BORDER="0">

您可以添加宽度/高度= 0像素的图像


1
重要提示:您必须使用有效的图像URL或Firefox会显示您的网页上“提交查询”文本
PH。

2
如果添加存在的图像并将高度和宽度设置为零,或者添加不存在的图像,则浏览器将不得不对资源进行浪费的GET请求。
2013年

2

我使用大量的UI框架。他们中的许多人都有内置的类,您可以使用它们在视觉上隐藏事物。

引导程序

<input type="submit" class="sr-only" tabindex="-1">

角材料

<input type="submit" class="cdk-visually-hidden" tabindex="-1">

创建这些框架的精明头脑将这些样式定义如下:

.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

.cdk-visually-hidden {
    border: 0;
    clip: rect(0 0 0 0);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute;
    width: 1px;
    outline: 0;
    -webkit-appearance: none;
    -moz-appearance: none;
}

1

我将其添加到文档准备就绪的功能中。如果表单上没有提交按钮(我的所有Jquery对话框表单都没有提交按钮),请附加它。

$(document).ready(function (){
    addHiddenSubmitButtonsSoICanHitEnter();
});
function addHiddenSubmitButtonsSoICanHitEnter(){
    var hiddenSubmit = "<input type='submit' style='position: absolute; left: -9999px; width: 1px; height: 1px;' tabindex='-1'/>";
    $("form").each(function(i,el){
        if($(this).find(":submit").length==0)
            $(this).append(hiddenSubmit);
    });
}

0
input.on('keypress', function(event) {
    if ( event.which === 13 ) {
        form.submit();
        return false;
    }
});

-2

我用过:

<input class="hidden" type="submit" value="" 
onclick="document.getElementById('loginform').submit();"/>

和:

 .hidden {
        border:0;
        padding:0;
        font-size:0;
        width: 0px;
        height: 0px;
    }

在.css文件中。它对我来说也神奇。:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.