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

Javascript 识别safari扩展中contextmenu事件上的链接,javascript,events,dom,contextmenu,safari-extension,Javascript,Events,Dom,Contextmenu,Safari Extension,我正在尝试构建一个safari扩展(主要用于学习目的),当用户右键单击链接时,它会创建一个美味的书签。我看过WWDC制作的Safari扩展视频,一切正常 除了我不知道如何找出用户是否点击了某个链接(或者仅仅点击了某个文本),如果是的话,获取它的url和标题。到目前为止,我得到的是: document.addEventListener("contextmenu", handleContextMenu, false); function handleContextMenu(event){ s

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

除了我不知道如何找出用户是否点击了某个链接(或者仅仅点击了某个文本),如果是的话,获取它的url和标题。到目前为止,我得到的是:

document.addEventListener("contextmenu", handleContextMenu, false);
function handleContextMenu(event){
    safari.self.tab.setContextMenuEventUserInfo(event,getSelection().toString());
}
但这显然只给了我一串选择。现在,根据Safari参考库
getSelection()
返回一个。但即使在那里,我也无法找到一种方法,它可以为我提供所选链接的句柄

正如您可能注意到的,我对整个javascript和DOM都是新手,所以如果这是一个明显的问题,请原谅:)

再见,
Sven

只需单击鼠标右键,选择内容将设置在锚定链接内部。这意味着您将选择其文本节点,但不会选择链接节点本身。因此,尝试在选择中查找链接是无用的

您可以使用
DOMSelection
focusNode
获取最后一个选定的文本节点,并检查其祖先节点,直到找到
元素。这应该是你想要的

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
var-link=null;
var currentElement=event.getSelection().focusNode;
while(currentElement!=null)
{
if(currentElement.nodeType==Node.ELEMENT\u Node&¤tElement.nodeName.toLowerCase()==a)
{
链接=当前元素;
打破
}
currentElement=currentElement.parentNode;
}
//如果用户选择了链接的内容,则链接现在是一个元素

zneak的答案对我不起作用,因此我使用了
事件。目标
而不是选择:

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
}

一点跟进:由于我无法提取比选择内容更多的上下文信息,我尝试使用jQuery查找与所选文本匹配的任何链接,如:
$(“A:contains(“+getSelection()+”)”)但这是非常模糊的,因为当点击单词“a”时,链接文本很可能包含该单词。