【问题标题】:Show an alert from a Firefox extension when a browser window opens在浏览器窗口打开时显示来自 Firefox 扩展的警报
【发布时间】:2014-07-10 15:39:05
【问题描述】:

我正在尝试制作一个非常简单的 Firefox 扩展。我需要它在 Firefox 窗口打开时显示一个警告框。当我打开窗口时该消息不会显示,但当我重新加载所有 chrome 时它会显示(通过 Extensions Developer Add-On)。

我的覆盖文件:

<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <script type="application/x-javascript" src="chrome://adTest/content/alert.js" />
</overlay>

我的脚本文件:

alert("HI!");

我的 chrome.manifest 文件:

content adTest content/ contentaccessible=yes
overlay chrome://browser/content/browser.xul chrome://adTest/content/adTestOverlay.xul

我很确定其余的代码是正确的,因为我添加了 XUL 元素用于测试目的,除了警告框之外,一切都正常工作。

【问题讨论】:

  • 你能把“chrome.manifest”的内容放在这里吗?
  • 我添加了 chrome.manifest。

标签: javascript firefox firefox-addon xul


【解决方案1】:

在实际加载和显示浏览器窗口之前,您不能显示alert()s,因为警报对话框必须具有完全初始化且可见的父窗口。 但是,您的覆盖脚本将在加载/初始化期间运行...

浏览器控制台应该显示一条错误消息 NS_ERROR_NOT_AVAILABLE: Cannot call openModalWindow on a hidden window(但事实证明,仅当从 load 事件处理程序中调用 alert 时)。

所以,首先等待load 事件,然后让事件循环有机会实际显示窗口,例如

addEventListener("load", function() {
    setTimeout(function() { alert("something"); }, 0);
});

【讨论】:

  • 这似乎是问题所在。我尝试初始化变量而不是 alert() 并且一切正常。但是,浏览器控制台什么也没显示。非常感谢!
  • 我在我的一个更大的项目中测试了你的解决方案,但也遇到了同样的问题。据我了解,这个问题(和你的解决方案)适用于 XPCOM 接口。
  • XPCOM 组件(和 JS 代码模块,以及 JS 沙盒,包括 bootstrap.js 或 SDK main.js)没有窗口。因此,您不能从此类事情中调用 alert() -> window.alert()(您可以直接通过 nsIPrompter,或使用其他解决方法,但这现在已经离题了)
【解决方案2】:

还可以:

Services.prompt.alert(null, 'title of alert', 'alert msg');

您可以提供window 代替null,这将使该窗口在显示警报时变为模态且不可选择(就像正常警报一样)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多