Javascript 在firefox扩展中获取所选文本的HTML
我正在开发一个firefox扩展。因此,当用户选择一个文本,然后右键单击以显示一些上下文菜单时,我应该能够从该选择中检索包含所有链接的列表。我怎么能做到呢?我看到currentDocument.getSelection()只检索简单文本,而不是整个HTML数据 谢谢你,蒂姆。不过我还有一个问题! 这就是我如何使用你的函数。我把它叫做黑体字 问题是,当我选择一个文本并右击激活你函数的文本时,如果光标在普通文本上,我会得到正确的链接;如果光标位于链接文本(实际链接)上,我会得到未定义的响应。为什么会发生这种情况Javascript 在firefox扩展中获取所选文本的HTML,javascript,firefox-addon,xul,Javascript,Firefox Addon,Xul,我正在开发一个firefox扩展。因此,当用户选择一个文本,然后右键单击以显示一些上下文菜单时,我应该能够从该选择中检索包含所有链接的列表。我怎么能做到呢?我看到currentDocument.getSelection()只检索简单文本,而不是整个HTML数据 谢谢你,蒂姆。不过我还有一个问题! 这就是我如何使用你的函数。我把它叫做黑体字 问题是,当我选择一个文本并右击激活你函数的文本时,如果光标在普通文本上,我会得到正确的链接;如果光标位于链接文本(实际链接)上,我会得到未定义的响应。为什么会
window.addEventListener("contextmenu", function(e) {
getSelectionLink();
}, false);
function getSelectionLink() {
var SelectionText = "";
var trywindow = false;
var start = 0;
var stop = 0;
var focusedElement = document.commandDispatcher.focusedElement;
if(focusedElement && null != focusedElement)
{
try
{
alert(focusedElement.value);
}
catch(e)
{
trywindow = true;
}
}
else
{
trywindow = true;
}
if(trywindow)
{
var focusedWindow = document.commandDispatcher.focusedWindow;
var winWrapper = new XPCNativeWrapper(focusedWindow, 'document');
var Selection = winWrapper.getSelection();
alert(getSelectedElements(winWrapper, "a"));
//parseSelection(Selection);
}
}
您应该使用
currentWindow.getSelection()
,它返回一个Selection
对象(请参阅)。考虑到可能只选择了节点的一个部分,所以不太清楚您期望的是哪种HTML数据。在这种情况下,这里有一种方法会给您带来太多(很像“视图选择源”功能):
这里有一个函数,它将为您提供一个包含所有元素的列表,这些元素都有一个特定的标记名,并且全部或部分地被选中。它适用于除IE<9:
function getSelectedElements(win, tagName) {
var sel = win.getSelection(), selectedElements = [];
var range, elementRange, elements;
if (sel.getRangeAt && sel.rangeCount) {
elementRange = win.document.createRange();
for (var r = 0; r < sel.rangeCount; ++r) {
range = sel.getRangeAt(r);
containerEl = range.commonAncestorContainer;
if (containerEl.nodeType != 1) {
containerEl = containerEl.parentNode;
}
if (containerEl.nodeName.toLowerCase() == tagName) {
selectedElements.push(containerEl);
} else {
elements = containerEl.getElementsByTagName(tagName);
for (var i = 0; i < elements.length; ++i) {
elementRange.selectNodeContents(elements[i]);
if (elementRange.compareBoundaryPoints(range.END_TO_START, range) < 1
&& elementRange.compareBoundaryPoints(range.START_TO_END, range) > -1) {
selectedElements.push(elements[i]);
}
}
}
}
elementRange.detach();
}
return selectedElements;
}
console.log( getSelectedElements(currentWindow, "a") );
函数getSelectedElements(win,标记名){
var sel=win.getSelection(),selectedElements=[];
变量范围,元素范围,元素;
if(sel.getRangeAt&&sel.rangeCount){
elementRange=win.document.createRange();
对于(var r=0;r我的错误:我只需要更换警报(focusedElement.value);带有警报(GetSelectedElement(focusedElement,“a”))@蒂姆:不会的
document.getSelection()
返回一个字符串。这个方法是为了向后兼容而保留的,有一个警告是这样说的。你是对的,我错了。某些浏览器(尤其是最近的WebKit)确实会将document.getSelection()
的选择对象返回为window.getSelection()
,但不会返回Firefox。另外,新的DOM范围规范(目前正在进行中)指定两种方法相同。看见
function getSelectedElements(win, tagName) {
var sel = win.getSelection(), selectedElements = [];
var range, elementRange, elements;
if (sel.getRangeAt && sel.rangeCount) {
elementRange = win.document.createRange();
for (var r = 0; r < sel.rangeCount; ++r) {
range = sel.getRangeAt(r);
containerEl = range.commonAncestorContainer;
if (containerEl.nodeType != 1) {
containerEl = containerEl.parentNode;
}
if (containerEl.nodeName.toLowerCase() == tagName) {
selectedElements.push(containerEl);
} else {
elements = containerEl.getElementsByTagName(tagName);
for (var i = 0; i < elements.length; ++i) {
elementRange.selectNodeContents(elements[i]);
if (elementRange.compareBoundaryPoints(range.END_TO_START, range) < 1
&& elementRange.compareBoundaryPoints(range.START_TO_END, range) > -1) {
selectedElements.push(elements[i]);
}
}
}
}
elementRange.detach();
}
return selectedElements;
}
console.log( getSelectedElements(currentWindow, "a") );