通过 Javascript 在浏览器中获取选定的 HTML

IT技术 javascript
2021-02-12 08:13:13

我要求我的 Web 应用程序允许用户“仅打印所选内容”。换句话说,用户选择文本和可能的图像,然后单击此选项。我已经看到使用 Javascript 获取选定文本的示例,但还没有找到获取选定 html 本身的解决方案。

例如,如果我有这样的文档:

<html>
<head>
</head>
<body>
    <p>A bunch of text</p>
    <img src="someimage.jpg" />
    <p>Even more text</p>
</body>
</html>

如果用户突出显示图像和第二段,我希望 javascript 返回:

<img src="someimage.jpg" />
<p>Even more text</p>

这是可能的,人们将如何去做?

编辑:我最终为此使用了一个名为Rangy的 js 库

3个回答

这是我在某处找到的一些代码,但我丢失了实际链接,这似乎有效。

http://jsfiddle.net/Y4BBq/

<html lang="en">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>The serialized HTML of a selection in Mozilla and IE</title>
    <script type="text/javascript">
    function getHTMLOfSelection () {
      var range;
      if (document.selection && document.selection.createRange) {
        range = document.selection.createRange();
        return range.htmlText;
      }
      else if (window.getSelection) {
        var selection = window.getSelection();
        if (selection.rangeCount > 0) {
          range = selection.getRangeAt(0);
          var clonedSelection = range.cloneContents();
          var div = document.createElement('div');
          div.appendChild(clonedSelection);
          return div.innerHTML;
        }
        else {
          return '';
        }
      }
      else {
        return '';
      }
    }
    </script>
    </head>
    <body>
    <div>
        <p>Some text to <span class="test">test</span> the selection on.
            Kibology for <b>all</b><br />. All <i>for</i> Kibology.
    </p>
    </div>
    <form action="">
    <p>
    <input type="button" value="show HTML of selection"
           onclick="this.form.output.value = getHTMLOfSelection();">
    </p>
    <p>
    <textarea name="output" rows="5" cols="80"></textarea>
    </p>
    </form>
    </body>
    </html>

在此处输入图片说明

代码存在一些问题(我用 safari 测试过),它没有返回确切的选择。

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

@TimDown:“WebKit 的缺点”。似乎即使是 Shorty 也无法处理这种跨浏览器的方式。在 Chrome中的rangy.googlecode.com/svn/trunk/demos/core.html进行了测试当我选择 <b>Association Football</b> 时,当我按下 Get HTML 时,只会得到内部文本。但是如果我也选择下一个空间,那么在 Chrome 中会选择完整的 b 块。您知道如何以编程方式完成此操作:将选择扩展一个字符 -> 获取 HTML -> 返回合同选择?
2021-03-25 08:13:13
这些问题是由于 WebKit 的缺陷而不是代码本身造成的。
2021-03-26 08:13:13
我最终使用了一个名为 Rangy 的插件来做到这一点,但这段代码也起到了作用。因此,如果其他寻找此答案的人不想使用 Rangy,我会为您提供答案的功劳。
2021-03-27 08:13:13
你有这个“缺点”的链接吗?我也遇到了这个错误并试图解决它?
2021-04-02 08:13:13
这里的问题不是 WebKit;就是没有办法知道祖先标签很重要。考虑整个文档都包含在一个<b>标签中的(极端)情况——选择将完全包含在该<b>标签中,因此您必须一直遍历文档以应用正确的格式。选择 API 只回顾最低的共同祖先。一种可能的解决方案是向上遍历树以应用“重要”标签。请参阅修改后的示例:jsfiddle.net/x5uj1zet
2021-04-13 08:13:13

与其他实现具有相同问题的类似代码

http://snipplr.com/view/10912/get-html-of-selection/

http://jsfiddle.net/hwzqP/

getSelectionHTML = function () {
      var userSelection;
      if (window.getSelection) {
        // W3C Ranges
        userSelection = window.getSelection ();
        // Get the range:
        if (userSelection.getRangeAt)
          var range = userSelection.getRangeAt (0);
        else {
          var range = document.createRange ();
          range.setStart (userSelection.anchorNode, userSelection.anchorOffset);
          range.setEnd (userSelection.focusNode, userSelection.focusOffset);
        }
        // And the HTML:
        var clonedSelection = range.cloneContents ();
        var div = document.createElement ('div');
        div.appendChild (clonedSelection);
        return div.innerHTML;
      } else if (document.selection) {
        // Explorer selection, return the HTML
        userSelection = document.selection.createRange ();
        return userSelection.htmlText;
      } else {
        return '';
      }
    };
Failed to execute 'getRangeAt' on 'Selection': 0 is not a valid index.如果未选择任何内容,它会抛出错误,您应该检查rangeCount.
2021-04-07 08:13:13

我还没有读过这个扩展/书签的源代码,但我已经试过了,它似乎有效。您可能会在这里找到答案:

http://blog.webkitchen.cz/view-selection-source-chrome-extension

如果您不介意使用源弹出窗口,这可能是可靠性方面的最佳方法
2021-03-22 08:13:13