我正在创建一个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>
如何获取网址?它始终打开“未找到”。
答案 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;
}
}
希望这有帮助。