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

kde*_*ney 1250 javascript onclick button onkeypress

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

我当前页面上已经有一个不同的提交按钮,所以我不能简单地将按钮设置为提交按钮.并且,如果从这个文本框中按下该按钮,我希望Enter键单击此特定按钮,没有别的.

<input type="text" id="txtSearch" />
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />
Run Code Online (Sandbox Code Playgroud)

Ste*_*ulo 1397

在jQuery中,以下内容可行:

$("#id_of_textbox").keyup(function(event) {
    if (event.keyCode === 13) {
        $("#id_of_button").click();
    }
});
Run Code Online (Sandbox Code Playgroud)

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

$("#myButton").click(function() {
  alert("Button code executed.");
});
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

或者在纯JavaScript中,以下内容可行:

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

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

function buttonCode()
{
  alert("Button code executed.");
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 使用`keydown`的问题在于按住enter会一遍又一遍地触发事件.如果你附加到`keyup`事件,它只会在释放密钥后触发. (138认同)
  • 我调整了你的代码,在调用`click();`函数之前添加`event.preventDefault();`,而我的页面有一个表单,我用`keypress`切换`keyup`,因为它是唯一的工作处理程序我,无论如何,感谢整齐的代码! (26认同)
  • `keydown`不是`keyup`是更好的事件.另外,如果你使用的是asp.net,你必须在结尾处"返回false"以阻止asp.net继续拦截事件. (25认同)
  • 查询event.which比event.keyCode或event.charCode更好的做法,请参阅https://developer.mozilla.org/en/DOM/event.charCode#Notes (12认同)
  • 公平地说,当这个答案发布时,jQuery几乎就是JS的代名词.但是现在我们很多人完全避免使用jQuery(因为当你使用像React这样的东西时只是浪费kb)当我们搜索JS问题的答案时会感到恼火,而且通常首先出现的是我们不喜欢的库我不想依赖. (6认同)
  • @Hugo你不能使用`$(this)`因为父ID是文本框的ID,而你想要`click()`的那个是按钮ID. (3认同)
  • @sohaiby:如果OP使用jquery,他会问这个问题.如果他没有使用jquery,那么建议这样一个简单的任务就太过分了.这与询问如何在C++中合并字符串并接收有关使用Qt的QString的答案是一样的.技术上有效,但不是问题要求. (3认同)
  • `$(this).click();`看起来更好,可能适用于匹配多个元素的选择器(即:`$('.buttons')`) (2认同)
  • 为什么人们如此讨厌jQuery?阻止使用jQuery的任何特殊原因? (2认同)
  • 请使用“key”而不是“keyCode”。后者已被弃用。 (2认同)

Ser*_*sky 389

然后只需编入代码即可!

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

<input type = "button"
       id = "btnSearch"
       value = "Search"
       onclick = "doSomething();"
/>
Run Code Online (Sandbox Code Playgroud)

  • 如果你需要停止表单提交:onkeydown ="if(event.keyCode == 13){document.getElementById('btnSubmit').click(); event.returnValue = false; event.cancel = true;}" (9认同)
  • @Sam永远不会得到你的[木偶智慧](https://www.youtube.com/watch?v=XQduN315etk&t=19m32s).痛苦导致*恐惧*,恐惧是心灵杀手.恐惧是带来完全消失的小死亡.我将面对我的恐惧.我会允许它通过我和我.当它过去时,我会转动内心的眼睛来看它的路径.恐惧消失的地方什么也没有.除了内联事件处理程序.所以,是的,请将您的事件处理程序与您的视图/标记分开,如[此答案所述](http://stackoverflow.com/a/20064004/1028230).; ^) (9认同)
  • 是的,我几乎那样做了.我想这只是个人偏好的事情......我喜欢更模块化的方法.;) (5认同)
  • 这对我有用,因为内联方法,而不是调用其中类似代码的函数,允许您在调用时返回false并避免回发.在我的例子中,"click"方法调用__doPostback异步调用而没有"return false;" 只会重新加载页面. (3认同)
  • 我同意Sam的观点,这个内联JS代码的代码很丑陋.您应该始终分开HTML和JavaScript代码. (3认同)
  • 不得不将`onkeydown`改为`onkeypress`,因为它可以在Chrome中运行. (3认同)
  • @TimothyChung:非常感谢.这个页面的其余部分很棒,但我通过谷歌来到这里试图找出如何在文本字段中保持"输入"以使用<form>触发回发_without_(这似乎不适用于asp :UpdatePanel中).这有效.(它可以在像kdenney这样的javascript函数中完成,也可能在JQuery中完成.) (2认同)

kde*_*ney 176

想出这个:

<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>
Run Code Online (Sandbox Code Playgroud)

  • e = e || window.event; //获得活动的最短途径 (22认同)
  • 最好的普通JavaScript选项.添加JavaScript作为HTML中的属性是耗费空间的,而jQuery只是jQuery(不保证兼容性).谢谢你的解决方案! (2认同)

alb*_*ein 81

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

<input type = "submit"
       id = "btnSearch"
       value = "Search"
       onclick = "return doSomething();"
/>
Run Code Online (Sandbox Code Playgroud)

请注意,您需要一个<form>包含输入字段的元素才能使其工作(感谢Sergey Ilinsky).

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

  • 花花公子!阅读他的整个问题.页面上已经有另一个提交按钮,所以这对他不起作用. (30认同)
  • 有趣的是,我最近尝试在SharePoint中执行此操作.但是,SharePoint已经有一个包装所有内容的表单,并且任何"<form>"标记都会被其他自由的HTML解析器抛弃.所以我必须劫持按键或胸围.(顺便说一下,按Enter键进入SharePoint会因某种原因启动编辑模式.我猜功能区使用相同的表单.) (5认同)
  • `&lt;button type="submit" onclick="return doSomething(this)"&gt;Value&lt;/button&gt;` 可以工作。线索就在“return”关键字中 (2认同)
  • @ToolmakerSteve 当然!但我们都同意,从最初的问题来看,并不清楚是否可以采用多种形式。发布尽可能多的代码的另一个好理由。 (2认同)

ice*_*ter 75

由于还没有人使用过addEventListener,这是我的版本.鉴于要素:

<input type = "text" id = "txt" />
<input type = "button" id = "go" />
Run Code Online (Sandbox Code Playgroud)

我会使用以下内容:

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

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

这允许您在保持HTML清洁的同时单独更改事件类型和操作.

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

附录:感谢@ruffin的评论,我添加了缺少的事件处理程序和a,preventDefault以允许此代码(可能)在表单内部工作.(我将开始测试这个,此时我将删除括号内容.)

  • 我真的不明白为什么JQeuery答案有更多的赞成.我为webdevelopement社区哭泣. (14认同)
  • 除非你不打算让你的用户真正输入任何数据,你应该做的事情就像`if(event.keyCode == 13){event.preventDefault(); go.click();}` (5认同)
  • 您真正缺少的只是按键处理程序中的一个参数和一个“e.preventDefault()”以使其与表单一起使用。请参阅[我的(新)答案](http://stackoverflow.com/a/34441952/1028230)。 (2认同)
  • 仅仅为了这个小事情而使用 jQuery 肯定是没有用的。它还可以轻松地与 CSP 配合使用,并且加载时间更短。如果可以的话,就用这个吧。 (2认同)

Var*_*run 58

在纯JavaScript中,

if (document.layers) {
  document.captureEvents(Event.KEYDOWN);
}

document.onkeydown = function (evt) {
  var keyCode = evt ? (evt.which ? evt.which : evt.keyCode) : event.keyCode;
  if (keyCode == 13) {
    // For Enter.
    // Your function here.
  }
  if (keyCode == 27) {
    // For Escape.
    // Your function here.
  } else {
    return true;
  }
};
Run Code Online (Sandbox Code Playgroud)

我注意到答案只在jQuery中给出,所以我想用普通的JavaScript给出一些东西.

  • document.layers?你还在支持Netscape吗?!! (19认同)
  • netscape.com甚至不再存在(它重定向到aol.com)但仍然有人支持nescape,太棒了. (7认同)
  • 不,你不需要支持Netscape.http://blog.netscape.com/2007/12/28/end-of-support-for-netscape-web-browsers/ (6认同)
  • `evt.which?evt.which:evt.keyCode`等于`evt.which || evt.keyCode` (6认同)
  • @LeartS我敢打赌那是因为仍然有人在使用Netscape. (3认同)

Swi*_*ers 21

你可以使用的一个基本技巧,我没有看到完全提到.如果您想在Enter上执行ajax操作或其他工作,但又不想实际提交表单,则可以执行以下操作:

<form onsubmit="Search();" action="javascript:void(0);">
    <input type="text" id="searchCriteria" placeholder="Search Criteria"/>
    <input type="button" onclick="Search();" value="Search" id="searchBtn"/>
</form>
Run Code Online (Sandbox Code Playgroud)

设置动作="javascript:void(0);" 这样就是防止默认行为的捷径.在这种情况下,无论您是按Enter键还是单击按钮,都会调用一个方法,并调用ajax来加载某些数据.

  • 这是一个很好的答案,因为它允许自定义操作,但又避免了对一堆花哨的覆盖代码的需要。 (2认同)

mah*_*que 15

试试吧:

<input type="text" id="txtSearch"/>
<input type="button" id="btnSearch" Value="Search"/>

<script>             
   window.onload = function() {
     document.getElementById('txtSearch').onkeypress = function searchKeyPress(event) {
        if (event.keyCode == 13) {
            document.getElementById('btnSearch').click();
        }
    };

    document.getElementById('btnSearch').onclick =doSomething;
}
</script>
Run Code Online (Sandbox Code Playgroud)


Kam*_*ski 15

纯 JS 工作时间短

txtSearch.onkeydown= e => (e.key=="Enter") ? btnSearch.click() : 1
Run Code Online (Sandbox Code Playgroud)

txtSearch.onkeydown= e => (e.key=="Enter") ? btnSearch.click() : 1
Run Code Online (Sandbox Code Playgroud)
txtSearch.onkeydown= e => (e.key=="Enter") ? btnSearch.click() : 1

function doSomething() {
  console.log('');
}
Run Code Online (Sandbox Code Playgroud)


小智 14

要在每次按下回车键时触发搜索,请使用以下命令:

$(document).keypress(function(event) {
    var keycode = (event.keyCode ? event.keyCode : event.which);
    if (keycode == '13') {
        $('#btnSearch').click();
    }
}
Run Code Online (Sandbox Code Playgroud)


Max*_*ing 13

onkeydown="javascript:if (event.which || event.keyCode){if ((event.which == 13) || (event.keyCode == 13)) {document.getElementById('btnSearch').click();}};"
Run Code Online (Sandbox Code Playgroud)

这只是我最近的一个项目所得到的......我在网上找到了它,我不知道在普通的旧JavaScript中是否有更好的方法.


Gib*_*olt 13

使用keypressevent.key === "Enter"现代JS!

const textbox = document.getElementById("txtSearch");
textbox.addEventListener("keypress", function onEvent(event) {
    if (event.key === "Enter") {
        document.getElementById("btnSearch").click();
    }
});
Run Code Online (Sandbox Code Playgroud)

Mozilla文档

支持的浏览器

  • @holydragon 根据 Mozilla 的 [`keypress` 文档](https://developer.mozilla.org/en-US/docs/Web/API/Element/keypress_event):“警告:由于此事件已被弃用,您应该使用改为 `beforeinput` 或 `keydown`。” (2认同)

gar*_*row 12

虽然,我很确定只要表单中只有一个字段和一个提交按钮,即使页面上有另一个表单,点击输入也应该提交表单.

然后,您可以使用js捕获表单onsubmit,并执行您想要的任何验证或回调.


NVR*_*VRM 12

没有人注意到html attibute"accesskey",它已经有一段时间了.

这是一种没有javascript方式的键盘快捷键的东西.

accesskey_browsers

accesskey属性是MDN上的快捷方式

只是像这样使用.html属性本身就足够了,我们可以根据浏览器和操作系统更改占位符或其他指标.该脚本是一种未经测试的划痕方法,可以提供一个想法.您可能想要使用浏览器库检测器,如微小的bowser

let client = navigator.userAgent.toLowerCase(),
    isLinux = client.indexOf("linux") > -1,
    isWin = client.indexOf("windows") > -1,
    isMac = client.indexOf("apple") > -1,
    isFirefox = client.indexOf("firefox") > -1,
    isWebkit = client.indexOf("webkit") > -1,
    isOpera = client.indexOf("opera") > -1,
    input = document.getElementById('guestInput');

if(isFirefox) {
   input.setAttribute("placeholder", "Access keys: ALT+SHIFT+Z");
} else if (isWin) {
   input.setAttribute("placeholder", "Access keys: ALT+Z");
} else if (isMac) {
  input.setAttribute("placeholder", "Access keys: CTRL+ALT+Z");
} else if (isOpera) {
  input.setAttribute("placeholder", "Shortcut: SHIFT+ESCAPE->Z");
} else {'Point me to operate...'}
Run Code Online (Sandbox Code Playgroud)
<input type="text" id="guestInput" accesskey="z" placeholder="Acces shortcut:"></input>
Run Code Online (Sandbox Code Playgroud)

  • 似乎没有回答OP关于key = ENTER的特殊情况的问题 (2认同)
  • 这个答案误解了 *accesskey*,这是一种在元素上拥有键 *焦点* 的方法 - 在按下文本区域的访问键后,人们就可以开始在其中输入内容。OP 要求的是完全不同的东西:一种提交当前元素内容的方法。 (2认同)

frh*_*rhd 11

这是所有YUI爱好者的解决方案:

Y.on('keydown', function() {
  if(event.keyCode == 13){
    Y.one("#id_of_button").simulate("click");
  }
}, '#id_of_textbox');
Run Code Online (Sandbox Code Playgroud)

在这个特殊情况下,我确实有更好的结果使用YUI来触发已经注入按钮功能的DOM对象 - 但这是另一个故事......


Ali*_*aka 11

Angular2中:

(keyup.enter)="doSomething()"
Run Code Online (Sandbox Code Playgroud)

如果你不想在按钮中有一些视觉反馈,那么不要引用按钮而是直接调用控制器是一个很好的设计.

此外,不需要id - 另一种在视图和模型之间分离的NG2方式.

  • 这是有关 keyup 选项的更多信息的问题:http://stackoverflow.com/q/32155887/435605 (2认同)

小智 9

这次onchange尝试很接近,但是对于浏览器然后前进(在Safari 4.0.5和Firefox 3.6.3上)行为不端,所以最终,我不推荐它.

<input type="text" id="txtSearch" onchange="doSomething();" />
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />
Run Code Online (Sandbox Code Playgroud)


njo*_*hsn 9

在这种情况下,您还需要将"发布"按钮从"发布"更改为服务器并执行Js脚本.

<input type="text" id="txtSearch" onkeydown="if (event.keyCode == 13)
 {document.getElementById('btnSearch').click(); return false;}"/>
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />
Run Code Online (Sandbox Code Playgroud)


小智 8

event.returnValue = false
Run Code Online (Sandbox Code Playgroud)

在处理事件时或在事件处理程序调用的函数中使用它.

它至少适用于Internet Explorer和Opera.


use*_*182 8

对于jquery mobile我必须这样做

$('#id_of_textbox').live("keyup", function(event) {
    if(event.keyCode == '13'){
    $('#id_of_button').click();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • `.live`在jQuery 1.7中已弃用.在jQuery Mobile中它仍然被认为是正常的吗? (2认同)

ruf*_*fin 8

要添加一个完全普通的JavaScript的解决方案,解决@ icedwater的问题表单提交,这里是一个完整的解决方案form.

注意:这适用于"现代浏览器",包括IE9 +.IE8版本并不复杂,可以在这里学习.


小提琴:https://jsfiddle.net/rufwork/gm6h25th/1/

HTML

<body>
    <form>
        <input type="text" id="txt" />
        <input type="button" id="go" value="Click Me!" />
        <div id="outige"></div>
    </form>
</body>
Run Code Online (Sandbox Code Playgroud)

JavaScript的

// The document.addEventListener replicates $(document).ready() for
// modern browsers (including IE9+), and is slightly more robust than `onload`.
// More here: https://stackoverflow.com/a/21814964/1028230
document.addEventListener("DOMContentLoaded", function() {
    var go = document.getElementById("go"),
        txt = document.getElementById("txt"),
        outige = document.getElementById("outige");

    // Note that jQuery handles "empty" selections "for free".
    // Since we're plain JavaScripting it, we need to make sure this DOM exists first.
    if (txt && go)    {
        txt.addEventListener("keypress", function (e) {
            if (event.keyCode === 13)   {
                go.click();
                e.preventDefault(); // <<< Most important missing piece from icedwater
            }
        });

        go.addEventListener("click", function () {
            if (outige) {
                outige.innerHTML += "Clicked!<br />";
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)


小智 6

对于那些可能喜欢简洁和现代 js 方法的人。

input.addEventListener('keydown', (e) => {if (e.keyCode == 13) doSomething()});
Run Code Online (Sandbox Code Playgroud)

其中input是包含输入元素的变量。


MCC*_*CCS 6

在现代的,不推荐使用(不带keyCodeonkeydown)的Javascript中:

<input onkeypress="if(event.key == 'Enter') {console.log('Test')}">
Run Code Online (Sandbox Code Playgroud)


Teq*_*man 5

document.onkeypress = function (e) {
 e = e || window.event;
 var charCode = (typeof e.which == "number") ? e.which : e.keyCode;
 if (charCode == 13) {

        // Do something here
        printResult();
    }
};
Run Code Online (Sandbox Code Playgroud)

这是我的两分钱.我正在开发一个适用于Windows 8的应用程序,并且当按下Enter按钮时希望该按钮注册一个单击事件.我在JS中这样做.我尝试了几个建议,但有问题.这很好用.


cli*_*ait 5

要使用jQuery,请执行以下操作:

$("#txtSearch").on("keyup", function (event) {
    if (event.keyCode==13) {
        $("#btnSearch").get(0).click();
    }
});
Run Code Online (Sandbox Code Playgroud)

要使用普通的JavaScript做到这一点:

document.getElementById("txtSearch").addEventListener("keyup", function (event) {
    if (event.keyCode==13) { 
        document.getElementById("#btnSearch").click();
    }
});
Run Code Online (Sandbox Code Playgroud)