2010-08-11 25 views
5

Tôi chỉ có thể truy xuất giá trị mà không cần bấm phím mới. Sử dụng sự kiện keyup không phải là một tùy chọn, vì nó không kích hoạt nếu người dùng không giải phóng khóa. Điều này là quan trọng bởi vì tôi muốn hành động theo từng phím bấm.Làm thế nào tôi có thể nhận được giá trị MỚI của đầu vào văn bản HTML trong một sự kiện nhấn phím qua jQuery?

Kết hợp giá trị cũ với mã khóa có thể truy cập được từ đối số của sự kiện không được chấp nhận, vì không đảm bảo rằng người dùng sẽ nhập vào cuối chuỗi trong hộp văn bản.

+0

Còn việc sử dụng sự kiện thay đổi trên trường nhập liệu thì sao? – Adam

+1

sự kiện thay đổi chỉ xảy ra khi trường nhập mất tiêu điểm để nó không hoạt động .. – darma

+0

sau khi làm việc với Bacon.js một chút, tôi hoàn toàn giải quyết vấn đề này với nó – jcollum

Trả lời

2

Có thể tìm ra giá trị sẽ sau khi nhấn phím. Thật dễ dàng trong các trình duyệt IE không và phức tạp hơn trong IE, nhưng sau đây sẽ làm điều đó:

document.getElementById("your_input").onkeypress = function(evt) { 
    var val = this.value; 
    evt = evt || window.event; 
    var charCode = typeof evt.which == "number" ? evt.which : evt.keyCode; 
    if (charCode) { 
     var keyChar = String.fromCharCode(charCode); 
     var start, end; 
     if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") { 
      start = this.selectionStart; 
      end = this.selectionEnd; 
     } else if (document.selection && document.selection.createRange) { 
      // For IE up to version 8 
      var selectionRange = document.selection.createRange(); 
      var textInputRange = this.createTextRange(); 
      var precedingRange = this.createTextRange(); 
      var bookmark = selectionRange.getBookmark(); 
      textInputRange.moveToBookmark(bookmark); 
      precedingRange.setEndPoint("EndToStart", textInputRange); 
      start = precedingRange.text.length; 
      end = start + selectionRange.text.length; 
     } 
     var newValue = val.slice(0, start) + keyChar + val.slice(end); 
     alert(newValue); 
    } 
}; 
+0

kahoon, điều này có giúp bạn không? –

+0

Cảm ơn bạn, đây là điều gần nhất với những gì tôi muốn đạt được. Một vấn đề lớn mặc dù: nó vẫn không bảo vệ khỏi sao chép và dán dữ liệu tùy ý vào đầu vào. – kahoon

+0

OK. Bạn đã không đề cập đến điều đó trong câu hỏi. Trong hầu hết các trình duyệt, bạn có thể ngăn chặn điều đó bằng một 'document.getElementById (" your_input ") đơn giản.onpaste = function() {return false; }; '. Firefox 2 và tôi nghĩ rằng tất cả các phiên bản của Opera không hỗ trợ sự kiện dán. –

6

Quấn mã xử lý của bạn trong setTimeout(function() { ... }, 0).

Điều này sẽ thực thi mã trong vòng lặp tin nhắn tiếp theo, sau khi value đã được cập nhật.

+0

+1 Đã xác nhận, công trình này: http: // jsfiddle .net/3tRMx/ – Ender

+0

Nhưng sau đó tôi sẽ mất cơ hội để ngăn chặn sự kiện. Tuy nhiên, nếu tôi kết hợp điều này với đề xuất của Jeff T, tôi có thể khôi phục giá trị của đầu vào về trạng thái trước đó nếu tôi thấy nó không hợp lệ. Mặc dù vậy, tôi vẫn mở các ý tưởng khác. – kahoon

+0

Nếu bạn muốn có thể khôi phục trạng thái trước đó, bạn có thể lưu giá trị trước khi vào setTimeout và tham khảo lại nếu bạn phát hiện thấy cần khôi phục. Cập nhật jsFiddle tại đây: http://jsfiddle.net/3tRMx/1/ Hãy thử nhập 'xx' để xem phần khôi phục tại nơi làm việc. – Ender

1

Đây là ý tưởng có thể hoạt động. Sử dụng nhấn phím và lưu trữ val tại điểm đó để bạn luôn có thể so sánh giá trị hiện tại với giá trị cuối cùng và tìm sự khác biệt trong chuỗi. Sự khác biệt sẽ là chìa khóa được nhấn.

Một cách để làm điều này là biến chuỗi thành mảng và so sánh 2 mảng như họ đang làm gì ở đây: JavaScript array difference

Không bao giờ thử bất cứ điều gì như thế này để nó có thể không khả thi nhưng có thể là giá trị một shot .

0

Tôi đã có một trường hợp cụ thể với phím TAB, làm thay đổi e.target trong KeyUp, vì vậy đó là giải pháp - ràng buộc để phần tử container, lấy mục tiêu đầu vào trong trình xử lý keyDown, đăng ký keyUp và đọc giá trị.

$("#container").keydown(function (e) { 
    //here you decide whether to handle the key event, and grab the control that sent the event 
    var myInput = e.target; 
    $("#container").one('keyup', function() { 
     console.log(myInput.val()); 
     // do smth here 
    }); 
}); 
Các vấn đề liên quan