Javascript 为什么';这段代码不是从Safari获取URL吗?
我正在创建一个safari扩展。当用户在safari中的链接上单击鼠标右键时,应该会显示上下文菜单。当用户单击“获取URL”时,应在新窗口中打开单击的URL。我不知道如何获取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
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
提取源代码。