ChatGPT解决这个技术问题 Extra ChatGPT

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

好吧,我正在尝试通过按 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>

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

任何人都可以提出更好的方法吗?或者这和它一样好?

可能会从您的 CSS 中删除一些字符并且通常会自动完成的小点是缩小器 - 您不需要用于零长度测量的单位。 0px = 0pt = 0em = 0em 等等。
@pwdst 感谢您指出这一点 - 我来自 Python 世界,所以“显式优于隐式”,并且真的想知道 CSS 中是否是这种情况,或者 CSS 创建者有不同的习惯用法?
零是这里规则的例外@ericmjl - 0px == 0em == 0% == 0vh == 0vh 等。在其他(非零)长度测量中,不指定单位和标准不仅是不好的做法,而且违反标准您会在用户代理(浏览器)中看到不同的行为。请参阅 developer.mozilla.org/en-US/docs/Web/CSS/lengthdrafts.csswg.org/css-values-3/#lengths
如果有疑问,换句话来说就是明确的长度单位。
虽然用 0 添加单位当然没有什么坏处,但无论语言如何,没有任何单位应该是 100% 有效的,事实上一直追溯到数学抽象。 OTOH,拥有与不拥有它们的一个方便用途是传达给定属性是否“真的意味着为 0,并保持这种方式”(无单位)与“那个东西现在恰好为零,但可能会根据口味进行调整;或其他...”(带单位)。

Y
Yangshun Tay

2022 年更新:改用这个

<input type="submit" hidden />

注意 - 过时的答案请不要使用 position: absolute in the year 2021+。建议改用 hidden 属性。否则,请往下看,然后选择一个更好、更现代的答案。

尝试:

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

这会将按钮向左推到屏幕外。这样做的好处是,当 CSS 被禁用时,你会得到优雅的降级。

更新 - IE7 的解决方法

正如 Bryan Downing + with tabindex 所建议的那样,以防止标签到达此按钮(由 Ates Goral 提供):

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

刚刚在 IE7 中尝试了这个解决方案,结果与 Erebus 相同。以下代码修复它:position: absolute; width: 1px; height: 1px; left: -9999px;
多么可怕的 hack :( 为什么 HTML 首先是这样的?在这种情况下是否有充分的理由让 enter 不起作用?
@nornagon:如果您觉得这个黑客很可怕,请随时提出一个不那么可怕的建议。 HTML 就是这样...
@MooseFactory tabindex="-1"
“好消息是……禁用 CSS 时的优雅降级”?!我的意思是,这很有效,但“优雅降级”部分只是营销策略。在我找到 this page from the year 2002 之前,我什至没有听说过它。没错,第一页上“css 在浏览器中被禁用”的唯一 Google 结果来自 10 年前(或者考虑到这个答案是在 2009 年提出的 7 )。
s
sanmai

我认为你应该走 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>

不错的一个,经过测试并且工作正常。但在尝试这样的事情之前,请记住通过 Javascript 提交表单不会导致某些浏览器提供密码保存内容。
这将导致提交按钮出现片刻(直到页面加载和 JS 运行)。
从自动完成中进行选择也会触发按键,即,如果用户正在输入电子邮件地址,并且他/她通过按回车键从浏览器的自动完成中选择了先前给定的地址,那么您的表单将提交。不是您的用户所期望的。
我从 keypress 切换到 keydown 以获得更广泛的支持,但如果您希望支持 Chrome,还需要在 if 之前添加 e.preventDefault();
@Campbeln 您也许可以改用 .on('keypress'...).on() 的文档看起来像是为您执行 .preventDefault() 调用。
s
strager

你试过这个吗?

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

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


关于 visibility: hidden 只有一件事:正如您在 w3schools 中所读到的,visibity:none 仍然会影响布局。如果你想避免这个空白,绝对定位的解决方案对我来说似乎更好。
您可以结合使用这两种解决方案:<input type="submit" style="visibility: hidden; position: absolute;" />
该死,这在 IE8 中不起作用(它不提交表单),所以上面的解决方案获胜:position: absolute; left: -100px; width: 1px; height: 1px;
d
damoiser

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

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;
    }
  });

});

