在 chrome 扩展中创建一个 HTML 对话框弹出窗口
Creating an HTML dialog pop-up in chrome extension
我正在开发一个 Chrome 扩展程序,当用户按下键盘快捷键时,它会在屏幕中央弹出一个对话框。然后它将使用 JavaScript 从 MediaWiki API 异步加载内容。但是我很难弄清楚如何使用 JavaScript 创建和显示对话框。我不想使用 Chrome html-popup
浏览器操作,因为它出现在屏幕的一角。
我知道如何使用 JavaScript 来显示现有的 HTML 对话框,如 ,但我不知道如何将其插入 DOM ].我不想使用 JavaScript 的 alert
函数,因为它会打开一个单独的 window。那么有没有一种方法可以在事件触发 chrome 扩展中的 JavaScript 函数时创建并显示 HTML 模态对话框?
您应该能够使用 javascript 作为您链接的答案,以便随时通过内容脚本注入 javascript 打开该对话框。 Google 此处有相关文档:https://developer.chrome.com/extensions/content_scripts
基本上,内容脚本 运行 位于您指定的任何页面上。所以你可以在所有网页上告诉它 运行(通过清单配置)。此内容脚本将添加您的侦听器,然后将您的对话框附加到 body 标签(或任何地方,body 通常是安全的)。
代码看起来像这样:
$(document).on( 'keypress', 'body', function( e ){
var code = e.keyCode || e.which;
if( code = /*whatever, key shortcut listener*/ ) {
document.body.innerHTML += '<dialog>This is a dialog.<br><button>Close</button></dialog>';
var dialog = document.querySelector("dialog")
dialog.querySelector("button").addEventListener("click", function() {
dialog.close()
})
dialog.showModal()
}
});
您可能需要添加安全代码来检查您的 body 标签;它在普通页面上,但专业页面可能会出错(例如 chrome://*)。
只要这个 运行 在您的内容脚本上,并且您的内容脚本 运行 在您想要的页面上,您就可以 运行 任何 listeners/dom 改变你想要这样。
您不需要为 public api 添加权限。如果网站不允许跨源请求,您只需要添加权限。
此外,通过内容脚本使用 Web 侦听器为键盘快捷方式添加侦听器并不是一个好的解决方案,因为它需要权限警告,而且通常效率不高。相反,您应该使用 Chrome 的 commands api with activetab。您的扩展只会在用户点击键盘快捷键时启动,用户可以通过 chrome://extensions.
底部的快捷键 link 自定义快捷键
为此,请将 "permissions": [ "activeTab" ]
添加到您的清单中。然后添加您的组合键:
"commands": { "showcontentdialog": { "suggested_key": { "default": "Ctrl+Shift+Y" }, "description": "show content dialog" } }
接下来,设置您的后台页面侦听器和 inject 当用户按下这些键时您的内容脚本:
chrome.commands.onCommand.addListener(function(command) {
if(command.name == "showcontentdialog") {
chrome.tabs.executeScript({ file: "main.js" })
}
})
此外,您应该使用 appendChild 而不是设置 innerHTML,如下所示:
var dialog = document.createElement("dialog")
dialog.textContent = "This is a dialog"
var button = document.createElement("button")
button.textContent = "Close"
dialog.appendChild(button)
button.addEventListener("click", function() {
dialog.close()
})
document.body.appendChild(dialog)
dialog.showModal()
我正在开发一个 Chrome 扩展程序,当用户按下键盘快捷键时,它会在屏幕中央弹出一个对话框。然后它将使用 JavaScript 从 MediaWiki API 异步加载内容。但是我很难弄清楚如何使用 JavaScript 创建和显示对话框。我不想使用 Chrome html-popup
浏览器操作,因为它出现在屏幕的一角。
我知道如何使用 JavaScript 来显示现有的 HTML 对话框,如 alert
函数,因为它会打开一个单独的 window。那么有没有一种方法可以在事件触发 chrome 扩展中的 JavaScript 函数时创建并显示 HTML 模态对话框?
您应该能够使用 javascript 作为您链接的答案,以便随时通过内容脚本注入 javascript 打开该对话框。 Google 此处有相关文档:https://developer.chrome.com/extensions/content_scripts
基本上,内容脚本 运行 位于您指定的任何页面上。所以你可以在所有网页上告诉它 运行(通过清单配置)。此内容脚本将添加您的侦听器,然后将您的对话框附加到 body 标签(或任何地方,body 通常是安全的)。
代码看起来像这样:
$(document).on( 'keypress', 'body', function( e ){
var code = e.keyCode || e.which;
if( code = /*whatever, key shortcut listener*/ ) {
document.body.innerHTML += '<dialog>This is a dialog.<br><button>Close</button></dialog>';
var dialog = document.querySelector("dialog")
dialog.querySelector("button").addEventListener("click", function() {
dialog.close()
})
dialog.showModal()
}
});
您可能需要添加安全代码来检查您的 body 标签;它在普通页面上,但专业页面可能会出错(例如 chrome://*)。
只要这个 运行 在您的内容脚本上,并且您的内容脚本 运行 在您想要的页面上,您就可以 运行 任何 listeners/dom 改变你想要这样。
您不需要为 public api 添加权限。如果网站不允许跨源请求,您只需要添加权限。
此外,通过内容脚本使用 Web 侦听器为键盘快捷方式添加侦听器并不是一个好的解决方案,因为它需要权限警告,而且通常效率不高。相反,您应该使用 Chrome 的 commands api with activetab。您的扩展只会在用户点击键盘快捷键时启动,用户可以通过 chrome://extensions.
底部的快捷键 link 自定义快捷键为此,请将 "permissions": [ "activeTab" ]
添加到您的清单中。然后添加您的组合键:
"commands": { "showcontentdialog": { "suggested_key": { "default": "Ctrl+Shift+Y" }, "description": "show content dialog" } }
接下来,设置您的后台页面侦听器和 inject 当用户按下这些键时您的内容脚本:
chrome.commands.onCommand.addListener(function(command) {
if(command.name == "showcontentdialog") {
chrome.tabs.executeScript({ file: "main.js" })
}
})
此外,您应该使用 appendChild 而不是设置 innerHTML,如下所示:
var dialog = document.createElement("dialog")
dialog.textContent = "This is a dialog"
var button = document.createElement("button")
button.textContent = "Close"
dialog.appendChild(button)
button.addEventListener("click", function() {
dialog.close()
})
document.body.appendChild(dialog)
dialog.showModal()