为什么这段代码不能从Safari获取URL?

时间:2014-01-16 05:59:12

标签: javascript browser safari safari-extension browser-extension

我正在创建一个safari扩展。当用户右键单击safari中的链接时,它应该调出上下文菜单。当用户点击“获取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>

如何获取网址?它始终打开“未找到”。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我不明白为什么你的代码不能正常工作,但是你可能想要改变一些事情。

首先,在注入的内容脚本中,如果没有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;
    }
}

希望这有帮助。