window.getSelection()
cung cấp cho bạn đối tượng Selection. Sử dụng selection.rangeCount
và selection.getRangeAt()
để nhận đối tượng Range đại diện cho lựa chọn nào bạn muốn.
Bây giờ bạn có thể nhận các nút đầu tiên và cuối cùng trong lựa chọn từ range.startContainer
/startOffset
và range.endContainer
/endOffset
. Sau đó bạn có thể đi lên và xuống cây để nhặt tất cả các phần tử ở giữa hai vị trí đó, ví dụ như. sử dụng chức năng getElementsBetweenTree()
từ this answer.
Thật không may, mô hình TextRange của IE hoàn toàn khác với tiêu chuẩn W3 và HTML5 và nói chung tồi tệ hơn nhiều. Nó không từ bỏ vị trí bắt đầu và kết thúc gần như dễ dàng, và không phải trong bất kỳ cách đáng tin cậy nào. Tất cả bạn nhận được là parentElement
để cho bạn biết tổ tiên chung, và từ đó bạn bị giới hạn để đoán phạm vi dựa trên việc tạo Dải ô mới và gọi moveToElementText
trên đó rồi compareEndPoints
với phạm vi lựa chọn. Và nếu bạn cần phải biết chính xác lựa chọn văn bản bạn đang đoán dựa trên moveStart
/moveEnd
trong phạm vi và so sánh, điều đó hoàn toàn không vui.
IERange (http://code.google.com/p/ierange/) thực hiện tốt công việc tạo đối tượng giống như Phạm vi DOM từ TextRange. Tôi sử dụng các phiên bản của riêng tôi một chút sửa đổi các thuật toán từ IERange trong các dự án của tôi. –
Có vẻ tốt. (Bit quan trọng với việc tìm ra các ranh giới là trong 'TextRangeUtils.convertToDOMRange'.) Nó sẽ không thay thế hoàn toàn cho Range khi IE TextRanges không tôn trọng ranh giới phạm vi xung quanh các cạnh của các phần tử theo cách mà Range được cho là, nhưng có lẽ đủ tốt cho trường hợp thông thường. – bobince
Có, đã đồng ý. Tôi không chắc chắn nó có thể làm tốt hơn nói chung và nó đã làm việc tốt cho tất cả mọi thứ tôi đã sử dụng nó cho. Bạn có thể nghĩ về bất kỳ tình huống nào trong đó phân biệt giữa ranh giới nằm ở rìa của một phần tử và nó đang ở cạnh con của nó là rất quan trọng? (ví dụ: '|