¿Evento JQuery para el usuario que presiona enter en un cuadro de texto?


250

¿Hay algún evento en Jquery que se active solo si el usuario presiona el botón Intro en un cuadro de texto? ¿O algún complemento que se pueda agregar para incluir esto? Si no, ¿cómo escribiría un complemento rápido que hiciera esto?

Respuestas:


446

Puedes conectar tu propio evento personalizado

$('textarea').bind("enterKey",function(e){
   //do stuff here
});
$('textarea').keyup(function(e){
    if(e.keyCode == 13)
    {
        $(this).trigger("enterKey");
    }
});

http://jsfiddle.net/x7HVQ/


11
Vale la pena señalar que en un escenario de detección de ingreso para evitar el envío del formulario, el evento "keyup" no es óptimo porque el formulario detecta el envío al presionar el teclado. Por lo tanto, "keydown" o "keypress" podrían ser mejores en ese caso.
TechNyquist

77
Tenga en cuenta que bind () está en desuso en jQuery 3.0.
Bart Friederichs

Diferentes navegadores tienen diferentes e.keyCodeteclas, mejor uso e.which, esto garantizará que maneje el mismo botón en cada navegador
Oleg Shakhov

99
   $('#textbox').on('keypress', function (e) {
         if(e.which === 13){

            //Disable textbox to prevent multiple submit
            $(this).attr("disabled", "disabled");

            //Do Stuff, submit, etc..

            //Enable the textbox again if needed.
            $(this).removeAttr("disabled");
         }
   });

8
Gracias. Esta solución se ajustó a mi caso de uso. Sin embargo, vale la pena señalar que una vez que se realiza cualquier procesamiento, es posible que desee agregar `$ (this) .removeAttr (" disabled ");` para volver a habilitar el cuadro de texto.
misterjaytee

39

