如何在浏览器扩展中打开Obsidian DeepLink且不新建标签/窗口?
点击Obsidian外部链接不新建窗口/标签的解决方案
针对你需要点击锚点打开obsidian://协议链接且不新建窗口/标签的需求,结合你已有的tabs、storage权限,同时避免hosts_permissions,提供以下可行方案:
1. 扩展内部页面中转(跨浏览器支持)
创建一个扩展内置的空白页面作为中转,复用当前标签页完成协议跳转:
- 第一步:在扩展
manifest.json中注册可访问的内部页面:
{ "web_accessible_resources": [ { "resources": ["redirect.html"], "matches": ["<all_urls>"] } ], "permissions": ["tabs"] // 你已拥有该权限 }
- 第二步:创建
redirect.html页面,处理协议跳转:
<!DOCTYPE html> <html> <head> <style>body{display:none;}</style> </head> <body> <script> const targetUrl = new URL(window.location).searchParams.get('target'); if (targetUrl) { // 触发协议链接 window.location.replace(targetUrl); // 延迟关闭页面,确保请求发送成功 setTimeout(() => window.close(), 150); } </script> </body> </html>
- 第三步:给锚点绑定点击事件,用当前标签页打开中转页面:
document.querySelector('a[href^="obsidian://"]').addEventListener('click', (e) => { e.preventDefault(); const obsidianLink = e.target.href; const redirectPage = browser.runtime.getURL('redirect.html') + `?target=${encodeURIComponent(obsidianLink)}`; // 复用当前标签页导航到中转页 browser.tabs.update({ url: redirectPage }); });
这个方案不会新建标签,中转页会自动触发Obsidian打开,随后快速关闭(或隐藏内容),不会留下无用页面。
2. Firefox专属:调整外部协议弹窗尺寸
Firefox提供了API可以修改外部协议确认弹窗的大小,需要在manifest.json中添加browserSettings权限:
{ "permissions": ["browserSettings"] }
然后执行代码调整尺寸:
// 设置弹窗为800x600像素,可根据需求修改 browser.browserSettings.openExternalLinkDialogSize.set({ value: [800, 600] });
Chrome没有类似API,无法调整该弹窗尺寸。
3. 补充:提前注册协议处理程序(减少弹窗频率)
使用navigator.registerProtocolHandler让浏览器记住Obsidian协议的关联,仅需用户手动授权一次,后续点击可能不再弹出确认框:
// 仅首次运行时执行 if (!localStorage.getItem('obsidian-protocol-registered')) { try { navigator.registerProtocolHandler( 'obsidian', browser.runtime.getURL('redirect.html') + '?target=%s', 'Obsidian' ); localStorage.setItem('obsidian-protocol-registered', 'true'); } catch (err) { // 处理浏览器不支持的情况 } }
注意Chrome要求注册的跳转地址必须是HTTPS域名,Firefox支持扩展内部页面。
内容的提问来源于stack exchange,提问作者ALegendsTale
相关产品推荐
相关产品推荐

