Javascript 为什么';这段代码不是从Safari获取URL吗?

Javascript 为什么';这段代码不是从Safari获取URL吗?,javascript,browser,safari,safari-extension,browser-extension,Javascript,Browser,Safari,Safari Extension,Browser Extension,我正在创建一个safari扩展。当用户在safari中的链接上单击鼠标右键时,应该会显示上下文菜单。当用户单击“获取URL”时,应在新窗口中打开单击的URL。我不知道如何获取url!它总是打开“未找到” injected.js: document.addEventListener('contextmenu', handleContextMenu, false); function handleContextMenu(event) { var target = event.target

我正在创建一个safari扩展。当用户在safari中的链接上单击鼠标右键时,应该会显示上下文菜单。当用户单击“获取URL”时,应在新窗口中打开单击的URL。我不知道如何获取url!它总是打开“未找到”

injected.js

document.addEventListener('contextmenu', handleContextMenu, false);

function handleContextMenu(event) 
{
    var target = event.target;
    while(target != null && target.nodeType == Node.ELEMENT_NODE && target.nodeName.toLowerCase() != "a") 
    {
        target = target.parentNode;
    }

    if(target.href)
    {
        safari.self.tab.setContextMenuEventUserInfo(event, target.href);
    }
    else
    {
        var foo = "href not found";
        safari.self.tab.setContextMenuEventUserInfo(event, foo);
    }  
}
Global.html

<!DOCTYPE HTML>
<script>
var lastUrl;

safari.application.addEventListener("contextmenu",handleContextMenu,false);
safari.application.addEventListener('command', handleCommand, false);

function handleContextMenu(event) 
{
    var query = event.userInfo;
    lastUrl = query;

    event.contextMenu.appendContextMenuItem("getUrl", "Get URL");
}

function handleCommand(event) 
{
    if(event.command === 'getUrl') 
    {
        if (lastUrl) 
        {
            safari.application.openBrowserWindow().activeTab.url = lastUrl;
        }
        else
        {
            safari.application.openBrowserWindow().activeTab.url = "not found";
        }
    }
}

</script>

var-lastUrl;
safari.application.addEventListener(“contextmenu”,handleContextMenu,false);
safari.application.addEventListener('command',handleCommand,false);
函数handleContextMenu(事件)
{
var query=event.userInfo;
lastUrl=查询;
appendContextMenuItem(“获取URL”、“获取URL”);
}
函数handleCommand(事件)
{
如果(event.command=='getUrl')
{
if(lastUrl)
{
safari.application.openBrowserWindow().activeTab.url=lastUrl;
}
其他的
{
safari.application.openBrowserWindow().activeTab.url=“未找到”;
}
}
}

如何获取url?它总是打开“未找到”。

为什么不在
handleCommand
函数中设置
var last url=event.userInfo
?此时应该定义userInfo,并且尝试在contextmenu事件上设置值应该更容易预测。

我不明白为什么代码不起作用,但是您可能希望更改一些内容

首先,在注入的内容脚本中,如果没有target.href,不要麻烦调用safari.self.tab.setContextMenuEventUserInfo

其次,在全局脚本中,更改
handleContextMenu
函数,如下所示:

function handleContextMenu(event) {
    if (event.userInfo) {
        event.contextMenu.appendContextMenuItem("getUrl", "Get URL");
    }
}
这样,如果用户没有右键单击链接,则不会插入上下文菜单项

第三,正如Matt所说,您不需要
lastUrl
全局变量,除非它有其他用途。您可以直接在
handleCommand
中引用event.userInfo。您不需要检查它是否为空,因为上下文菜单只有在不是空的情况下才会由
handleContextMenu
插入

function handleCommand(event) {
    if (event.command === 'getUrl') {
        safari.application.openBrowserWindow().activeTab.url = event.userInfo;
    }
}

希望这有帮助。

没有任何区别-“未找到”仍然是打开的url。我没有任何开发safari扩展的经验,所以我只是在摸索。正如你所知,这段代码是一个更大的超级有用项目的重要组成部分。如果你能弄明白这一点,你可以帮我解决一个可以为人们节省无数时间的问题!XDI尝试了您所说的,现在“获取URL”甚至没有显示在上下文菜单中。我甚至用只在主体中包含一个锚的简单html文件来测试它。在这种情况下,其中一个脚本中肯定有错误。下面是一个概念验证扩展,它显示了代码的工作原理:--当您在上下文菜单中选择“获取URL”时,它只显示链接的URL。您可以使用Terminal命令
xar-xf Nothing.safariextz
提取源代码。