Aquí hay un complemento para usted: (Fiddle: http://jsfiddle.net/maniator/CjrJ7/ )

$.fn.pressEnter = function(fn) {  

    return this.each(function() {  
        $(this).bind('enterPress', fn);
        $(this).keyup(function(e){
            if(e.keyCode == 13)
            {
              $(this).trigger("enterPress");
            }
        })
    });  
 }; 

//use it:
$('textarea').pressEnter(function(){alert('here')})

Agradable. Mucho más simple que esa URL que publiqué. Me pregunto qué diablos el artículo que he publicado se trata y por qué se tarda tanto código ..
CaptSaltyJack

1
Demasiado tarde, ya he escrito el mío: P. También hace el mismo trabajo en menos líneas ... además, usar la $variable para el complemento no es una buena idea ya que puede causar conflictos.
Haga clic en Upvote el

@Neal, ¿sabes cómo debería cambiarse el código del complemento que publiqué en la respuesta aceptada, para que uno pueda hacerlo $("#myInput").bind('click, onEnter', myCallback);y funcione sin necesidad de nada más?
Haga clic en Upvote el

1
@ClickUpvote # 1: elimínelo de la respuesta, luego podemos hablar.
Naftali aka Neal

@Neal Amazing solution man. ¡Acabo de copiar esa función! ¡Gracias!
Bilal Fazlani

17

heres un complemento jquery para hacer eso

(function($) {
    $.fn.onEnter = function(func) {
        this.bind('keypress', function(e) {
            if (e.keyCode == 13) func.apply(this, [e]);    
        });               
        return this; 
     };
})(jQuery);

para usarlo, incluya el código y configúrelo así:

$( function () {
    console.log($("input"));
    $("input").onEnter( function() {
        $(this).val("Enter key pressed");                
    });
});

jsfiddle de él aquí http://jsfiddle.net/VrwgP/30/


2
Agradable, llamaría a la devolución de llamada usando func.apply(this), de esa manera dentro de la función de devolución de llamada que puede usar thisnormalmente para acceder al elemento en el que se activó el evento.
Haga clic en Upvote el

Sí, un buen punto sobre func.apply (esto), ni siquiera lo había considerado.
jzilla

Agradable y conciso, pero agregaría que detener la propagación y los valores predeterminados sería una buena idea en la mayoría de los casos, para evitar el envío de cualquier formulario. Solo agregue e.preventDefault(); e.stopPropagation();dentro del if (e.keyCode)bit.
Irongaze.com

8

Cabe señalar que el uso de live()en jQuery ha quedado en desuso desde la versión 1.7y se ha eliminado en jQuery 1.9. En cambio, on()se recomienda el uso de .

Sugeriría encarecidamente la siguiente metodología para la unión, ya que resuelve los siguientes desafíos potenciales:

  1. Al vincular el evento document.bodyy pasar $ selector como el segundo argumento para on(), los elementos se pueden adjuntar, separar, agregar o eliminar del DOM sin necesidad de lidiar con eventos de re-enlace o doble enlace. Esto se debe a que el evento se adjunta en document.bodylugar de hacerlo $selectordirectamente, lo que significa que $selectorse puede agregar, eliminar y agregar nuevamente y nunca cargará el evento vinculado a él.
  2. Al llamar off()antes on(), este script puede vivir dentro del cuerpo principal de la página o dentro del cuerpo de una llamada AJAX, sin tener que preocuparse por eventos de doble enlace accidentalmente.
  3. Al envolver el script dentro $(function() {...}), este script puede ser cargado nuevamente por el cuerpo principal de la página o dentro del cuerpo de una llamada AJAX. $(document).ready()no se dispara por solicitudes AJAX, mientras que $(function() {...})sí.

Aquí hay un ejemplo:

<!DOCTYPE html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script type="text/javascript">
      $(function() {
        var $selector = $('textarea');

        // Prevent double-binding
        // (only a potential issue if script is loaded through AJAX)
        $(document.body).off('keyup', $selector);

        // Bind to keyup events on the $selector.
        $(document.body).on('keyup', $selector, function(event) {
          if(event.keyCode == 13) { // 13 = Enter Key
            alert('enter key pressed.');
          }
        });
      });
    </script>
  </head>
  <body>

  </body>
</html>

4

Si su entrada es search, también puede usar on 'search'evento. Ejemplo

<input type="search" placeholder="Search" id="searchTextBox">

.

$("#searchPostTextBox").on('search', function () {
    alert("search value: "+$(this).val());
});

3

Código HTML:-

<input type="text" name="txt1" id="txt1" onkeypress="return AddKeyPress(event);" />      

<input type="button" id="btnclick">

Java Script Code

function AddKeyPress(e) { 
        // look for window.event in case event isn't passed in
        e = e || window.event;
        if (e.keyCode == 13) {
            document.getElementById('btnEmail').click();
            return false;
        }
        return true;
    }

Su formulario no tiene el botón Enviar predeterminado


2

Otra variación sutil. Fui por una ligera separación de poderes, por lo que tengo un complemento para permitir la captura de la tecla Intro, luego simplemente me conecto a los eventos normalmente:

(function($) { $.fn.catchEnter = function(sel) {  
    return this.each(function() { 
        $(this).on('keyup',sel,function(e){
            if(e.keyCode == 13)
              $(this).trigger("enterkey");
        })
    });  
};
})(jQuery);

Y luego en uso:

$('.input[type="text"]').catchEnter().on('enterkey',function(ev) { });

Esta variación le permite usar la delegación de eventos (para enlazar elementos que aún no ha creado).

$('body').catchEnter('.onelineInput').on('enterkey',function(ev) { /*process input */ });

0

No pude hacer que el keypressevento se activara con el botón enter, y me rasqué la cabeza por un tiempo, hasta que leí los documentos de jQuery:

" El evento de pulsación de tecla se envía a un elemento cuando el navegador registra la entrada del teclado. Esto es similar al evento de pulsación de tecla, excepto que el modificador y las teclas que no se imprimen como Shift, Esc y eliminan eventos de pulsación de tecla de activación pero no eventos de pulsación de tecla " . https://api.jquery.com/keypress/ )

Tuve que usar el evento keyupo keydownpara presionar el botón enter.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.