Active un clic de botón con JavaScript en la tecla Intro en un cuadro de texto

1293

Tengo una entrada de texto y un botón (ver más abajo). ¿Cómo puedo usar JavaScript para activar el evento de clic del botón cuando Enterse presiona la tecla dentro del cuadro de texto?

Ya hay un botón de envío diferente en mi página actual, por lo que no puedo simplemente hacer que el botón sea un botón de envío. Y, solo quiero que la Entertecla haga clic en este botón específico si se presiona desde este cuadro de texto, nada más.

<input type="text" id="txtSearch" />
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />
kdenney
fuente
1
Nota importante para novatos como yo: la parte clave de esta pregunta es si ya tiene un formulario en la página, por lo que ya tiene un botón de envío. La respuesta de jQuery es compatible con varios navegadores y es una buena solución.
Joshua Dance
2
@JoshuaDance, ya tener un formulario / enviar no es un problema. Una página puede tener muchos formularios (pero no anidados), cada uno con su propio envío. Cada campo de cada formulario activará solo el envío de ese formulario. Como se indica en esta respuesta .
Frédéric

Respuestas:

1426

En jQuery, lo siguiente funcionaría:

$("#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>

O en JavaScript simple, lo siguiente funcionaría:

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>

Steve Paulo
fuente
12
Probablemente sea una mejor práctica consultar event.which que event.keyCode o event.charCode, consulte developer.mozilla.org/en/DOM/event.charCode#Notes
William Niu
25
keydownNo keyupes el mejor evento para usar. Además, si está utilizando asp.net, tendrá que hacerlo return falseal final para evitar que asp.net siga interceptando el evento.
maxp
144
El problema con el uso keydownes que mantener presionada la tecla enter activará el evento una y otra vez. si se adjunta al keyupevento, solo se activará una vez que se suelte la tecla.
Steve Paulo
26
He retocado el código de la adición event.preventDefault();antes de invocar click();la función mientras mi página tiene una forma y he cambiado keyupcon el keypressya que era el controlador sólo trabaja para mí, de todos modos, gracias por pieza ordenada de código!
Adrian K.
77
Para ser justos, jQuery era prácticamente sinónimo de JS cuando se publicó esta respuesta. Pero ahora muchos de nosotros que evitamos por completo jQuery (porque es solo una pérdida de kb cuando usas algo como React) nos sentimos molestos cuando buscamos respuestas a las preguntas de JS y, a menudo, lo primero que surge es una biblioteca que no usamos No quiero depender de.
Andy
402

¡Entonces solo codifícalo!

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

<input type = "button"
       id = "btnSearch"
       value = "Search"
       onclick = "doSomething();"
/>
Sergey Ilinsky
fuente
55
Sí, casi lo hice. Supongo que es solo una preferencia personal ... Me gusta el enfoque más modular. ;)
kdenney
99
si necesita detener el envío del formulario: onkeydown = "if (event.keyCode == 13) {document.getElementById ('btnSubmit'). click (); event.returnValue = false; event.cancel = true;}"
Gabriel Chung
3
Esto funcionó para mí debido al hecho de que el método en línea, en lugar de llamar a la función con un código similar, le permite devolver falso en la llamada y evitar la devolución de datos. En mi caso, el método "clic" invoca una llamada asincrónica __doPostback y sin el "retorno falso"; simplemente volvería a cargar la página.
Dave
3
Estoy de acuerdo con Sam, este código con este código JS en línea es feo como el infierno. Siempre debe separar los códigos HTML y JavaScript.
Sk8erPeter
99
@Sam Nunca obtengas tu sabiduría de los títeres . El dolor lleva al miedo , y el miedo es el asesino de la mente. El miedo es la pequeña muerte que conduce a la destrucción total. Me enfrentaré a mi miedo. Permitiré que pase sobre mí y a través de mí. Y cuando haya pasado, giraré el ojo interno para ver su camino. Donde el miedo se ha ido no habrá nada. Excepto quizás controladores de eventos en línea. Entonces, sí, separe sus controladores de eventos de su vista / marcado, como lo hace esta respuesta . ; ^)
ruffin
179

Descubrí esto:

