我正在尝试编写一个JavaScript函数,它会在点击扩展图标时打开我的扩展程序。我知道如何在新标签中打开我的扩展程序:
var url = "chrome-extension://kelodmiboakdjlbcdfoceeiafckgojel/login.html";
window.open(url);
但我想在浏览器的右上角打开一个弹出窗口,就像点击扩展图标一样。
答案 0 :(得分:26)
Chromium开发团队明确表示他们不会启用此功能。见Feature request: open extension popup bubble programmatically :
可以使用浏览器和页面操作弹出窗口的理念是它们必须由用户操作触发。我们的建议是使用新的HTML通知功能......
Desktop notifications以编程方式向用户显示一个与您的弹出窗口类似的小HTML页面。它不是一个完美的替代品,但它可能提供您需要的功能类型。
答案 1 :(得分:19)
Chrome小组 创建了一种以编程方式打开弹出窗口的方法,但它仅作为私有API启用,而plans to make it generally available have stalled则出于安全考虑。
所以,截至2018年3月的 截至目前,你仍然无法做到。
答案 2 :(得分:7)
简短回答是您无法以编程方式打开browserAction
。但是,您可以使用内容脚本创建dialog
,该脚本会模拟您的browserAction
并显示该内容(以编程方式)。但是,您无法直接从此弹出窗口background page
访问您的扩展程序popup.html
。您必须pass message
代替您的扩展程序。
答案 3 :(得分:0)
如前所述,没有公共API。
我想出的一种解决方法是,通过单击按钮,在content script内以iframe
的形式启动扩展。从而后台脚本发出内容脚本的扩展URL,以将其设置为iframe的src
,如下所示。
background.js
browser.runtime.onMessage.addListener((request) => {
if (request.open) {
return new Promise(resolve => {
chrome.browserAction.getPopup({}, (popup) => {
return resolve(popup)
})
})
}
})
content-scipt.js
const i = document.createElement('iframe')
const b = document.createElement('button')
const p = document.getElementById('some-id')
b.innerHTML = 'Open'
b.addEventListener('click', (evt) => {
evt.preventDefault()
chrome.runtime.sendMessage({ open: true }, (response) => {
i.src = response
p.appendChild(i)
})
})
p.appendChild(b)
这将在脚本运行所在页面的DOM中打开扩展名。您还需要将以下内容添加到清单中。
manifest.json
....
"web_accessible_resources": [
"popup.html"
]
....
答案 4 :(得分:-4)
我有同样的要求:当用户点击扩展图标时,应打开一个小弹出窗口。在我的情况下,我正在编写一个扩展程序,只要点击图标就会对选择性股票进行更新。这就是我弹出窗口的样子。
如果您有相同的要求,请阅读以下答案。
这是manifest.json
文件的显示方式。
所有繁重的工作仅由manifest.json
文件处理。其中有一个browser_action
部分,其中有一个名为default_popup
的密钥,只需输入您希望弹出窗口显示的HTML文件的名称。
我希望我的扩展能够在matches
下添加属性content_scripts
的所有页面上工作。我真的不需要将jquery文件jquery-3.2.1.js
放在js
数组中,但扩展管理器不允许我将该数组保持为空。
希望这有帮助,如果您对答案有任何疑问,请发表评论。