2011-11-21 25 views
24

Tôi đang sử dụng cụm từ thông dụng để tách các ký tự không hợp lệ ra khỏi vùng nhập văn bản trong javascript (đang chạy trong IE). Tôi chạy chức năng thay thế trên mọi sự kiện keyup. Tuy nhiên, điều này làm cho con trỏ nhảy đến cuối hộp văn bản sau mỗi lần nhấn phím, điều này làm cho việc chỉnh sửa nội tuyến không thể thực hiện được.Dừng con trỏ từ nhảy đến cuối trường nhập trong javascript thay thế

Đây là nó trong hành động:

http://jsbin.com/ifufuv/2

Có ai biết làm thế nào để làm cho nó để con không nhảy đến cuối của hộp đầu vào?

+2

tôi khuyên bạn chọn một sự kiện tốt hơn để xử lý. 'onkeyup' kém để phát hiện đầu vào của người dùng. Xem http://whattheheadsaid.com/2010/09/effectively-detecting-user-input-in-javascript. –

+0

Dưới đây là ví dụ hoàn chỉnh về cách duy trì lựa chọn khi thay thế giá trị của vùng văn bản: http://stackoverflow.com/questions/3286595/update-textarea-value-but-keep-cursor-position/3288215#3288215 –

Trả lời

10

Bạn sẽ phải đặt con trỏ trở lại vị trí mong muốn. Đối với IE9, hãy đặt .selectionStart.selectionEnd (hoặc sử dụng .setSelectionRange(start, end)). Đối với IE8 trở về trước, hãy sử dụng .createTextRange() và gọi .moveStart() trên phạm vi văn bản.

+3

W3Schools có một ví dụ tuyệt vời về cách sử dụng onkeypress để hủy bỏ các khóa (trong ví dụ của nó, nó hủy bỏ các số, và bạn dường như đủ khả năng để sửa đổi regex để đưa ra các ký tự mà bạn không muốn). http://www.w3schools.com/jsref/event_onkeypress.asp – John

+6

@Mike: W3Schools không thực sự xứng đáng với những người như bạn quảng bá trang web của họ cho họ. Hãy xem http://w3fools.com - rất nhiều thông tin tại w3s là sai hoặc thúc đẩy thực tiễn xấu cho các nhà phát triển. Có nhiều tài nguyên tốt hơn trên web, như http://quirksmode.org hoặc http://developer.mozilla.org. –

+1

Tôi không phải là fan của w3schools: http://w3fools.com/. – gilly3

15

Ngoài gilly3's answer, tôi nghĩ ai đó có thể thấy hữu ích khi xem đoạn mã thực.

Trong ví dụ bên dưới, thuộc tính selectionStart được truy xuất từ ​​phần tử input trước thao tác chuỗi JavaScript. Sau đó, selectionStart được đặt trở lại vị trí ban đầu sau thao tác.

Tùy thuộc vào những gì bạn đang cố gắng đạt được, bạn cũng có thể truy cập selectionEnd thay cho số selectionStart và đặt phạm vi: setSelectionRange(start, end).

document.getElementById('target').addEventListener('input', function (e) { 
 
    var target = e.target, 
 
     position = target.selectionStart; // Capture initial position 
 
    
 
    target.value = target.value.replace(/\s/g, ''); // This triggers the cursor to move. 
 
    
 
    target.selectionEnd = position; // Set the cursor back to the initial position. 
 
});
<p>The method <code>.replace()</code> will move the cursor's position, but you won't notice this.</p> 
 
<input type="text" id="target" />

+1

Tôi đã thực hiện một cách nhanh chóng dựa trên mã của bạn với một hàm để cấu trúc lại dễ dàng https://gist.github.com/romuleald/f1b980d5ad01b9f525e8e0244f91711a – romuleald

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