2013-03-03 110 views
5

如果我有以下HTML:window.getSelection()與HTML標籤的偏移量?

<div class="content"> 
Vivamus <span>luctus</span> urna sed urna ultricies ac tempor dui sagittis. 
</div> 

而且我運行mouseup是看到所選文本的範圍的事件:

$(".content").on("mouseup", function() { 
    var start = window.getSelection().baseOffset; 
    var end = window.getSelection().focusOffset; 
    if (start < end) { 
     var start = window.getSelection().baseOffset; 
     var end = window.getSelection().focusOffset; 
    } else { 
     var start = window.getSelection().focusOffset; 
     var end = window.getSelection().baseOffset; 
    } 
    console.log(window.getSelection()); 
    console.log(start + ", " + end); 
}); 

我從內容選擇單詞Vivamus,它將會記錄1, 8,因爲這是選擇的範圍。

如果,不過,我選擇的話urna,它將記錄15, 20,但不會考慮HTML的<span>元素。

反正有focusOffsetbaseOffset也可以計算HTML標籤,而不僅僅是文本嗎?

+0

也許[這](http://stackoverflow.com/questions/4811822/get-a-ranges開始和結束偏移相對於其父容器/ 4812022#4812022)答案將有幫助 – 2013-03-03 01:37:43

+0

這有相同的問題/不處理我的問題。但是,你的鏈接。 – Charlie 2013-03-03 05:13:58

+0

你想完成什麼? – PetersenDidIt 2013-03-05 02:54:28

回答

5

更新

活生生的例子:http://jsfiddle.net/FLwxj/61/

Using a clearSelection() functiona replace approach,我能夠達到預期的效果。

var txt = $('#Text').html(); 
$('#Text').html(
    txt.replace(/<\/span>(?:\s)*<span class="highlight">/g, '') 
); 
clearSelection(); 

來源:


下面你會發現你的問題的一些可行的解決方案。我按照代碼效率的順序放置它們。

工作方案

  • https://stackoverflow.com/a/8697302/1085891live example

    window.highlight = function() { 
        var selection = window.getSelection().getRangeAt(0); 
        var selectedText = selection.extractContents(); 
        var span = document.createElement("span"); 
        span.style.backgroundColor = "yellow"; 
        span.appendChild(selectedText); 
        span.onclick = function (ev) { 
        this.parentNode.insertBefore(
         document.createTextNode(this.innerHTML), 
         this 
        ); 
        this.parentNode.removeChild(this); 
        } 
        selection.insertNode(span); 
    } 
    
  • https://stackoverflow.com/a/1623974/1085891live example

    $(".content").on("mouseup", function() { 
        makeEditableAndHighlight('yellow'); 
    }); 
    
    function makeEditableAndHighlight(colour) { 
        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, sel; 
        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); 
        } 
    } 
    
  • https://stackoverflow.com/a/12823606/1085891live example

其他有用的解決方案:

+0

我喜歡第一個選項,因爲它更簡單。唯一的是它不提供跨度元素的碰撞。我的意思是,如果它們重疊,它們就不會合並。你認爲這很難實現嗎? – Charlie 2013-03-05 20:56:35

+0

例如,如果在較大的span中有一個'span',我可以將它們合併:http://jsfiddle.net/charlescarver/FLwxj/52/,但我無法弄清楚如何得到它如果開頭或結尾與其重疊選擇內的文本匹配,則合併文本。 – Charlie 2013-03-05 23:42:18

+0

這個怎麼樣:http://jsfiddle.net/FLwxj/53/?使用此解決方案:http://stackoverflow.com/a/12004367/1085891 – JSuar 2013-03-06 01:04:03