2010-02-17 68 views
37

Tôi đã thử tìm kiếm nhưng không chắc chắn về các cụm từ cần tìm.jQuery: cách lọc ra các phím không phải ký tự trên sự kiện nhấn phím?

Tôi đang sử dụng jQuery và muốn sử dụng các sự kiện phím nhấn trong một hộp, nhưng ngăn chặn tất cả các ký tự không in được (ví dụ. Nhập, ESC, phím mũi tên, phím lùi , tab, ctrl, chèn, F1 - F12, v.v ...) từ kích hoạt sự kiện.

Có cách nào dễ dàng để xác định xem nó có thể in được không?

trả lời: https://stackoverflow.com/a/20206238/253704

Trả lời

27

Câu trả lời đã chọn cho câu hỏi này chưa hoàn tất. Nó không xử lý trường hợp một phím ký tự được nhấn kết hợp với phím bổ trợ (ví dụ: CTRL - A).

Hãy thử, ví dụ: nhập CTRL - A sử dụng firefox với mã sau. Câu trả lời hiện tại sẽ xem xét nó như là một nhân vật:

HTML:

<input placeholder="Try typing CTRL-A in Firefox" style="width: 200px"/> 

JavaScript:

$("input").keypress(function (e) { 
    if (e.which !== 0) { 
     alert(String.fromCharCode(e.which)); 
    } 
}); 

http://jsfiddle.net/4jx7v/

Lưu ý: một cảnh báo sẽ không bị sa thải nếu sử dụng một số trình duyệt (chẳng hạn như Chrome), vì chúng không kích hoạt sự kiện nhấn phím cho đầu vào không phải ký tự.

Một giải pháp tốt hơn có thể là:

HTML:

<input placeholder="Try typing CTRL-A in Firefox" style="width: 200px"/> 

JavaScript:

$("input").keypress(function (e) { 
    if (e.which !== 0 && 
     !e.ctrlKey && !e.metaKey && !e.altKey 
    ) { 
     alert(String.fromCharCode(e.which)); 
    } 
}); 

http://jsfiddle.net/hY5f4/

Trong trường hợp này, các cảnh báo chỉ được kích hoạt khi Một được nhấn, không phải CTRL - A cho tất cả các trình duyệt.

+0

Bắt tốt, và sửa chữa sạch đẹp - đây là một lưu ý quan trọng, như các phím bổ trợ có thể quan trọng để OP là tốt. – cincodenada

+0

Điều đó sẽ giải thích một vài trường hợp cạnh mà tôi nghĩ bàn phím không hoạt động. Cảm ơn bạn đã khắc phục! – twig

+1

Thao tác này sẽ không hoạt động nếu bạn sử dụng tổ hợp phím để nhập ký tự. Ví dụ: 'alt + a' (' å') trên máy Mac sẽ kích hoạt sự kiện onkeyup nhưng không. – Marian

-4

Bạn có thể sử dụng biểu thức thông thường như thế này

$('something').keypress(function(e) { 
    if(e.match(YourRegularExpressionHere)) { 
     //do something 
    } 
}); 

này sẽ chỉ làm điều gì đó nếu nó phù hợp với biểu thức chính quy.

Hãy xem cụm từ thông dụng. http://www.regular-expressions.info/javascript.html

+2

này sẽ không làm việc. 'e' là sự kiện thực sự, bạn cần phải nắm bắt ký tự để khớp với biểu thức chính quy. Bạn có thể sử dụng 'String.fromCharCode (e.which);' để nắm bắt ký tự đã nhập. – scurker

26
<script> 
    $("input").keypress(function (e) { 
     if (e.which !== 0 && 
      !e.ctrlKey && !e.metaKey && !e.altKey) { 
      alert(String.fromCharCode(e.which)); 
     } 
    }); 
</script> 

Có vẻ như chỉ làm việc tốt với jQuery 1.4.2, FF, IE, Chrome.

Để đi sâu vào mớ hỗn độn đó là xử lý sự kiện JS bàn phím, xem: JavaScript Madness: Keyboard Events


cập nhật để lọc ctrl, meta & alt tổ hợp phím theo Daniel's comment.

+0

Cảm ơn, thats tương tự như giải pháp tôi đã kết thúc thực hiện! – twig

+2

Tại sao lại sử dụng nhị phân HOẶC? "e.keyCode | e.charCode" Có thể là "e.keyCode || e.charCode"? – Roman

0

Kiểm tra các tổ hợp phím sẽ không phải là giải pháp tốt nhất trong mọi trường hợp. Ví dụ: Ví dụ: nếu bạn sử dụng tổ hợp phím để nhập ký tự, điều đó sẽ chặn sự kiện onkeypress, khi sự cố không được thực hiện.

Hãy thử điều đó ở đây và bạn sẽ thấy rằng nó sẽ không làm việc: (. Trên máy Mac, hãy thử alt + thư và trên Windows, hãy thử alt + một loạt các phím số) http://jsfiddle.net/4jx7v/

Một thay thế cho điều đó sẽ chỉ đơn giản là kiểm tra xem giá trị đầu vào có thay đổi so với giá trị trước đó hay không, theo cách đó, bạn biết chắc chắn rằng một cái gì đó đã được nhập.

JavaScript:

var previousValue; 
$("input").keypress(function (e) { 
    if (previousValue != $(this).val()) { 
     alert('Something has been typed.'); 
    } 
}); 
+0

Tôi không thể tin rằng câu trả lời này đã không nhận được nhiều upvotes hơn. Điều này làm việc tốt nhất cho tôi! –

Các vấn đề liên quan