Javascript 识别safari扩展中contextmenu事件上的链接
我正在尝试构建一个safari扩展(主要用于学习目的),当用户右键单击链接时,它会创建一个美味的书签。我看过WWDC制作的Safari扩展视频,一切正常 除了我不知道如何找出用户是否点击了某个链接(或者仅仅点击了某个文本),如果是的话,获取它的url和标题。到目前为止,我得到的是: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
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”时,链接文本很可能包含该单词。