<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>
kdenney
fuente
22
e = e || window.event; // forma más corta de obtener el evento
Victor
2
La mejor opción de JavaScript simple. El JavaScript agregado como atributo en HTML consume mucho espacio, y jQuery es solo jQuery (no se garantiza la compatibilidad). Gracias por la solucion!
boxspah
y si devuelve falso dentro del if, puede evitar que la clave se siga procesando: <input type = "text" id = "txtSearch" onkeypress = "searchKeyPress (event);" /> <input type = "button" id = "btnSearch" Value = "Search" onclick = "doSomething ();" /> <script> function searchKeyPress (e) {// busca window.event en caso de que el evento no se pase en e = e || window.event; if (e.keyCode == 13) {document.getElementById ('btnSearch'). click (); falso retorno; } devuelve verdadero; } </script>
Jose Gómez
83

Haga que el botón sea un elemento de envío, para que sea automático.

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

Tenga en cuenta que necesitará un <form> elemento que contenga los campos de entrada para que esto funcione (gracias Sergey Ilinsky).

No es una buena práctica redefinir el comportamiento estándar, la Enterclave siempre debe llamar al botón de envío en un formulario.

alberteína
fuente
30
Dudes! Lee toda su pregunta. Ya hay otro botón de envío en la página, por lo que esto no funcionaría para él.
skybondsor
55
Dato curioso, recientemente intenté hacer esto en SharePoint. Sin embargo, SharePoint ya tiene un formulario que envuelve todo su contenido, y el <form>analizador HTML, que de otro modo es liberal, elimina cualquier etiqueta. Así que tengo que secuestrar pulsaciones de teclas o reventar. (Por cierto, al pulsar Intro en SharePoint modo Editar lanzamientos por alguna razón, supongo que la cinta es el uso de la misma forma..)
1
A <button type="submit" onclick="return doSomething(this)">Value</button>trabaja para. La pista se encuentra dentro de la returnpalabra clave
Gus
77

Como nadie lo ha usado addEventListenertodavía, aquí está mi versión. Dados los elementos:

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

Yo usaría lo siguiente:

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

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

Esto le permite cambiar el tipo de evento y la acción por separado mientras mantiene limpio el HTML.

Tenga en cuenta que probablemente valga la pena asegurarse de que esto esté fuera de un <form>porque cuando incluí estos elementos en ellos presionando Entrar, envió el formulario y volvió a cargar la página. Me llevó unos pocos parpadeos descubrir.

Anexo : Gracias a un comentario de @ruffin, agregué el controlador de eventos que falta y un preventDefaultpara permitir que este código (presumiblemente) también funcione dentro de un formulario. (Voy a probar esto, en ese momento eliminaré el contenido entre corchetes).

agua con hielo
fuente
14
Realmente no entiendo por qué la respuesta de JQeuery tiene más votos a favor. Lloro por la comunidad de desarrollo web.
David
1
Todo lo que realmente falta es un argumento en su controlador de pulsación de teclas y un e.preventDefault()para que funcione con formularios. Ver mi (nueva) respuesta .
ruffin
55
a menos que no vaya a los usuarios que realmente entrar en cualquier dato, que realmente debería hacer algo asíif (event.keyCode == 13) { event.preventDefault(); go.click();}
no sincronizado
1
Usar jQuery solo para esta pequeña cosa es inútil. También funciona mucho más fácilmente con CSP y tarda menos tiempo en cargarse. Si puedes, usa esto.
Avamander
59

En JavaScript simple,

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

Noté que la respuesta se da solo en jQuery, así que pensé en dar algo en JavaScript simple también.

Varun
fuente
20
document.layers? ¿Sigues apoyando a Netscape?
Victor
66
No, no es necesario que admita Netscape. blog.netscape.com/2007/12/28/…
kingdango
77
netscape.com ya no existe (se redirige a aol.com) y, sin embargo, todavía hay personas que apoyan nescape, increíble.
LeartS
66
evt.which ? evt.which : evt.keyCodees igual aevt.which || evt.keyCode
usuario
3
@LeartS Apuesto a que es porque todavía hay personas que usan Netscape.
SantiBailors
23

Un truco básico que puedes usar para esto que no he visto completamente mencionado. Si desea realizar una acción ajax, o algún otro trabajo en Enter pero no desea enviar un formulario, puede hacerlo:

<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>

Configuración action = "javascript: void (0);" como este es un acceso directo para prevenir esencialmente el comportamiento predeterminado. En este caso, se llama a un método si presiona enter o hace clic en el botón y se realiza una llamada ajax para cargar algunos datos.

Interruptores
fuente
Esta es una mejor solución para el soporte de dispositivos móviles. Oculta automáticamente el teclado en dispositivos Android, y también iOS si agrega searchCriteria.blur();al onsubmit.
Aaron Gillion
Esto no funcionará, ya que ya hay otro botón de envío en la página.
Jose Gómez
@ JoseGómez, una página puede tener tantos botones de envío como desee el desarrollador, que se activa solo por sus campos correspondientes. Solo se necesita tener formas distintas para cada grupo de campos / envío. Una página no está limitada a un solo formulario.
Frédéric
@Frederic: por la pregunta que entendí (¿no?), El otro botón de envío tenía la misma forma: "Ya hay un botón de envío diferente en mi página actual, por lo que no puedo simplemente hacer que el botón sea un botón de envío".
Jose Gómez
1
Esta es una gran respuesta ya que permite acciones personalizadas pero evita la necesidad de un montón de código de anulación elegante.
Beejor
16

Intentalo:

<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>
mahbub_siddique
fuente
15

Para activar una búsqueda cada vez que se presiona la tecla Intro, use esto:

$(document).keypress(function(event) {
    var keycode = (event.keyCode ? event.keyCode : event.which);
    if (keycode == '13') {
        $('#btnSearch').click();
    }
}
media
fuente
14
onkeydown="javascript:if (event.which || event.keyCode){if ((event.which == 13) || (event.keyCode == 13)) {document.getElementById('btnSearch').click();}};"

Esto es algo que tengo de un proyecto algo reciente ... Lo encontré en la red, y no tengo idea si hay una mejor manera o no en JavaScript antiguo.

Max Schmeling
fuente
14

Uso keypressy event.key === "Enter"con JS moderno!

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

Documentos de Mozilla

Navegadores Soportados

Gibolt
fuente
13

Sin embargo, estoy bastante seguro de que, siempre y cuando solo haya un campo en el formulario y un botón de envío, al presionar enter debería enviar el formulario, incluso si hay otro formulario en la página.

Luego puede capturar el formulario enviado con js y hacer cualquier validación o devolución de llamada que desee.

garrow
fuente
13

Nadie notó el html attibute "accesskey" que está disponible desde hace un tiempo.

Esta es una forma sin javascript de atajos de teclado.

accesskey_browsers

La tecla de acceso atribuye accesos directos en MDN

Con la intención de ser utilizado así. El atributo html en sí mismo es suficiente, sin embargo, podemos cambiar el marcador de posición u otro indicador dependiendo del navegador y el sistema operativo. El guión es un enfoque scratch no probado para dar una idea. Es posible que desee utilizar un detector de biblioteca de navegador como el pequeño 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", "ALT+SHIFT+Z");
} else if (isWin) {
   input.setAttribute("placeholder", "ALT+Z");
} else if (isMac) {
  input.setAttribute("placeholder", "CTRL+ALT+Z");
} else if (isOpera) {
  input.setAttribute("placeholder", "SHIFT+ESCAPE->Z");
} else {'Point me to operate...'}
<input type="text" id="guestInput" accesskey="z" placeholder="Acces shortcut:"></input>

NVRM
fuente
1
El acceso tiene dos s.
kaiser
3
No parece responder la pregunta del OP sobre el caso especial de key = ENTER
Ozan Bellik
12

Esta es una solución para todos los amantes de YUI :

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

En este caso especial, obtuve mejores resultados al usar YUI para activar objetos DOM que han sido inyectados con la funcionalidad del botón, pero esta es otra historia ...

frhd
fuente
12

En Angular2 :

(keyup.enter)="doSomething()"

Si no desea comentarios visuales en el botón, es un buen diseño no hacer referencia al botón sino invocar directamente el controlador.

Además, la identificación no es necesaria, otra forma de separación NG2 entre la vista y el modelo.

AlikElzin-kilaka
fuente
1
Aquí hay una pregunta sobre más información sobre las opciones de keyup: stackoverflow.com/q/32155887/435605
AlikElzin-kilaka
10

En este caso, también desea marcar el botón Intro desde Publicar en el servidor y ejecutar el script 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();" />
njoshsn
fuente
9

Este onchange intento Pero se comporta mal con respecto al navegador en ese entonces hacia adelante (en Safari 4.0.5 y Firefox 3.6.3), por lo que, en última instancia, no lo recomendaría.

<input type="text" id="txtSearch" onchange="doSomething();" />
<input type="button" id="btnSearch" value="Search" onclick="doSomething();" />
beldaz
fuente
También debería mencionar que se desencadena al desenfocar.
FluorescentGreen5
8
event.returnValue = false

Úselo cuando maneja el evento o en la función que llama su controlador de eventos.

Funciona en Internet Explorer y Opera al menos.

ELEK
fuente
8

Para jquery mobile tuve que hacer

$('#id_of_textbox').live("keyup", function(event) {
    if(event.keyCode == '13'){
    $('#id_of_button').click();
    }
});
usuario1071182
fuente
2
.liveestá en desuso en jQuery 1.7. ¿Todavía se considera correcto en jQuery Mobile?
Barmar
8

Para agregar una solución JavaScript completamente simple que aborde el problema de @ icedwater con el envío de formularios , aquí hay una solución completa conform .

NOTA: Esto es para "navegadores modernos", incluido IE9 +. La versión IE8 no es mucho más complicada, y se puede aprender aquí .


Violín: 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>

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 />";
            }
        });
    }
});
ruffin
fuente
1
Los votos negativos sin explicaciones hacen que sea difícil abordar sus inquietudes. Hágame saber lo que no parece correcto, y me gustaría hacer un seguimiento.
ruffin
7

