Tôi đang viết một công cụ đánh dấu cú pháp. Công cụ đánh dấu sẽ cập nhật đánh dấu ngay lập tức trong khi nhập văn bản và điều hướng bằng các phím mũi tên.Cách nhận vị trí con trỏ văn bản sau khi sự kiện nhấn phím đã xảy ra?
Sự cố tôi gặp phải là khi sự kiện 'nhấn phím' được kích hoạt, bạn vẫn nhận được vị trí cũ của con trỏ văn bản qua window.getSelection()
.
Ví dụ:
function handleKeyEvent(evt) {
console.log(evt.type, window.getSelection().getRangeAt(0).startOffset);
}
var div = document.querySelector("div");
div.addEventListener("keydown", handleKeyEvent);
div.addEventListener("keypress", handleKeyEvent);
div.addEventListener("input", handleKeyEvent);
div.addEventListener("keyup", handleKeyEvent);
<div contenteditable="true">f<span class="highlight">oo</span></div>
Trong ví dụ, đặt dấu nháy trước chữ 'foo', sau đó nhấn → (phím mũi tên bên phải).
Trong giao diện điều khiển của DevTool yêu thích của bạn, bạn sẽ thấy như sau:
keydown 0
keypress 0
keyup 1
Đó 0
ngoài keypress
rõ ràng là vị trí dấu nháy cũ. Nếu bạn giữ phím → lâu hơn một chút, bạn sẽ nhận được một cái gì đó như thế này:
keydown 0
keypress 0
keydown 1
keypress 1
keydown 1
keypress 1
keydown 2
keypress 2
keyup 2
vị trí dấu nháy mới như tôi sẽ nhận được nó cho 'KeyUp' hoặc 'đầu vào' Những gì tôi muốn nhận được là. Mặc dù 'keyup' được kích hoạt quá muộn (tôi muốn làm nổi bật cú pháp trong khi phím được nhấn xuống) và 'input' chỉ được kích hoạt khi có một số đầu vào (nhưng → không tạo ra bất kỳ đầu vào nào).
Có sự kiện nào được kích hoạt sau khi vị trí dấu mũ đã thay đổi và không chỉ trên đầu vào? Hay tôi phải tính toán vị trí của con trỏ văn bản và nếu vậy, làm thế nào? (Tôi giả định này có thể nhận được khá phức tạp khi văn bản kết thúc tốt đẹp và bạn nhấn ↓ (phím mũi tên xuống).)
Tôi nghĩ bạn sẽ gặp phải sự cố khác khi sử dụng sự kiện nhấn phím. Chrome dường như không kích hoạt sự kiện khi nhấn phím mũi tên (Firefox). Có một lỗi crom cũ trong trạng thái WontFix mô tả điều này: https://bugs.chromium.org/p/chromium/issues/detail?id=2606 – Alex
Cảm ơn bạn đã gợi ý! Đúng vậy, sự kiện 'nhấn phím 'không được kích hoạt, nhưng [nó rõ ràng được đánh dấu là lỗi thời] (https://www.w3.org/TR/uievents/#legacy-keyboardevent-event-types). Như tôi đã thấy, đặc điểm kỹ thuật nói rằng mọi người nên sử dụng sự kiện 'beforeinput' để thay thế. Và 'keydown' cũng bị bắn liên tục. Mặc dù tất cả những sự kiện đó đều bị sa thải quá sớm. Tôi bây giờ [đã gửi một vấn đề về thông số sự kiện giao diện người dùng.] (Https://github.com/w3c/uievents/issues/111) với hy vọng nhận được sự kiện thích hợp cho việc này. –
Vị trí con trỏ/chọn vv vẫn là một pita để hỗ trợ trên tất cả các trình duyệt. Nó được một thời gian mà tôi cần này nhưng [rangy] (https://github.com/timdown/rangy) là rất vững chắc với các công cụ liên quan đến con trỏ .. –