在文本框中的 Enter 键上使用 JavaScript 触发按钮单击

IT技术 javascript htmlbutton
2021-02-02 08:16:05

我有一个文本输入和一个按钮(见下文)。在文本框中按下键时,如何使用 JavaScript触发按钮的单击事件Enter

我的当前页面上已经有一个不同的提交按钮,所以我不能简单地将该按钮设为提交按钮。并且,我希望Enter在这个文本框中按下键时单击该特定按钮,别无其他。

<input type="text" id="txtSearch" />
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />
6个回答

在 jQuery 中,以下内容将起作用:

$("#id_of_textbox").keyup(function(event) {
    if (event.keyCode === 13) {
        $("#id_of_button").click();
    }
});

$("#pw").keyup(function(event) {
    if (event.keyCode === 13) {
        $("#myButton").click();
    }
});

$("#myButton").click(function() {
  alert("Button code executed.");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Username:<input id="username" type="text"><br>
Password:&nbsp;<input id="pw" type="password"><br>
<button id="myButton">Submit</button>

或者在普通的 JavaScript 中,以下内容将起作用:

document.getElementById("id_of_textbox")
    .addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        document.getElementById("id_of_button").click();
    }
});

document.getElementById("pw")
    .addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        document.getElementById("myButton").click();
    }
});

function buttonCode()
{
  alert("Button code executed.");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Username:<input id="username" type="text"><br>
Password:&nbsp;<input id="pw" type="password"><br>
<button id="myButton" onclick="buttonCode()">Submit</button>

使用的问题keydown是按住 enter 会一遍又一遍地触发事件。如果您附加到keyup事件,它只会在释放键后触发。
2021-03-15 08:16:05
keydownnotkeyup是更好的事件使用。此外,如果您正在使用 asp.net,您将不得不return false在最后阻止 asp.net 仍然拦截事件。
2021-03-16 08:16:05
公平地说,当这个答案发布时,jQuery 几乎是 JS 的同义词。但是现在我们中的很多人完全避免使用 jQuery(因为当你使用像 React 这样的东西时它只是浪费 kb)当我们搜索 JS 问题的答案时感到恼火,而且通常首先出现的是我们不知道的库不想依赖。
2021-03-17 08:16:05
查询 event.which 可能比 event.keyCode 或 event.charCode 更好,请参阅developer.mozilla.org/en/DOM/event.charCode#Notes
2021-03-28 08:16:05
我已经event.preventDefault();在调用click();函数之前调整了您的代码添加而我的页面有一个表单,我已经切换了keyupkeypress因为它是我唯一的工作处理程序,无论如何,感谢您提供整洁的代码!
2021-04-02 08:16:05

然后只需输入代码!

<input type = "text"
       id = "txtSearch" 
       onkeydown = "if (event.keyCode == 13)
                        document.getElementById('btnSearch').click()"    
/>

<input type = "button"
       id = "btnSearch"
       value = "Search"
       onclick = "doSomething();"
/>
我同意 Sam 的观点,这段带有内联 JS 代码的代码非常丑陋。您应该始终将 HTML 和 JavaScript 代码分开。
2021-03-18 08:16:05
@Sam 永远不要从木偶那里得到你的智慧痛苦会导致恐惧,而恐惧是精神杀手。恐惧是带来彻底毁灭的小死亡。我将面对我的恐惧。我会允许它经过我,经过我。当它过去时,我会转动内在的眼睛去看它的路径。恐惧消失的地方将一无所有。除了内联事件处理程序。所以,是的,请将您的事件处理程序与您的视图/标记分开,就像这个答案一样;^)
2021-03-25 08:16:05
这对我有用,因为内联方法,而不是调用包含类似代码的函数,允许您在调用时返回 false 并避免回发。在我的例子中,“click”方法调用了一个 __doPostback 异步调用并且没有“return false;” 只会重新加载页面。
2021-03-29 08:16:05
如果需要停止表单提交:onkeydown="if (event.keyCode == 13) {document.getElementById('btnSubmit').click();event.returnValue=false;event.cancel=true;}"
2021-03-31 08:16:05
是的,我几乎做到了。我想这只是个人喜好的事情……我喜欢更module化的方法。;)
2021-04-06 08:16:05

想通了这一点:

