【问题标题】:Why doesn't this code get the URL from Safari?为什么这段代码没有从 Safari 获取 URL?
【发布时间】:2014-01-17 08:24:19
【问题描述】:

我正在创建一个 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>

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 没有任何区别 - “未找到”仍然是打开的网址。我没有任何开发 safari 扩展的经验,所以我只是在摸索。
    • 您知道,这段代码是一个更大的超级有用项目的重要组成部分。如果你能弄清楚这一点,你就可以帮助我解决一个可以为人们节省无数时间的问题! XD
    【解决方案2】:

    我不明白为什么您的代码不起作用,但无论如何您可能想要更改一些内容。

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

    其次,在全局脚本中,将您的handleContextMenu 函数更改如下:

    function handleContextMenu(event) {
        if (event.userInfo) {
            event.contextMenu.appendContextMenuItem("getUrl", "Get URL");
        }
    }
    

    这样,如果用户没有右键单击链接,上下文菜单项将不会被插入。

    第三,正如马特所说,你不需要lastUrl 全局变量,除非它有其他用途。可以直接参考handleCommand中的event.userInfo。而且你不需要检查它是否为空,因为如果不是,上下文菜单只会被handleContextMenu插入。

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

    希望这会有所帮助。

    【讨论】:

    • 我试过你说的,现在“获取 URL”甚至没有出现在上下文菜单中。我甚至使用仅包含正文中的锚点的简单 html 文件对其进行了测试。
    • 在这种情况下,其中一个脚本一定有错误。这是一个概念验证扩展,显示代码有效:dl.dropboxusercontent.com/u/23990/Canisbos/Nothing.safariextz - 当您在上下文菜单中选择“获取 URL”时,它只会显示链接的 URL。您可以使用终端命令xar -xf Nothing.safariextz提取源代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2016-05-16
    • 2017-02-21
    • 2021-06-20
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多