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

时间:2011-06-07 13:15:23

标签: javascript firefox-addon xul

我正在开发一个firefox扩展。因此,当用户选择文本然后右键单击以显示某些上下文菜单时,我应该能够从该选择中检索包含其中所有链接的列表。我怎么能这样做?我看到currentDocument.getSelection()只检索简单文本而不是整个HTML数据。

谢谢TIM。我还有一个问题! 这就是我使用你的功能的方式。在我称之为文本的地方是粗体。

问题是,当我选择一个文本并右键激活你的功能的文本时,如果光标超过正常文本我得到的链接是正确的;如果光标在LINK TEXT(实际链接)上,我得到并且未定义响应。为什么会发生这种情况?

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);
}
}

2 个答案:

答案 0 :(得分:3)

这是一个函数,它将为您提供所有元素的列表,这些元素具有完全或部分选择的特定标记名称。它适用于所有主流浏览器,除了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") );

答案 1 :(得分:0)

您应该使用currentWindow.getSelection(),它会返回Selection个对象(请参阅https://developer.mozilla.org/en/DOM/Selection)。鉴于可能只选择了节点的一部分,因此不太清楚您期望的HTML数据类型。这种方法在这种情况下会给你太多(很像“查看选择源”功能):

var selection = currentWindow.getSelection();
var range = selection.getRangeAt(0);
var container = range.commonAncestorContainer;
if (container instanceof Element)
    alert(container.innerHTML);  // Container element
else
    alert(container.nodeValue);  // A single text node