在chrome扩展中创建HTML对话框弹出窗口

时间:2015-08-20 08:33:50

标签: javascript html google-chrome google-chrome-extension popup

我正在使用Chrome扩展程序,当用户点击键盘快捷键时,该扩展程序会在屏幕中央弹出一个对话框。然后,它将使用JavaScript异步加载MediaWiki API中的内容。但是我很难弄清楚如何使用JavaScript创建和显示对话框。我不想使用Chrome html-popup浏览器操作,因为它显示在屏幕的一角。

我知道如何使用JavaScript来显示现有的HTML对话框,如this answer explains,但我不知道如何将一个插入到DOM中。我不想使用JavaScript的alert函数,因为这会打开一个单独的窗口。当事件触发chrome扩展中的JavaScript函数时,有没有办法创建和显示HTML模式对话框?

2 个答案:

答案 0 :(得分:7)

您应该能够使用javascript作为您链接的答案,随时通过内容脚本注入您的javascript来打开该对话框。 Google在此处提供了相关文档:https://developer.chrome.com/extensions/content_scripts

基本上,内容脚本会在您告诉它的任何页面上运行。所以你可以告诉它在所有网页上运行(通过清单配置)。此内容脚本将添加您的侦听器,然后将对话框附加到body tage(或者在任何地方,正文通常是安全的)。

代码看起来像:

$(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()
    }
});

您可能需要添加安全代码来检查您的身体标签;它在普通页面上,但专业页面可能会出错(例如chrome:// *)。

只要在您的内容脚本上运行,并且您的内容脚本在您想要的页面上运行,您就可以以这种方式运行您想要的任何侦听器/ dom转换器。

答案 1 :(得分:1)

您无需为公共API添加权限。如果站点不允许跨源请求,则只需添加权限。

此外,通过内容脚本使用Web侦听器为您的键盘快捷方式添加侦听器不是一个好的解决方案,因为它需要权限警告,并且通常效率不高。相反,您应该使用Chrome的commands api和activetab。您的扩展程序仅在用户点击键盘快捷键时启动,用户可以通过chrome:// extensions底部的快捷方式链接自定义快捷方式。

为此,请将"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()