2011-05-12 78 views
4

我正在构建一个JS书签,它允许我捕获用户在其浏览器中选择的文本并将其发送到Web应用程序。目前我已经签出一对夫妇的教程,并有一个脚本,看起来像这样:Bookmarklet,它捕获选定的内容,包括HTML标记

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加上书签...你能吗?)

任何人都可以帮助我吗? (即使只是指向正确的方向我也会很棒,我将这作为一个业余爱好学习项目,因此我很乐意自己找出一些东西。)

+1

如果你真的想在它使用jQuery看看:http://www.smashingmagazine.com/2010/05/23/make-your-own-bookmarklets-with-jquery/ – mVChr 2011-05-12 06:15:15

+0

那么,JQuery是我所熟悉的。但是我想知道在技术上会是一个非常小的JS的膨胀......(如果这是一个很大的话,我试图做的事实际上是非常简单的跨浏览器)。谢谢堆,但我一定会尝试一下! – 2011-05-12 06:20:00

回答

9

下面的函数将返回一个包含用户的选择的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);})() 
+0

谢谢!这几乎是我想要做的:) – 2011-05-12 09:24:18

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请求可能只接受如此多的数据。

+0

这是正确的一般方法,但不会在IE浏览器<= 8中工作。 – 2011-05-12 08:38:30

+0

感谢编写GET的提示! – 2011-05-12 09:23:11