Phát hiện dấu lùi và dấu lùi trên sự kiện “đầu vào”?


93

Làm thế nào để làm điều đó?

Tôi đã thử:

var key = event.which || event.keyCode || event.charCode;

if(key == 8) alert('backspace');

nhưng nó không hoạt động ...

Nếu tôi làm tương tự với sự kiện nhấn phím, nó hoạt động, nhưng tôi không muốn sử dụng phím bấm vì nó xuất ra ký tự đã nhập trong trường nhập của tôi. Tôi cần phải kiểm soát được điều đó


mã của tôi:

  $('#content').bind('input', function(event){

    var text = $(this).val(),
        key = event.which || event.keyCode || event.charCode;

    if(key == 8){
      // here I want to ignore backspace and del
    }

    // here I'm doing my stuff
    var new_text = 'bla bla'+text;
    $(this).val(new_text);
  });

không có ký tự nào nên được thêm vào đầu vào của tôi, ngoài những gì tôi đang thêm với val () thực sự thì đầu vào từ người dùng sẽ bị bỏ qua hoàn toàn, chỉ có hành động nhấn phím là quan trọng đối với tôi


3
Bạn thực sự không cần thực hiện or'ing - event. mà chỉ là tốt, jQuery chuẩn hóa đối tượng sự kiện cho bạn. Xem api.jquery.com/category/events/event-object
Niko

Bạn phải đặt tên của sự kiện làm đối số đầu tiên của .bind, không phải một bộ chọn. Nên$('content').bind('keypress', ...
pmrotule

Câu trả lời:


119

Sử dụng .onkeydownvà hủy bỏ việc xóa với return false;. Như thế này:

var input = document.getElementById('myInput');

input.onkeydown = function() {
    var key = event.keyCode || event.charCode;

    if( key == 8 || key == 46 )
        return false;
};

Hoặc với jQuery, vì bạn đã thêm thẻ jQuery vào câu hỏi của mình:

jQuery(function($) {
  var input = $('#myInput');
  input.on('keydown', function() {
    var key = event.keyCode || event.charCode;

    if( key == 8 || key == 46 )
        return false;
  });
});

Các bác sĩ cho biết:


19
Điều gì sẽ xảy ra nếu bạn muốn bắt đầu vào từ nhấp chuột phải> dán?
ctb

6
keydownkhông làm việc trong Chrome Android, nó sẽ trả emptyness khi xóa lùi click hoặc del
Kosmetika

2
Trong hàm chúng ta phải giữ sự kiện dưới dạng tham số thì chỉ nó mới hoạt động giống như hàm (sự kiện) -------------------------- var input = document. getElementById ('myInput'); input.onkeydown = function (event) {var key = event.keyCode || event.charCode; if (key == 8 || key == 46) trả về false; };
Anurag_BEHS

1
với jQuery nó trong nội bộ lọc enterbackspacecác phím trên inputcác sự kiện, và các phím bấm không đạt được nó
vsync

@Wouter - Đó không phải là vấn đề lớn, nhưng tôi nghĩ rằng có một lỗi đánh máy trong mã jquery. Tôi nghĩ bạn muốn thêm tên tham số "event" vào trình xử lý sự kiện on-keydown.
RoboBear

14

Với jQuery

Các event.which tài sản bình thường hóa event.keyCode và event.charCode. Bạn nên xem event.which để nhập phím bàn phím.

http://api.jquery.com/event.which/

jQuery('#input').on('keydown', function(e) {
    if( e.which == 8 || e.which == 46 ) return false;
});

2
Tôi đã sử dụng jQuery trong một thời gian dài, nhưng không thấy điều này. Luôn luôn tốt để học một cái gì đó mới. +1!
Sablefoste

9

event.key === "Backspace"

Gần đây hơn và sạch hơn nhiều: sử dụng event.key. Không còn mã số tùy ý!

input.addEventListener('keydown', function(event) {
    const key = event.key; // const {key} = event; ES6+
    if (key === "Backspace" || key === "Delete") {
        return false;
    }
});

Tài liệu Mozilla

Các trình duyệt được hỗ trợ


Đôi khi event.key trả về "Process" vì một lý do tôi không thể hiểu ...
Oscar Chambers

Đó là một trình duyệt được hỗ trợ. Bạn có thể gặp lỗi hoặc có lẽ bàn phím tùy chỉnh của bạn không kích hoạt các sự kiện keydown
Gibolt

3

Bạn đã thử sử dụng 'onkeydown' chưa? Đây là sự kiện bạn đang tìm kiếm.

Nó hoạt động trước khi đầu vào được lắp vào và cho phép bạn hủy đầu vào ký tự.


nhưng làm thế nào để tôi hủy bỏ nó? bởi vì tôi đang sử dụng val () trên đầu vào và nó vẫn gắn thêm các ký tự gõ
Alex

3
Làm thế nào về event.preventDefault()?
Niko

Bạn chỉ có thể return false;hủy bất kỳ sự kiện nào khi sử dụng jQuery.
iMoses

3

Đó là một câu hỏi cũ, nhưng nếu bạn muốn bắt một sự kiện xóa lùi khi nhập, chứ không phải nhấn phím, nhấn phím hoặc nhấn phím — như tôi đã nhận thấy bất kỳ một trong số những chức năng này phá vỡ một số chức năng tôi đã viết và gây ra sự chậm trễ khó xử với định dạng văn bản tự động —Bạn có thể bắt được khoảng trắng bằng cách sử dụng inputType:

document.getElementsByTagName('input')[0].addEventListener('input', function(e) {
    if (e.inputType == "deleteContentBackward") {
        // your code here
    }
});

3

keydown với event.key === "Backspace" or "Delete"

Gần đây hơn và sạch hơn nhiều: sử dụng event.key. Không còn mã số tùy ý!

input.addEventListener('keydown', function(event) {
    const key = event.key; // const {key} = event; ES6+
    if (key === "Backspace" || key === "Delete") {
        return false;
    }
});

Phong cách hiện đại:

input.addEventListener('keydown', ({key}) => {
    if (["Backspace", "Delete"].includes(key)) {
        return false
    }
})

Tài liệu Mozilla

Các trình duyệt được hỗ trợ


2
$('div[contenteditable]').keydown(function(e) {
// trap the return key being pressed
if (e.keyCode === 13 || e.keyCode === 8)
{
    return false;
}
});

1
Mã khóa 8 cho "BackSpace"
Phanikumar Jatavallabhula

Câu hỏi là về backspace và delete, không phải backspace và enter.
Paul

0
//Here's one example, not sure what your application is but here is a relevant and likely application 
function addDashesOnKeyUp()
{
    var tb = document.getElementById("tb1"); 
    var key = event.which || event.keyCode || event.charCode;

    if((tb.value.length ==3 || tb.value.length ==7 )&& (key !=8) ) 
    {
        tb.value += "-"
    } 
}

0

trên các thiết bị Android sử dụng chrome, chúng tôi không thể phát hiện ra khoảng trống. Bạn có thể sử dụng giải pháp thay thế cho nó:

var oldInput = '',
    newInput = '';

 $("#ID").keyup(function () {
  newInput = $('#ID').val();
   if(newInput.length < oldInput.length){
      //backspace pressed
   }
   oldInput = newInput;
 })

Tôi thực sự không muốn đây là câu trả lời, nhưng có vẻ như vậy, vì họ đã đặt whichkeyCodelà 229. Phải có một cách tốt hơn, hoặc một cách tốt hơn sắp ra mắt, nhưng về cơ bản tôi sẽ sử dụng điều này ngay bây giờ. ..
JohnnyFun
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.