如何从上下文菜单中显示模态对话框?
我可以在上下文菜单中显示一个新窗口,该窗口在其自己的选项卡中打开:
var menuItem = {
"id": "rateMenu",
"title": "Rate Item",
"contexts": ["all"],
}
chrome.contextMenus.create(menuItem);
chrome.contextMenus.onClicked.addListener(function (clickData) {
open('index.html');
});
我也知道如何在页面本身上使用bootstrap(例如)显示模态对话框:
$('#myModal').modal({
backdrop: 'static',
keyboard: false
})
在这种特殊情况下,我想显示一个模态对话框,除非按下“关闭”按钮,否则无法关闭。
但是,我不知道如何直接从上下文菜单中显示模态弹出窗口。
有谁知道如何实现这一目标?
谢谢!
答案 0 :(得分:10)
我也做了同样的事情。只需使用content script
即可显示modal
。
示例:当用户单击上下文菜单项时,向内容脚本发送消息以让它知道它以便它应该打开一个模态。
<强> background.js 强>:
chrome.contextMenus.onClicked.addListener(function (clickData) {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {type: "openModal"});
});
});
<强> contentscript.js 强>:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
switch (request.type){
case "openModal":
$('#myModal').modal({
backdrop: 'static',
keyboard: false
});
break;
});
确保在content_scripts
manifest.json
下包含必要的css和js文件
"content_scripts": [
{
"matches": ["https://*/*"],
"css":["bootstrap.min.css"],
"js":["jquery.min.js","bootstrap.min.js","contentscript.js"],
"run_at":"document_end"
}
]
注意:使用bootstrap.min.css
可能会与页面UI冲突,并且可能会对其进行更改。要避免这种情况,请将模式和所需的js和css文件移动到单独的html文件(modal.html
)中。然后使用内容脚本将iframe
注入选项卡。
var iframe = document.createElement('iframe');
iframe.src = chrome.extension.getURL("modal.html");
iframe.frameBorder = 0;
iframe.id = "myFrame";
$(iframe).hide();//necessary otherwise frame will be visible
$(iframe).appendTo("body");
记住添加modal.html
以及modal.html
内使用的所有css和js文件,例如modal.js
,bootstrap.min.js
,{{1在bootstrap.min.css
:
web_accessible_resources
现在,您可以使用内容脚本隐藏或显示web_accessible_resources": ["modal.html","modal.js","bootstrap.min.js","bootstrap.min.css"]
,但要显示和隐藏模态,只能在iframe
内部完成。因此,您需要将消息从iframe
传递到background
以显示模式。上面提到的contentcript代码也适用于iframe
。
如果您想要隐藏iframe,只需使用iframe
从iframe
向contentscipt
发送消息。
实施例:
<强> modal.js 强>:
window.parent.postMessage()
<强> contentscript.js 强>:
window.parent.postMessage({ type: "hideFrame" }, "*");