javascript获取网页中选定文本的段落

IT技术 javascript window document webpage paragraph
2021-03-07 14:11:21

突出显示文本后,我想获取所选文本所在的段落。

var select = window._content.document.getSelection();

请问有什么指点吗?

6个回答

这实际上很难做到,因为您必须考虑六种情况:

  1. 选择不在一个段落内(简单);
  2. 整个选择在一个段落内(简单);
  3. 整个选择跨越一个或多个同级段落(更难);
  4. 选择以不在段落内的元素开始或结束(更难);
  5. 跨越的段落处于不同的级别,例如一个在列表项内,而另外两个是列表的兄弟(甚至更难);
  6. 以上的一些组合。

所以首先你必须决定你想要解决方案的完整程度。我将只介绍 (1) 和 (2) 中最简单的情况。

function getSelectedParagraphText() {
  if (window.getSelection) {
      selection = window.getSelection();
  } else if (document.selection) {
      selection = document.selection.createRange();
  }
  var parent = selection.anchorNode;
  while (parent != null && parent.localName != "P") {
    parent = parent.parentNode;
  }
  if (parent == null) {
    return "";
  } else {
    return parent.innerText || parent.textContent;
  }
}

注意:如果您也需要标签,请将 textContent 替换为 innerHTML。

编辑:放入更好的版本,包括更好的浏览器兼容性。

anchor.parentNode 在您的示例中不起作用,您需要执行 anchor.anchorNode.parentNode。(这是在 Firefox 中,我没有在 IE 或其他人中测试)。
2021-04-26 14:11:21
修复了小问题并改进了浏览器兼容性。
2021-05-03 14:11:21
我不知道如何感谢你。我还有一个小错误……我很不好意思再问你一个问题。不幸的是它返回一个空值,我不明白为什么:/
2021-05-07 14:11:21
请注意 document.selection.createRange() 没有属性 .anchorNode,因此这在 IE8 或更低版本中不起作用。我很想看到此类浏览器的工作示例,因此我可以再次投票。
2021-05-08 14:11:21

我发现了这个有用的例子

似乎有些浏览器支持 window.getSelection() 而其他浏览器支持 document.getSelection()。该示例处理所有这些情况。

谢谢,但即使他们只选择了几个词,我如何获得整个段落?
2021-04-18 14:11:21

select.anchorNode.parentNode 将返回父节点,在你的情况下

标签,然后您可以获取该节点的文本。

var x = window.getSelection() 
var z = x.anchorNode.parentNode
alert(z.innerHTML)

确保您也查看 window.getSelection() ,因为 document.getSelection 在 firefox 中已折旧。

$.event.props.push('onTextSelect');
$(document).click(function(){
    var str=window.getSelection().anchorNode.data;
    var str=str.substring(window.getSelection().anchorOffset,window.getSelection().focusOffset);
    if(str)
        $(window.getSelection().focusNode.parentNode).trigger({type:'onTextSelect',text:str});
});

$('p').on('onTextSelect',function(e){
    console.log($(this).attr('class'))
    $('p:last').text(e.text);
});

html

<div><p class="p">some text</p></div>
<p></p>

你可以在这里找到小提琴https://jsfiddle.net/q9nkc0fd/6/

jsmatita 诞生了一个新项目:http ://takenotes.sourceforge.net/ (它是意大利语)