2010-04-06 26 views
15

Tôi chọn một số văn bản trên trang html (mở bằng firefox) bằng chuột và sử dụng các hàm javascript, tôi tạo/lấy phạm vi từ tương ứng với văn bản đã chọn.Làm cách nào để đánh dấu văn bản của đối tượng Phạm vi DOM?

userSelection =window.getSelection(); 
var rangeObject = getRangeObject(userSelection); 

Bây giờ tôi muốn nhấn mạnh tất cả các văn bản mà đi kèm theo rangeobject.I đang làm nó như thế này,

var span = document.createElement("span"); 
    rangeObject.surroundContents(span); 
    span.style.backgroundColor = "yellow"; 

Vâng, điều này hoạt động tốt, chỉ khi rangeobject (startpoint và thiết bị đầu cuối) nằm trong textnode cùng, sau đó nó nhấn mạnh text.Ex tương ứng

<p>In this case,the text selected will be highlighted properly, 
     because the selected text lies under a single textnode</p> 

Nhưng nếu rangeobject bao gồm hơn một textnode, sau đó nó không được làm việc properlay, nó nhấn mạnh chỉ những văn bản mà nằm trong văn bản đầu tiên, Ex

<p><h3>In this case</h3>, only the text inside the header(h3) 
    will be highlighted, not any text outside the header</p> 

Bất kỳ ý tưởng nào tôi có thể tạo, tất cả văn bản nằm trong một nút hoặc nhiều nút? Cảm ơn ....

+0

Có thể trùng lặp: http://stackoverflow.com/questions/1622629/javascript-highlight-selected-range-button –

Trả lời

24

Tôi khuyên bạn nên sử dụng phương thức document hoặc TextRange 'execCommand, được xây dựng chỉ với mục đích như vậy, nhưng thường được sử dụng trong tài liệu có thể chỉnh sửa. Đây là câu trả lời tôi đưa ra cho một câu hỏi tương tự:

Sau đây nên làm những gì bạn muốn. Trong các trình duyệt không phải IE, nó bật designMode, áp dụng một màu nền và sau đó chuyển đổi designMode off một lần nữa.

CẬP NHẬT

cố định để làm việc trong IE 9.

CẬP NHẬT 12 Tháng chín 2013

Dưới đây là một liên kết quy định chi tiết một phương pháp để loại bỏ điểm nổi bật tạo ra bằng phương pháp này:

https://stackoverflow.com/a/8106283/96100

function makeEditableAndHighlight(colour) { 
    var range, sel = window.getSelection(); 
    if (sel.rangeCount && sel.getRangeAt) { 
     range = sel.getRangeAt(0); 
    } 
    document.designMode = "on"; 
    if (range) { 
     sel.removeAllRanges(); 
     sel.addRange(range); 
    } 
    // Use HiliteColor since some browsers apply BackColor to the whole block 
    if (!document.execCommand("HiliteColor", false, colour)) { 
     document.execCommand("BackColor", false, colour); 
    } 
    document.designMode = "off"; 
} 

function highlight(colour) { 
    var range; 
    if (window.getSelection) { 
     // IE9 and non-IE 
     try { 
      if (!document.execCommand("BackColor", false, colour)) { 
       makeEditableAndHighlight(colour); 
      } 
     } catch (ex) { 
      makeEditableAndHighlight(colour) 
     } 
    } else if (document.selection && document.selection.createRange) { 
     // IE <= 8 case 
     range = document.selection.createRange(); 
     range.execCommand("BackColor", false, colour); 
    } 
} 
+0

@crizCraig: Việc lựa chọn có thể đã bị phá hủy vào lúc sự kiện 'click' kích hoạt. Thay vào đó, bạn có thể sử dụng sự kiện 'mousedown'. –

+0

Thao tác này sẽ không hoạt động trong IE nếu bạn đang cố kích hoạt tính năng này bằng cách nhấp vào nút đánh dấu. Bạn chỉ cần lưu các lựa chọn trên mouseup bằng cách sử dụng câu trả lời cho câu hỏi này. http://stackoverflow.com/questions/5767037/editing-iframe-content-in-ie-problem-in-maintaining-text-selection/5770175#5770175 – crizCraig

+0

@crizCraig: Hoạt động tốt cho tôi trong IE trong trường hợp đơn giản sau đây : http://jsfiddle.net/LPnN2/ –

1

Bạn có thể giải thích nhu cầu của chức năng này không. Nếu bạn chỉ muốn thay đổi phong cách nổi bật của văn bản đã chọn bạn có thể sử dụng CSS: ':: lựa chọn'

More Info: http://www.quirksmode.org/css/selection.html https://developer.mozilla.org/en/CSS/::selection

+0

Tôi muốn đánh dấu một số văn bản vĩnh viễn (ở đây vĩnh viễn có nghĩa là cho đến khi tôi đóng ứng dụng, hoàn toàn trái ngược với những gì bạn đang gợi ý, khi bạn nhấp vào một nơi khác, 'đánh dấu' biến mất) và động (nghĩa là tôi không muốn mở tệp html bằng cách sử dụng trình soạn thảo văn bản và chèn phần tử nào đó) – ganapati

0

Bạn có thể thử thêm một lớp cho khoảng xung quanh và áp dụng CSS phân cấp?

var span = document.createElement("span"); 
span.className="selection"; 
rangeObject.surroundContents(span); 

Trong định nghĩa CSS,

span.selection, span.selection * { 
    background-color : yellow; 
} 

Tôi không thử nó. Nhưng chỉ đoán rằng nó sẽ hoạt động.

+0

bạn nghĩ điều đó tốt hơn so với span.style. backgroundColor = "yellow" ? – ganapati

+0

Không khác gì so với span.style.background. Nhưng CSS phân cấp mà tôi cung cấp "span.selection *" sẽ giải quyết vấn đề của bạn. – Mandai

4

Rangy là thư viện lựa chọn và phạm vi trình duyệt chéo giải quyết vấn đề này một cách hoàn hảo với CSS Class Applier module.Tôi đang sử dụng nó để thực hiện làm nổi bật trên một loạt các trình duyệt máy tính để bàn và trên iPad và nó hoạt động hoàn hảo.

Câu trả lời của Tim Down thật tuyệt vời nhưng Rangy không cho phép bạn tự viết và duy trì tất cả mã phát hiện tính năng đó.

+8

Tôi vừa nhận thấy rằng [Tim Down is tác giả của Rangy] (http://code.google.com/u/107383371366938520460/). :) –

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