Javascript 在firefox扩展中获取所选文本的HTML

Javascript 在firefox扩展中获取所选文本的HTML,javascript,firefox-addon,xul,Javascript,Firefox Addon,Xul,我正在开发一个firefox扩展。因此,当用户选择一个文本,然后右键单击以显示一些上下文菜单时,我应该能够从该选择中检索包含所有链接的列表。我怎么能做到呢?我看到currentDocument.getSelection()只检索简单文本,而不是整个HTML数据 谢谢你,蒂姆。不过我还有一个问题! 这就是我如何使用你的函数。我把它叫做黑体字 问题是,当我选择一个文本并右击激活你函数的文本时,如果光标在普通文本上,我会得到正确的链接;如果光标位于链接文本(实际链接)上,我会得到未定义的响应。为什么会

我正在开发一个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-1){ selectedElements.push(元素[i]); } } } } elementRange.detach(); } 返回所选元素; } log(getSelectedElements(currentWindow,“a”);
我的错误:我只需要更换警报(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") );