2010-06-20 97 views
2

我试图构建一个Safari浏览器扩展(主要用于学习目的),当用户右键单击链接时创建一个美味的书签。我看过WWDC创建一个Safari扩展视频,一切工作正常。确定Safari浏览器扩展中的contextmenu事件链接

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

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

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

正如你可能已经注意到,我是相当新的这整个JavaScript和DOM的东西,所以请原谅,如果这是一个明显的问题:)

的Ciao, 斯文

+0

小跟进: 因为我不能提取任何更多的上下文信息比选择我试图使用jQuery找到任何链接匹配所选文本,如下所示: '$(“a:contains('”+ getSelection()+“')”);' 但这是非常模糊,因为当点击单词'a'时,存在非常高的可能性链接文本可能包含该单词。 – sschober 2010-06-20 14:11:06

回答

3

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

您可以使用DOMSelectionfocusNode来获取最后选定的文本节点并检查其祖先,直到您达到一个<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 
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 
}