识别safari扩展中的contextmenu事件的链接

时间:2010-06-20 12:00:37

标签: javascript events dom contextmenu safari-extension

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

除了我没有线索如何找出用户是否点击了链接(或只是一些文本),如果是,请获取它的网址和标题。到目前为止我得到的是:

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

但这显然只给了我一串选择。现在,根据Safari参考库getSelection()返回DOMSelection object。但即使在那里,我也无法找到能够处理所选链接的方法。

正如您可能会注意到的,我对这整个javascript和DOM内容都很陌生,所以请原谅这是一个显而易见的问题:)

侨,  斯文

2 个答案:

答案 0 :(得分:3)

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

您可以使用DOMSelection的{​​{1}}获取最后选择的文本节点并检查其祖先,直到找到focusNode元素。这应该是关于你想要的。

<a>

答案 1 :(得分: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
}