2009-07-18 18 views
11

Tôi có một số javascript điều khiển html dựa trên những gì người dùng đã chọn. Đối với các trình duyệt thực, các phương pháp tôi đang sử dụng tận dụng đối tượng "Phạm vi", thu được như vậy:Sự cố phát hiện Đường kẻ mới trong đối tượng Phạm vi JavaScript

var sel = window.getSelection(); 
    var range = sel.getRangeAt(0); 
    var content = range.toString(); 

Biến nội dung chứa tất cả văn bản đã chọn, hoạt động tốt. Tuy nhiên tôi thấy rằng tôi không thể phát hiện các dòng mới trong chuỗi kết quả. Ví dụ:

văn bản được lựa chọn là:

abc

def

writing

range.toString() để đánh giá "abcdefghi".

Mọi tìm kiếm trên các ký tự đặc biệt sẽ không trả về phiên bản \ n \ f \ r hoặc thậm chí \ s. Tuy nhiên, nếu tôi ghi biến đó ra một điều khiển có thể chỉnh sửa, các nguồn cấp dữ liệu dòng sẽ xuất hiện trở lại.

Có ai biết tôi đang thiếu gì không?

Có thể có liên quan rằng các lựa chọn và thao tác này nằm trên div có thể chỉnh sửa. Các hành vi tương tự là rõ ràng trong Chrome, FireFox và Opera. Đáng ngạc nhiên là IE cần mã hoàn toàn khác nhau, nhưng không có bất kỳ vấn đề ở đó, khác hơn là chỉ là IE.

Rất cám ơn.

+0

Bạn có ý nghĩa gì bởi 'range.toString() đánh giá thành "abcdefghi"'? Bạn đang sử dụng cái gì để kiểm tra giá trị đó? Trình gỡ lỗi? alert()? –

+0

Bạn có đang viết giá trị 'dải ô' cho điều khiển có thể chỉnh sửa hay' dải ô.toString() 'không? – RaYell

+0

@Ben Dunlap tất cả những điều trên, sử dụng trình gỡ rối bên ngoài, cảnh báo hoặc trình gỡ rối dựa trên trình duyệt. Ví dụ, nhấn vào một điểm ngắt với Visual Studio. @RaYell - Tôi đã thử viết nội dung do phạm vi của tôi.toString() gọi vào div có thể chỉnh sửa, để chứng minh rằng nó đã duy trì thông tin dòng mới. Câu trả lời thứ nhất đóng đinh điều này mặc dù, sel.toString() có các dòng mới, range.toString() thì không. Cảm ơn tất cả. – Timbo

Trả lời

11

Chỉnh sửa bài viết của tôi:

Thử nghiệm một chút, tôi thấy rằng sel.toString() lợi nhuận dòng mới trong divs contenteditable, trong khi lợi nhuận range.toString() dòng mới một cách chính xác trong divs không thể chỉnh sửa bình thường, nhưng không phải trong những có thể chỉnh sửa, như bạn báo cáo.

Không thể tìm thấy bất kỳ lời giải thích nào về hành vi này.

Đây là một liên kết hữu ích http://www.quirksmode.org/dom/range_intro.html

+0

Tuyệt vời, yep, sel.toString() có các dòng mới. Cảm ơn rất nhiều! – Timbo

+1

Giải thích rất đơn giản và được trình bày trong đặc tả Phạm vi DOM: 'Range.toString()' chỉ bao gồm nội dung từ các nút văn bản. Vì vậy, không có phần tử '
' và ngắt dòng được ngụ ý bởi các phần tử khối. –

+1

'document.getSelection(). ToString()' không hoạt động trong IE 11. nó kết hợp tất cả văn bản dòng mới thành một. – agpt

1

tôi thấy ít nhất hai cách khác, vì vậy bạn vẫn có thể sử dụng phạm vi để tìm vị trí của dấu nháy trong Mozilla.

Một cách là gọi

var documentFragment = rangeObj.cloneContents(); 

nắm giữ một mảng của childNodes, và bất kỳ ngắt dòng sẽ hiển thị như là một nút của lớp "HTMLBRElement".


Cách khác là đảm bảo mỗi thẻ "br" được theo sau bởi ký tự dòng mới (0x0a)!

Điều này sẽ không làm tổn hại nội dung HTML theo bất kỳ cách hiển thị nào, nhưng giờ đây tất cả các ngắt HTML được dịch sang ngắt dòng văn bản thuần túy ngay khi range.toString() đang được gọi!


Tôi hy vọng điều này sẽ giúp - ngay cả khi chủ đề này rất cũ. (Tôi là một necromancer anyway, hehe) :)

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