我正在开发一个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);
}
}
答案 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