2

我正在尝试构建一个 safari 扩展(主要用于学习目的),当用户右键单击链接时,它会创建一个美味的书签。我看过 WWDC 创建 Safari 扩展视频,一切正常。

除了我不知道如何找出用户是否单击了链接(或只是一些文本),如果是,则获取它的 url 和标题。到目前为止我得到的是:

document.addEventListener("contextmenu", handleContextMenu, false);
function handleContextMenu(event){
    safari.self.tab.setContextMenuEventUserInfo(event,getSelection().toString());
}

但这显然只给了我一串选择。现在,根据 Safari 参考库getSelection()返回一个DOMSelection对象。但即使在那里,我也无法找到一种方法可以让我处理所选链接。

您可能会注意到,我对整个 javascript 和 DOM 的东西还很陌生,所以如果这是一个明显的问题,请原谅:)

乔,斯文

4

2 回答 2

3

在简单的右键单击中,选择将设置锚链接内。这意味着您将选择其文本节点,但不会选择链接节点本身。因此,尝试在选择中查找链接是没有用的。

您可以使用DOMSelection'sfocusNode获取最后选择的文本节点并检查其祖先,直到找到一个<a>元素。那应该做你想要的。

var link = null;
var currentElement = event.getSelection().focusNode;
while (currentElement != null)
{
    if (currentElement.nodeType == Node.ELEMENT_NODE && currentElement.nodeName.toLowerCase() == 'a')
    {
        link = currentElement;
        break;
    }
    currentElement = currentElement.parentNode;
}
// link is now an <a> element if the user selected a link's contents
于 2010-06-20T15:47:01.457 回答
0

zneak 的回答对我不起作用,所以我使用event.target而不是选择:

var link = evt.target;
// get parent node in case of text nodes (old safari versions)
if(link.nodeType == Node.TEXT_NODE) {
    link = link.parentNode;
}
    // if for some reason, it's not an element node, abort
if(link.nodeType != Node.ELEMENT_NODE) {
    return;
}

// try to get a link element in the parent chain 
while(link != null && 
        currentElement.nodeType == Node.ELEMENT_NODE && 
        link.nodeName.toLowerCase() != "a") {
    link = link.parentNode;
}
if(link) {
   // do stuff
}
于 2013-05-30T21:39:27.927 回答