【问题标题】:Bookmarklet which captures selected content including html tags捕获选定内容的书签,包括 html 标签
【发布时间】:2011-08-23 20:34:56
【问题描述】:

我正在构建一个 JS 小书签,它允许我捕获用户在浏览器中选择的文本并将其发送到 Web 应用程序。我目前查看了一些教程,并有一个如下所示的脚本:

javascript:var t;try {t=((window.getSelection&&window.getSelection())||(document.getSelection&&document.getSelection())||(document.selection&&document.selection.createRange&&document.selection.createRange().text));}catch(e){t="";}alert(t);

为了更容易理解,这里的代码更易读:

javascript:
      var t;
      try {
        t=((window.getSelection&&window.getSelection()) || (document.getSelection&&document.getSelection()) || (document.selection&&document.selection.createRange&&document.selection.createRange().text));
      }catch(e)
      {
        t="";
      }
      alert(t);

我当前的代码抓取了选定的文本并发出警报,以便我可以看到捕获的内容。然而,文本的格式对我来说很重要,所以我真正想做的就是抓住这段文本中的任何 HTML。事实上,我认为最好还是弄清楚用户在页面中选择的位置,并从所选内容的开头和结尾查找以找到最近的 HTML 标记,然后抓取其中的内容。 (因为用户无法判断他们是否选择了 HTML)

我更习惯于使用 JQuery 来进行 DOM 选择,所以目前这有点过头了。 (除非您可以将 JQuery 与书签一起使用……可以吗?)

谁能帮我解决这个问题? (即使只是为我指出正确的方向也很好,我将其作为一个爱好学习项目来做,所以我很高兴自己想出一些东西。)

【问题讨论】:

  • 如果你真的想在其中使用 jQuery,请查看:smashingmagazine.com/2010/05/23/…
  • 嗯,JQuery 是我所熟悉的。但是我想知道用它来膨胀从技术上讲是一小部分 JS ......(如果,这是一个很大的如果,我想要做的实际上是跨浏览器非常简单)。非常感谢,我一定会试试看!

标签: javascript bookmarklet


【解决方案1】:

以下函数将返回一个包含用户选择的 HTML 的字符串:

function getSelectionHtml() {
    var html = "";
    if (typeof window.getSelection != "undefined") {
        var sel = window.getSelection();
        if (sel.rangeCount) {
            var container = document.createElement("div");
            for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                container.appendChild(sel.getRangeAt(i).cloneContents());
            }
            html = container.innerHTML;
        }
    } else if (typeof document.selection != "undefined") {
        if (document.selection.type == "Text") {
            html = document.selection.createRange().htmlText;
        }
    }
    return html;
}

这是一个小书签的精简版:

javascript:(function(){var h="",s,g,c,i;if(window.getSelection){s=window.getSelection();if(s.rangeCount){c=document.createElement("div");for(i=0;i<s.rangeCount;++i){c.appendChild(s.getRangeAt(i).cloneContents());}h=c.innerHTML}}else if((s=document.selection)&&s.type=="Text"){h=s.createRange().htmlText;}alert(h);})()

【讨论】:

  • 谢谢!这几乎就是我想要做的:)
【解决方案2】:

将getSelection().getRangeAt(0).cloneContents()的结果追加到一个div,然后得到该div的innerHTML。

javascript:(function()%7Bvar%20node%3Ddocument.createElement('div')%3Bnode.appendChild(getSelection().getRangeAt(0).cloneContents())%3Balert(node.innerHTML)%3B%7D)()%3B

如果您在 GET 请求中传递标记,则需要先对其使用 encodeURIComponent()。

另请注意,GET 请求可能只接受这么多数据。

【讨论】:

  • 感谢有关 GET 编码的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2013-10-12
  • 1970-01-01
  • 2012-09-24
  • 2013-05-01
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多