2010-03-27 26 views

Trả lời

7

window.getSelection() cung cấp cho bạn đối tượng Selection. Sử dụng selection.rangeCountselection.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/startOffsetrange.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.

+0

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. –

+0

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

+0

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ụ: '|

Text
' so với '
|Text
' so với '
|Text
') –

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