En Javascript moderno, no obsoleto (sin keyCodeo onkeydown):

<input onkeypress="if(event.key == 'Enter') {console.log('Test')}">
MCCCS
fuente
En mi opinión, esta es la respuesta más simple que hace el trabajo. En mi caso de uso, lo actualicé a onkeypress = "inputKeyPressed (event)" y luego manejé el evento.que parámetro en la función misma. La tecla Intro, por ejemplo, devuelve el evento, que como 13.
ak93
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();
    }
};

Aquí están mis dos centavos. Estoy trabajando en una aplicación para Windows 8 y quiero que el botón registre un evento de clic cuando presiono el botón Enter. Estoy haciendo esto en JS. Intenté un par de sugerencias, pero tuve problemas. Esto funciona bien.

Tequilaman
fuente
Una especie de exageración para colocar el controlador de eventos en el documento. Si tuviste un charCode13 en otro lugar, estás disparando printResult().
ruffin
5

Para hacerlo con jQuery:

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

Para hacerlo con JavaScript normal:

document.getElementById("txtSearch").addEventListener("keyup", function (event) {
    if (event.keyCode==13) { 
        document.getElementById("#btnSearch").click();
    }
});
clickbait
fuente
5

Para aquellos que les guste la brevedad y el enfoque moderno js.

