2013-03-03 113 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