0

我使用以下 xpath 和偏移量突出显示选定的文本。

这是我用来调试的文本 示例选择。

[{
  commonAncestorContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002]",
  startContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002]",
  startOffset:0,
  endContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002]",
  endOffset:1,
  color: "purple"
}]



上面的这个选择效果很好,并突出显示了选定的段落。现在这是我坚持的部分,一旦我在段落中添加文本,它就无法突出显示文本。

这是选定段落和文本的示例,因此理论上这应该只选择您选择的段落内的文本。更改以粗体标记

[{
commonAncestorContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002] /text()[0] ",
startContainer: "/xhtml:html[0001] /xhtml:body[0001]/xhtml:p[0002] /text()[0] ",
startOffset:288 ,
endContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002 ]/text()[0] ",
endOffset:330 ,
颜色: "紫色"
}]


测试.html

(这使用highlight.show)

function highlightTest() {
        $MON.highlight.show([
            {
                commonAncestorContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0001]",
                startContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0001]",
                startOffset:0,
                endContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0001]",
                endOffset:1,
                color: "yellow"
            },
            {
                commonAncestorContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002]/text()[0]",
                startContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002]/text()[0]",
                startOffset:288,
                endContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002]/text()[0]",
                endOffset:330,
                color: "purple"
            }
        ]);


突出显示.js

(这使用 xpath.element)

show: function(selections) 
{
        for (var i in selections) 
        {
            var selection = selections[i];

            var ancestor = $MON.xpath.element(selection["commonAncestorContainer"]);                            
            ancestor.contentEditable = "true";

            var col = selection["color"] ? selection["color"] : "yellow";
            var range = document.createRange();

            var startElement = $MON.xpath.element(selection["startContainer"]);            
            var startOffset = selection["startOffset"];            

            var endElement = $MON.xpath.element(selection["endContainer"]);            
            var endOffset = selection["endOffset"];            

            range.setStart(startElement, startOffset);
            range.setEnd(endElement, endOffset);

            window.getSelection().removeAllRanges();
            window.getSelection().addRange(range);

            document.execCommand("HiliteColor", false, col);
            window.getSelection().removeAllRanges();
            ancestor.contentEditable = "false";
       }
 }

xpath.js
(返回给定 xpath 的相应元素,返回 highlight.js)

element: function (expr) {
        var resolver = function (prefix) {
            if ("xhtml" == prefix) {
                return "http://www.w3.org/1999/xhtml";
            }
        }

        var result = document.evaluate(expr, document, resolver, 9, null).singleNodeValue;
        return result;
    }


HTML

<body>
    <p>
      1 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tellus ligula, ullamcorper vitae elementum sed, rhoncus a ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras et pulvinar augue. Proin non semper mi. Nullam justo velit, vehicula eu congue vitae, tincidunt sit amet urna. Aliquam blandit rutrum dignissim. Donec dapibus nisl arcu, eu eleifend tellus lobortis quis. Praesent quis hendrerit diam. Quisque ultricies lorem et turpis aliquam ornare. Phasellus dolor purus, lacinia eget porta vel, iaculis ac nisl. Phasellus vestibulum faucibus erat sit amet interdum.
    </p>
    <p>
      2 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tellus ligula, ullamcorper vitae elementum sed, rhoncus a ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras et pulvinar augue. Proin non semper mi. Nullam justo velit, vehicula eu congue vitae, tincidunt sit amet urna. Aliquam blandit rutrum dignissim. Donec dapibus nisl arcu, eu eleifend tellus lobortis quis. Praesent quis hendrerit diam. Quisque ultricies lorem et turpis aliquam ornare. Phasellus dolor purus, lacinia eget porta vel, iaculis ac nisl. Phasellus vestibulum faucibus erat sit amet interdum.
    </p>
    <p>
      3 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tellus ligula, ullamcorper vitae elementum sed, rhoncus a ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras et pulvinar augue. Proin non semper mi. Nullam justo velit, vehicula eu congue vitae, tincidunt sit amet urna. Aliquam blandit rutrum dignissim. Donec dapibus nisl arcu, eu eleifend tellus lobortis quis. Praesent quis hendrerit diam. Quisque ultricies lorem et turpis aliquam ornare. Phasellus dolor purus, lacinia eget porta vel, iaculis ac nisl. Phasellus vestibulum faucibus erat sit amet interdum.
    </p>
    <p>
      4 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tellus ligula, ullamcorper vitae elementum sed, rhoncus a ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras et pulvinar augue. Proin non semper mi. Nullam justo velit, vehicula eu congue vitae, tincidunt sit amet urna. Aliquam blandit rutrum dignissim. Donec dapibus nisl arcu, eu eleifend tellus lobortis quis. Praesent quis hendrerit diam. Quisque ultricies lorem et turpis aliquam ornare. Phasellus dolor purus, lacinia eget porta vel, iaculis ac nisl. Phasellus vestibulum faucibus erat sit amet interdum.
    </p>
    <p>
      5 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tellus ligula, ullamcorper vitae elementum sed, rhoncus a ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras et pulvinar augue. Proin non semper mi. Nullam justo velit, vehicula eu congue vitae, tincidunt sit amet urna. Aliquam blandit rutrum dignissim. Donec dapibus nisl arcu, eu eleifend tellus lobortis quis. Praesent quis hendrerit diam. Quisque ultricies lorem et turpis aliquam ornare. Phasellus dolor purus, lacinia eget porta vel, iaculis ac nisl. Phasellus vestibulum faucibus erat sit amet interdum.
    </p>
    <p>
      6 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tellus ligula, ullamcorper vitae elementum sed, rhoncus a ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras et pulvinar augue. Proin non semper mi. Nullam justo velit, vehicula eu congue vitae, tincidunt sit amet urna. Aliquam blandit rutrum dignissim. Donec dapibus nisl arcu, eu eleifend tellus lobortis quis. Praesent quis hendrerit diam. Quisque ultricies lorem et turpis aliquam ornare. Phasellus dolor purus, lacinia eget porta vel, iaculis ac nisl. Phasellus vestibulum faucibus erat sit amet interdum.
    </p>

</body>


登录文本选择,获取选中的xpath

38:Selected text: Lorem
44:Collapsed: false
45:Ancestor container: /xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002]/text()[0001]
46:Start container: /xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002]/text()[0001]
47:Start offset: 7
48:End container: /xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002]/text()[0001]
49:End offset: 12

更新(我的问题是)

我必须添加

document.designMode = "开";

在我设置 hilite 颜色之前,
这里是 js fiddle
http://jsfiddle.net/E2BbX/11/的链接

4

1 回答 1

0

XPath 索引是基于 1 的。尝试

startContainer: "/xhtml:html[0001]/xhtml:body[0001]/xhtml:p[0002]/text()[1]

等等。

于 2013-10-14T13:53:03.317 回答