jQuery: Cách chụp phím TAB trong Hộp văn bản


145

Tôi muốn chụp phím TAB, hủy hành động mặc định và gọi chức năng javascript của riêng tôi.

Câu trả lời:


249

Chỉnh sửa: Vì phần tử của bạn được chèn động, bạn phải sử dụng ủy quyềnon() như trong ví dụ của mình, nhưng bạn nên liên kết nó với sự kiện nhấn phím, vì như @Marc nhận xét, trong IE, sự kiện nhấn phím không chụp các phím không có ký tự:

$("#parentOfTextbox").on('keydown', '#textbox', function(e) { 
  var keyCode = e.keyCode || e.which; 

  if (keyCode == 9) { 
    e.preventDefault(); 
    // call custom function here
  } 
});

Kiểm tra một ví dụ ở đây .


khi tôi đẩy TAB trong IE6 + thì sự kiện không kích hoạt (nó kích hoạt bất kỳ khóa chữ và số nào) ... Tôi cần sử dụng .live ('keypress', fn)
Jon Erickson

Nếu chỉ hoạt động với trực tiếp, có thể bạn đang tự động chèn phần tử hộp văn bản của mình, nếu phần tử đã có trên trang, nó sẽ hoạt động, kiểm tra ví dụ này: jsbin.com/oguhe
CMS

yea hộp văn bản được chèn động. ví dụ của tôi với id #textbox chỉ là để đơn giản hóa câu hỏi =)
Jon Erickson

@Jon, lý do bạn không sử dụng $ (bộ chọn) .live ("keydown", fn) là? CMS đang đề xuất sử dụng phím tắt vì trong IE, phím nhấn không hoạt động đối với các phím không có vi khuẩn, (chẳng hạn như Tab)
Marc

5
@AppleGrew: nó nói như vậy, vâng, nhưng nó không đúng - ít nhất là đối với phím nhấn. Đối với Tab e.which là 0 và e.keyCode là 9 (như vậy). Đã thử nghiệm trong FF 3.5.16, jQuery 1.6.2.
johndodo

19

Ví dụ hoạt động trong jQuery 1.9:

$('body').on('keydown', '#textbox', function(e) {
    if (e.which == 9) {
        e.preventDefault();
        // do your code
    }
});

2
thực hiện e.preventDefault();gấp đôi để ngăn chèn khoảng trắng vào hộp văn bản.
stil

12
$('#textbox').live('keypress', function(e) {
    if (e.keyCode === 9) {
        e.preventDefault();
        // do work
    }
});

2
Ngoài ra, để hủy hành động mặc định, sử dụng e.preventDefault (); trong dòng đầu tiên của hàm.
Josh Leitzel

@Jon, nhấn phím không bắt được các phím không có vi khuẩn trong IE
Marc

@Marc Tôi thấy rằng, làm thế nào tôi có thể tương thích với IE và FF?
Jon Erickson

4
^^ Thật trớ trêu ... jQuery được cho là thu hẹp khoảng cách giữa các broswers, do đó bạn không phải lo lắng về những thứ như thế này.
Jagd

@Jagd, jQuery không thể suy ra ý định. nhấn phím và nhấn phím không tương đương vì lý do chính đáng. Nó chỉ xảy ra như vậy, tình huống này không đòi hỏi sự phân biệt.
Marc

7

Các phương thức được hiển thị ở trên không hoạt động với tôi, có thể tôi đang sử dụng jquery bit cũ, sau đó cuối cùng đoạn mã được hiển thị bên dưới hoạt động cho - đăng chỉ trong trường hợp ai đó ở cùng vị trí của tôi

$('#textBox').live('keydown', function(e) {
    if (e.keyCode == 9) {
        e.preventDefault();
        alert('tab');
    }
});

5

Một phần quan trọng của việc sử dụng phím trên tab là biết rằng tab sẽ luôn cố gắng thực hiện điều gì đó, đừng quên "trả lại sai" ở cuối.

Đây là những gì tôi đã làm. Tôi có một chức năng chạy trên .blur và một chức năng hoán đổi nơi tập trung biểu mẫu của tôi. Về cơ bản, nó thêm một đầu vào vào cuối biểu mẫu và đến đó trong khi chạy các phép tính trên mờ.

$(this).children('input[type=text]').blur(timeEntered).keydown(function (e) {
        var code = e.keyCode || e.which;
        if (code == "9") {
            window.tabPressed = true;
            // Here is the external function you want to call, let your external
            // function handle all your custom code, then return false to
            // prevent the tab button from doing whatever it would naturally do.
            focusShift($(this));
            return false;
        } else {
            window.tabPressed = false;
        }
        // This is the code i want to execute, it might be different than yours
        function focusShift(trigger) {
            var focalPoint = false;
            if (tabPressed == true) {
                console.log($(trigger).parents("td").next("td"));
                focalPoint = $(trigger).parents("td").next("td");

            }
            if (focalPoint) {
                $(focalPoint).trigger("click");
            }
        }
    });

4

Thử cái này:

$('#contra').focusout(function (){
    $('#btnPassword').focus();
});

1

Giả sử bạn có TextBox với Id txtName

$("[id*=txtName]").on('keydown', function(e) { 
  var keyCode = e.keyCode || e.which; 
  if (keyCode == 9) {
     e.preventDefault();
     alert('Tab Pressed');
 }
}); 

1

Bạn có thể chụp một tab sự kiện bằng API JQuery này .

$( "#yourInputTextId" ).keydown(function(evt) {
   if(evt.key === "Tab")
      //call your function
});

nó hoạt động với tôi sau khi thêm evt.preventDefault (); trong if
LowFieldTheory

-1

Điều này làm việc cho tôi:

$("[id*=txtName]").on('keydown', function(e) { var keyCode = e.keyCode || e.which; if (keyCode == 9) { e.preventDefault(); alert('Tab Pressed'); } });

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.