2010-05-11 26 views
26

Tôi có một trường văn bản biểu mẫu mà tôi muốn chỉ cho phép số và chữ cái. (Nghĩa là, không có # $ !, v.v ...) Có cách nào để ném lên một lỗi và ngăn phím bấm thực sự xuất ra bất cứ điều gì nếu người dùng cố gắng sử dụng bất kỳ ký tự nào khác ngoài số và chữ cái? Tôi đã cố gắng để tìm một plugin, nhưng chưa thực sự tìm thấy bất cứ điều gì mà thực hiện điều này ...jquery - xác thực ký tự trên nhấn phím?

+0

Rất tương tự như: http://stackoverflow.com/questions/995183/how-to-allow-only-numeric-0-9-in-html-inputbox-using-jquery – ThiefMaster

+0

này sẽ không ngăn các ký tự không phải chữ và số được dán vào bằng menu ngữ cảnh (nhấp chuột phải và dán). Hãy thử rằng trên http://jsfiddle.net/ntywf –

+0

là một plugin thực hiện điều đó rất thuận lợi: http://digitalbush.com/projects/masked-input-plugin/ – meo

Trả lời

34
$('input').keyup(function() { 
    var $th = $(this); 
    $th.val($th.val().replace(/[^a-zA-Z0-9]/g, function(str) { alert('You typed " ' + str + ' ".\n\nPlease use only letters and numbers.'); return ''; })); 
}); 

EDIT:

Có một số câu trả lời tốt khác ở đây sẽ ngăn chặn đầu vào diễn ra.

Tôi đã cập nhật mỏ vì bạn cũng muốn hiển thị lỗi. Việc thay thế có thể có một chức năng thay vì một chuỗi. Hàm chạy và trả về một giá trị thay thế. Tôi đã thêm một số alert để hiển thị lỗi.

http://jsfiddle.net/ntywf/2/

+1

+1 hoạt động độc đáo. http://jsfiddle.net/ntywf/ Mặc dù tôi có * cảm giác * OP cũng có thể muốn không gian được cho phép. – karim79

+0

@ karim79 - Cảm ơn bạn đã thêm jsfiddle. Tôi nên thực sự làm điều đó thường xuyên hơn. – user113716

+0

nó chặn các lệnh cần thiết như lên, xuống mũi tên, thay đổi và ctrl hoạt động là tốt. Làm thế nào để kiểm soát điều đó. –

10
$('#yourfield').keydown(function(e) { 
    // Check e.keyCode and return false if you want to block the entered character. 
}); 
11

Vâng câu trả lời của patrick loại bỏ nhân vật nếu nó là sai, để thực sự ngăn chặn nhân vật khỏi bị đưa vào sử dụng lĩnh vực

$("#field").keypress(function(e) { 
    // Check if the value of the input is valid 
    if (!valid) 
     e.preventDefault(); 
}); 

Bằng cách này, bức thư sẽ không đến với textarea

0

Bạn có thể thử tiện ích mở rộng này:

jQuery.fn.ForceAlphaNumericOnly = 
function() 
{ 
    return this.each(function() 
    { 
     $(this).keydown(function(e) 
     { 
      var key = e.charCode || e.keyCode || 0; 
      // allow backspace, tab, delete, arrows, letters, numbers and keypad numbers ONLY 
      return (
       key == 8 || 
       key == 9 || 
       key == 46 || 
       (key >= 37 && key <= 40) || 
       (key >= 48 && key <= 57) || 
       (key >= 65 && key <= 90) || 
       (key >= 96 && key <= 105)); 
     }) 
    }) 
}; 

năng bảo mật bằng:

$("#yourInput").ForceAlphaNumericOnly(); 
+0

Tôi chỉ nghĩ về giải pháp này: có thể có vấn đề nếu bạn chèn văn bản từ bộ đệm.Nếu người dùng nhấn ctrl + v, anh ta dự kiến ​​văn bản của anh ta sẽ được chèn vào trường nếu nó hợp lệ. Cách tiếp cận này có thể không xử lý được. Phải kiểm tra nó mặc dù. – Juriy

0

Phần mở rộng jquery trên (ForceAlphaNumericOnly) là tốt nhưng vẫn cho phép các ký tự sau thông qua [email protected]#$%^&*()

Trên Mac của tôi, khi bạn nhấn thay đổi chìa khóa (keycode 16) và sau đó , mã sẽ nhập ! nhưng mã khóa là 49, mã khóa cho 1.

5

Tôi thấy rằng việc kết hợp xác thực trên nhấn phím và khóa phím sẽ mang lại kết quả tốt nhất. Key up là phải nếu bạn muốn xử lý văn bản đã sao chép. Nó cũng là một bắt tất cả trong trường hợp các vấn đề trình duyệt chéo cho phép các giá trị không số vào hộp văn bản của bạn.

$("#ZipCode").keypress(function (event) { 

     var key = event.which || event.keyCode; //use event.which if it's truthy, and default to keyCode otherwise 

     // Allow: backspace, delete, tab, and enter 
     var controlKeys = [8, 9, 13]; 
     //for mozilla these are arrow keys 
     if ($.browser.mozilla) controlKeys = controlKeys.concat([37, 38, 39, 40]); 

     // Ctrl+ anything or one of the conttrolKeys is valid 
     var isControlKey = event.ctrlKey || controlKeys.join(",").match(new RegExp(key)); 

     if (isControlKey) {return;} 

     // stop current key press if it's not a number 
     if (!(48 <= key && key <= 57)) { 
      event.preventDefault(); 
      return; 
     } 
    }); 

$('#ZipCode').keyup(function() { 
    //to allow decimals,use/[^0-9\.]/g 
    var regex = new RegExp(/[^0-9]/g); 
    var containsNonNumeric = this.value.match(regex); 
    if (containsNonNumeric) 
     this.value = this.value.replace(regex, ''); 
}); 
+1

Trong Chrome khi dán (ctrl-v), khóa phím dường như không có bất kỳ giá trị nào cho this.value để regex không bao giờ khớp. Trong Firefox, tôi quan sát rằng End, Delete, Home, Page Up và Page Down không hoạt động trong trường. – peater

0
$(document).ready(function() { 
$('.ipFilter').keydown((e) => { 
    if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 || 
     (e.keyCode === 65 && (e.ctrlKey === true || e.metaKey === true) || 
      e.keyCode === 67 && (e.ctrlKey === true || e.metaKey === true) || 
      e.keyCode === 86 && (e.ctrlKey === true || e.metaKey === true) || 
      e.keyCode === 82 && (e.ctrlKey === true || e.metaKey === true)) || 
     (e.keyCode >= 35 && e.keyCode <= 40)) { 
      return; 
    } 
    if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) { 
     e.preventDefault(); 
    } 
    }); 
}); 
Các vấn đề liên quan