如何编写safari扩展,在打开上下文菜单时获取被点击的URL?

Kai*_*zay 2 javascript safari safari-extension

我正在尝试编写一个safari扩展,让我在打开上下文菜单时获取元素的url(类似于在链接上打开上下文菜单时的方式,并选择"new link"窗口"或什么的.

一旦我在var中有了url,我就会用它来做其他事情.我怎么做?

我的全局html文件中有以下脚本.

    <script>
    safari.application.addEventListener("command",handleContextMenu,false);

    function handleContextMenu(event)
    {
        if(event.command === "my command")
        {
            var link = event.target;

            // try to get a link element in the parent chain 
            while(link != null && link.nodeType == Node.ELEMENT_NODE 
            && link.nodeName.toLowerCase() != "a") 
            {
                link = link.parentNode;
            }

            if(link) 
            {
                // do stuff
                                    //I open the window only to check that I am correctly getting the link
                var nwin = safari.application.openBrowserWindow();
                nwin.activeTab.url = link;
            }
        }
    }
    </script>
Run Code Online (Sandbox Code Playgroud)

它打开了一个[object%20SafariExtensionContextMenuItem]位于地址栏中的窗口,而不是打开一个页面.

如何修复我的代码,以便将正确的URL放在地址栏中?

Mat*_*ain 5

event.target是一个SafariExtensionContextMenuItem,而不是您期望的页面元素.要访问页面内容,您需要使用注入的脚本:

global.js

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

function handleCommand(event) {
    if(event.command === 'geturl') {
        var link = event.userInfo;
        if (link) {
            safari.application.openBrowserWindow().activeTab.url = link;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
    safari.self.tab.setContextMenuEventUserInfo(event, target.href);
}
Run Code Online (Sandbox Code Playgroud)