<input type="text" id="txtSearch" onkeypress="return searchKeyPress(event);" />
<input type="button" id="btnSearch" Value="Search" onclick="doSomething();" />

<script>
function searchKeyPress(e)
{
    // look for window.event in case event isn't passed in
    e = e || window.event;
    if (e.keyCode == 13)
    {
        document.getElementById('btnSearch').click();
        return false;
    }
    return true;
}
</script>
最好的纯 JavaScript 选项。在 HTML 中添加 JavaScript 作为属性会占用空间,而 jQuery 只是 jQuery(不保证兼容性)。感谢您的解决方案!
2021-03-13 08:16:05
如果在 if 中返回 false,则可以避免进一步处理密钥: <input type="text" id="txtSearch" onkeypress="searchKeyPress(event);" /> <input type="button" id="btnSearch" Value="Search" onclick="doSomething();" /> <script> function searchKeyPress(e) { // 查找 window.event 以防事件未传入 e = e || 窗口事件;if (e.keyCode == 13) { document.getElementById('btnSearch').click(); 返回假;返回真;} </脚本>
2021-03-15 08:16:05
e = e || 窗口事件;// 获取事件的最短途径
2021-04-01 08:16:05

使按钮成为提交元素,因此它将是自动的。

<input type = "submit"
       id = "btnSearch"
       value = "Search"
       onclick = "return doSomething();"
/>

请注意,您需要一个<form>包含输入字段元素来完成这项工作(感谢 Sergey Ilinsky)。

重新定义标准行为不是一个好习惯,Enter关键应该总是调用表单上的提交按钮。

有趣的事实,我最近尝试在 SharePoint 中执行此操作。但是,SharePoint 已经有一个包含所有内容的表单,并且任何<form>标签都会被其他自由的 HTML 解析器抛出。所以我必须劫持按键或破坏。(顺便说一句,出于某种原因,在 SharePoint 中按 Enter 会启动编辑模式。我猜功能区正在使用相同的表单。)
2021-03-13 08:16:05
@skybondsor - OTOH,正如 garrow 所提到的当他说这个限制时,OP 是不正确的在一个页面上有多个表单是完全可能的:只需要将元素包装在它自己的表单中,并确保它不在页面上的另一个表单中。
2021-03-17 08:16:05
伙计们!阅读他的整个问题。页面上已经有另一个提交按钮,所以这对他不起作用。
2021-03-22 08:16:05
一个<button type="submit" onclick="return doSomething(this)">Value</button>作品。线索就在return关键字中
2021-04-01 08:16:05
@ToolmakerSteve 当然!但我们都同意,从最初的问题是否可能存在多种形式并不清楚。发布尽可能多的代码的另一个好理由。
2021-04-03 08:16:05

由于还没有人用过addEventListener,这里是我的版本。鉴于元素:

<input type = "text" id = "txt" />
<input type = "button" id = "go" />

我会使用以下内容:

var go = document.getElementById("go");
var txt = document.getElementById("txt");

txt.addEventListener("keypress", function(event) {
    event.preventDefault();
    if (event.keyCode == 13)
        go.click();
});

这允许您分别更改事件类型和操作,同时保持 HTML 干净。

请注意,确保这在 a 之外可能是值得的,<form>因为当我将这些元素包含在其中时,按 Enter 提交了表单并重新加载了页面。我眨了几眼才发现。

附录:感谢@ruffin 的评论,我添加了缺少的事件处理程序和 apreventDefault以允许此代码(大概)也在表单内工作。(我将开始对此进行测试,届时我将删除括号内的内容。)

只为这个小东西使用 jQuery 肯定是没用的。它也很容易与 CSP 配合使用,加载时间更短。如果可以,请使用这个。
2021-03-25 08:16:05
我真的不明白为什么 JQeuery 的回答有更多的赞成票。我为网络开发社区哭泣。
2021-03-28 08:16:05
除非您不打算让用户实际输入任何数据,否则您应该真正执行以下操作 if (event.keyCode == 13) { event.preventDefault(); go.click();}
2021-03-31 08:16:05
您真正缺少的只是按键处理程序中的一个参数和一个e.preventDefault()让它与表单一起工作的参数请参阅我的(新)答案
2021-04-04 08:16:05