input.addEventListener('keydown', (e) => {if (e.keyCode == 13) doSomething()});

donde input es una variable que contiene su elemento input.

Alexandr Tsyganok
fuente
1

Para JS moderno keyCodeestá en desuso, use keyen su lugar

searchInput.onkeyup = function (e) {
    if (e.key === 'Enter') {
        searchBtn.click();
    }
}
Advertido
fuente
0

En jQuery, puedes usar event.which==13. Si tiene un form, puede usar $('#formid').submit()(con los oyentes de eventos correctos agregados al envío de dicho formulario).

$('#textfield').keyup(function(event){
   if(event.which==13){
       $('#submit').click();
   }
});
$('#submit').click(function(e){
   if($('#textfield').val().trim().length){
      alert("Submitted!");
   } else {
    alert("Field can not be empty!");
   }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label for="textfield">
Enter Text:</label>
<input id="textfield" type="text">
<button id="submit">
Submit
</button>

hev1
fuente
0

He desarrollado JavaScript personalizado para lograr esta característica simplemente agregando clase

Ejemplo: <button type="button" class="ctrl-p">Custom Print</button>

Aquí compruébelo Fiddle
- o -
consulte el ejemplo de ejecución https://stackoverflow.com/a/58010042/6631280

Nota: en la lógica actual, debe presionar Ctrl+ Enter

Ravi Makwana
fuente
-4

Esto también podría ayudar, una pequeña función de JavaScript, que funciona bien:

<script type="text/javascript">
function blank(a) { if(a.value == a.defaultValue) a.value = ""; }

function unblank(a) { if(a.value == "") a.value = a.defaultValue; }
</script> 
<input type="text" value="email goes here" onfocus="blank(this)" onblur="unblank(this)" />

Sé que esta pregunta está resuelta, pero acabo de encontrar algo que puede ser útil para otros.

Niraj Chauhan
fuente
55
La pregunta era para activar un clic de botón con la tecla Intro en un cuadro de texto. Su solución es para un tipo de funcionalidad de "marca de agua".
kdenney