Sự kiện JQuery cho người dùng nhấn enter trong hộp văn bản?


250

Có sự kiện nào trong Jquery chỉ được kích hoạt nếu người dùng nhấn nút enter trong hộp văn bản không? Hoặc bất kỳ plugin nào có thể được thêm vào để bao gồm điều này? Nếu không, làm thế nào tôi có thể viết một plugin nhanh chóng để làm điều này?

Câu trả lời:


446

Bạn có thể kết nối sự kiện tùy chỉnh của riêng bạn

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

http://jsfiddle.net/x7HVQ/


11
Điều đáng chú ý là trong một kịch bản phát hiện nhập để ngăn việc gửi biểu mẫu, sự kiện "keyup" không tối ưu vì biểu mẫu phát hiện việc gửi khi tắt phím. Do đó, "keydown" hoặc "keypress" có thể tốt hơn trong trường hợp đó.
TechNyquist

7
Lưu ý, bind () không được dùng trong jQuery 3.0.
Bart Friederichs

Các trình duyệt khác nhau có e.keyCodemột số khóa khác nhau , tốt hơn để sử dụng e.which, điều này sẽ đảm bảo rằng bạn sẽ xử lý cùng một nút trên mọi trình duyệt
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
Cảm ơn - Giải pháp này phù hợp với trường hợp sử dụng của tôi. Tuy nhiên, điều đáng chú ý là một khi bất kỳ quá trình xử lý nào được thực hiện, bạn có thể muốn thêm `$ (this) .removeAttr (" bị vô hiệu hóa ");` để kích hoạt lại hộp văn bản.
misterjaytee 2/2/2016

39

Đây là một plugin dành cho bạn: (Fiddle: http://jsfiddle.net/manoder/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')})

Đẹp. Đơn giản hơn nhiều so với URL mà tôi đã đăng. Tôi tự hỏi bài báo mà tôi đã đăng là cái quái gì và tại sao nó lại tốn nhiều mã như vậy ..
CaptSaltyJack

1
Quá muộn, tôi đã tự viết: P. Nó cũng thực hiện công việc tương tự trong ít dòng hơn .. ngoài ra, sử dụng $biến cho plugin không phải là ý tưởng hay vì nó có thể gây ra xung đột.
Nhấp vào Upvote

@Neal, bạn có biết mã của plugin tôi đã đăng trong câu trả lời được chấp nhận sẽ phải thay đổi như thế nào để người ta có thể làm $("#myInput").bind('click, onEnter', myCallback);và nó sẽ hoạt động mà không cần thêm gì nữa không?
Nhấp vào Upvote

1
@ClickUpvote # 1: xóa nó khỏi câu trả lời - sau đó chúng ta có thể nói chuyện.
Naftali aka Neal

@Neal Giải pháp tuyệt vời người đàn ông. Tôi vừa sao chép chức năng đó! cảm ơn!
Bilal Fazlani

17

Đây là một plugin jquery để làm điều đó

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

để sử dụng nó, bao gồm mã và thiết lập nó như thế này:

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

jsfiddle của nó ở đây http://jsfiddle.net/VrwgP/30/


2
Thật tuyệt, tôi sẽ gọi lại bằng cách sử dụng func.apply(this), theo cách đó bên trong chức năng gọi lại mà bạn có thể sử dụng thisnhư bình thường để truy cập vào phần tử mà sự kiện được kích hoạt.
Nhấp vào Upvote

yeah, điểm tốt về func.apply (điều này), thậm chí đã không xem xét điều đó.
jzilla

Đẹp và súc tích, nhưng tôi muốn thêm rằng việc ngừng tuyên truyền và mặc định sẽ là một ý tưởng tốt trong hầu hết các trường hợp, để ngăn chặn mọi biểu mẫu gửi. Chỉ cần thêm e.preventDefault(); e.stopPropagation();vào bên trong if (e.keyCode)bit.
Irongaze.com 19/12/14

8

Cần lưu ý rằng việc sử dụng live()trong jQuery đã bị từ chối kể từ phiên bản 1.7và đã bị xóa trong jQuery 1.9. Thay vào đó, việc sử dụng on()được khuyến khích.

Tôi rất muốn đề xuất phương pháp sau đây để ràng buộc, vì nó giải quyết các thách thức tiềm năng sau:

  1. Bằng cách liên kết sự kiện vào document.bodyvà chuyển $ selector làm đối số thứ hai on(), các phần tử có thể được đính kèm, tách rời, thêm hoặc xóa khỏi DOM mà không cần phải xử lý các sự kiện liên kết lại hoặc liên kết đôi. Điều này là do sự kiện được gắn vào document.bodychứ không phải $selectortrực tiếp, có nghĩa là $selectorcó thể được thêm, xóa và thêm lại và sẽ không bao giờ tải sự kiện bị ràng buộc với nó.
  2. Bằng cách gọi off()trước on(), tập lệnh này có thể nằm trong phần chính của trang hoặc trong phần thân của một cuộc gọi AJAX, mà không phải lo lắng về các sự kiện liên kết đôi vô tình.
  3. Bằng cách gói tập lệnh bên trong $(function() {...}), tập lệnh này có thể được tải lại bởi phần chính của trang hoặc trong phần thân của lệnh gọi AJAX. $(document).ready()không bị sa thải vì các yêu cầu AJAX, trong khi $(function() {...})đó.

Đây là một ví dụ:

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

Nếu đầu vào của bạn là search, bạn cũng có thể sử dụng on 'search'sự kiện. Thí dụ

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

.

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

3

Mã HTML:-

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

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

Mã script Java

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

Biểu mẫu của bạn không có nút Gửi mặc định


2

Một biến thể tinh tế khác. Tôi đã phân tách quyền hạn một chút, vì vậy tôi có một plugin để cho phép bắt phím enter, sau đó tôi chỉ liên kết với các sự kiện thông thường:

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

Và sau đó được sử dụng:

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

Biến thể này cho phép bạn sử dụng phân quyền sự kiện (để liên kết với các yếu tố bạn chưa tạo).

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

0

Tôi không thể kích hoạt keypresssự kiện cho nút enter và gãi đầu một lúc, cho đến khi tôi đọc các tài liệu jQuery:

" Sự kiện nhấn phím được gửi đến một phần tử khi trình duyệt đăng ký đầu vào bàn phím. Điều này tương tự như sự kiện nhấn phím, ngoại trừ các phím bổ trợ và không in như Shift, Esc và xóa các sự kiện nhấn phím nhưng không phải là sự kiện nhấn phím. " ( https://api.jquery.com/keypress/ )

Tôi đã phải sử dụng keyuphoặc keydownsự kiện để nhấn nút enter.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.