诡异的把戏。你把你的按钮变成一个文本框!但是由于该技巧适用于所有浏览器,因此我已将其归功于您!
谢谢@JennaLeaf ;-) 无论如何,我认为这并不奇怪 - 许多在线表单都用作提交 keydown 的简单“触发”。一个例子可能是谷歌搜索栏(也许他们不完全使用这个代码,但可能类似的东西)。
P
Panomosh

对于将来查看此答案的任何人,HTML5 为表单元素实现了一个新属性 hidden,它会自动将 display:none 应用于您的元素。

例如

<input type="submit" hidden />

虽然它似乎适用于桌面 Chrome,但它似乎不适用于 iPhone 上的 Chrome 或 Safari。
@UlfAdams 它适用于 iPhone 12.1.2 上的 Chrome 和 Safari。
不幸的是,它还不能在 Safari 14.2 (macOS) 中运行
这正确地隐藏了提交按钮,但禁用了“输入时提交”。有谁知道这个的浏览器兼容性?查看 caniuse.com/hidden 并没有提供太多信息
E
Erik Funkenbusch

使用以下代码,这解决了我在所有 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"/>

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


j
jumpnett

只需将 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>

隐藏的属性将通过按 Enter 禁用提交。
@66Ton99 只需在 FF 中测试。它不会禁用提交
“它可以在我的机器上运行”;) 浏览器比 firefox 多得多。可以说,人们想要一种能够可靠地跨浏览器运行的解决方案。
适用于 Chrome 63
目前不适用于 iPhone 上的 Chrome 或 Safari。
N
Noldorin

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


Safari 将 visibility: collapse 解释为 visibility: hidden,因此该按钮仍会导致白色区域:caniuse.com/mdn-css_properties_visibility_collapse
呃,这很糟糕。苹果需要整理他们的狗屎。不仅违反了标准,而且违反了词语的直观含义。
W
Waltur Buerk

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

这将使按钮尺寸为 0x0。

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

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

不需要可见性:隐藏,但如果它让你晚上睡觉,你也可以把它混在一起。

JS Fiddle


i
iamandrewluca

HTML5解决方案

<input type="submit" hidden />

同上 - 不适用于 iPhone 上的 Chrome 或 Safari。
W
Winston Tamblyn

如果提交按钮不可见,并且表单有多个字段,IE 不允许按 ENTER 键提交表单。通过提供一个 1x1 像素的透明图像作为提交按钮,给它想要的东西。当然它会占用布局的一个像素,但是看看你必须做什么来隐藏它。

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

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

这很好用,它是您想要实现的最明确的版本。

请注意,对于其他表单元素,display:nonevisibility:hidden 之间存在差异。


C
Community

我使用一堆 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;
}

v
vjnrv

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

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

好像 IE8 不喜欢 position:absolute,它不提交。
S
Shahin Mammadzada

最简单的方法

<input type="submit" style="width:0px; height:0px; opacity:0;"/>

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

如果将处理程序添加到希望在输入时提交的每个输入,则此方法有效。顺便说一句,最好使用 if (event.key === "Enter") 来检查密钥是什么。
J
Jekis

对于那些对 IE 有问题的人和其他人也是如此。

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

我仍然会使用位置:绝对,浮动会影响布局。
好像 IE8 不喜欢 position:absolute,它不提交。我用:
float: left; 也一样,删除后,它会提交。
H
Hoodai

你也可以试试这个

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

您可以包含宽度/高度 = 0 px 的图像


重要提示:您必须使用有效的图片 URL,否则 Firefox 将在您的页面上显示“提交查询”文本
如果您添加一个存在的图像并将高度和宽度设置为零,或者添加一个不存在的图像,那么浏览器将不得不对资源进行浪费的 GET 请求。
s
seePatCode

我将它添加到文档准备好的功能中。如果表单上没有提交按钮(我所有的 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);
    });
}

M
Mario Petrovic

这是对我有用的代码,肯定会对您有所帮助

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

<script type="text/javascript">
  $(function () {
    $("form").each(function () {
      $(this)
        .find("input")
        .keypress(function (e) {
          if (e.which == 10 || e.which == 13) {
            this.form.submit();
          }
        });
      $(this).find("input[type=submit]").hide();
    });
  });
</script>