设置notification.notify FireFox Addon SDK的超时

时间:2016-06-07 12:39:22

标签: firefox-addon

请帮我处理我的Firefox插件中的通知。

var notifications = require("sdk/notifications");
function showNotifcation(title, text) {
    notifications.notify({
        iconURL: data.url("img/icon.png"),
        title: title,
        text: text
    });
    setTimeout(notifications.close(), 1000);
}

不行。

1 个答案:

答案 0 :(得分:0)

如果没有您的更多信息,则无法确定您的问题是什么。

但是,简要查看sdk/notifications documentation和源代码,表明您正在尝试使用不存在的方法:notifications.close()sdk/notifications中没有这样的方法。

尝试使用此方法的一个可能原因是,您将Web Notification APImore detail与附加SDK sdk/notifications混为一谈。

附加SDK sdk/notifications无法以编程方式关闭代码中的通知。因此,您无法使用此接口为通知设置超时。但是,在某些操作系统/窗口系统中,这些通知已经存在默认超时。

您需要自己展示面板,或使用User Notifications and Alerts中描述的镶边界面。

此外,您只需致电setTimeout()即可。在大多数情况下,这将不会被定义。您通常需要使用sdk/timers

var { setTimeout } = require("sdk/timers");

在某些情况下,当window被恰当地定义(您可能需要自己设置)时,您可以使用window.setTimeout()

修改我对Prevent XUL notificationBox from closing when button is hit的答案中的代码(如果你想要按钮,答案会告诉你如何去做),以及我的其他答案:我认为你想要的东西会是(超时的代码在底部):

function showNotificationBox(text) {
    //Create some common variables if they do not exist.
    if (window === null || typeof window !== "object") {
        //  Add/remove a "/" to comment/un-comment the code appropriate for your add-on:
        //* Add-on SDK:
        var window = require('sdk/window/utils').getMostRecentBrowserWindow();
        //*/
        /* Overlay and bootstrap (from almost any context/scope):
        var window=Components.classes["@mozilla.org/appshell/window-mediator;1"]
                             .getService(Components.interfaces.nsIWindowMediator)
                             .getMostRecentWindow("navigator:browser");        
        //*/
    }
    if (typeof gBrowser === "undefined") {
        var gBrowser = window.gBrowser;
    }
    let notifyBox = gBrowser.getNotificationBox();
    //appendNotification( label , value , image (URL) , priority , buttons, eventCallback )
    let theNotification = notifyBox.appendNotification(text, "Test notification unique ID",
                                           "chrome://browser/content/aboutRobots-icon.png",
                                           notifyBox.PRIORITY_INFO_HIGH, [], null);
    //* Add-on SDK:
    var { setTimeout } = require("sdk/timers");
    setTimeout(theNotification.close(), 10000);
    //*/
    /* Overlay and bootstrap:
    let timerCallback = {
        notify:function notify() {theNotification.close(); }
    }
    let closeNotificationTimer = Components.classes["@mozilla.org/timer;1"]
                                           .createInstance(Components.interfaces.nsITimer);
    closeNotificationTimer.initWithCallback(timerCallback,10000,
                                            Components.interfaces.nsITimer.TYPE_ONE_SHOT);
    //*/
}

注意:我将超时从您问题代码中的1秒更改为10秒。一秒钟是不合理的时间,期望显示您真正希望用户看到和理解的任何内容。

以上实现了notificationBox中的用户通知。因此它显示在Firefox窗口中:
A notificationBox

也可以使用sdk/notifications使用的nsIAlertsService。这通常会在屏幕右下角显示一个警告框,可能位于Firefox窗口之外(例如,参见nsIAlertsService上的图像)。通知可能会显示在其他地方,具体取决于您设置窗口系统的方式(这取决于操作系统)。但是,the documentation没有清除通知或设置超时的方法。但是,the interface definition确实表明确实存在closeAlert()方法。 sdk/notifications的源代码不会将此公开给Add-on SDK。因此,您需要使用chrome接口。我已更新文档以显示closeAlert()

例如(从nsIAlertsService获取和修改的一些代码):

//* Add-on SDK:
var {Cc, Ci} = require("chrome");
//*/
/* Overlay and bootstrap:
const Cc = Components.classes;
const Ci = Components.interfaces;
//*/
function showNotifcation(title, text) {
    var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
    try {
        //The second use of title is the alert name.
        alertsService.showAlertNotification(icon, title, text, false, "", null, title);
    } catch (e) {
        // This can fail on Mac OS X
    }
    //* Add-on SDK:
    var { setTimeout } = require("sdk/timers");
    setTimeout(alertsService.closeAlert(title), 10000);
    //*/
    /* Overlay and bootstrap:
    let alertTimerCallback = {
        notify:function notify() {alertsService.closeAlert(title); }
    }
    let closeAlertTimer = Cc["@mozilla.org/timer;1"].createInstance(Components.interfaces
                                                                              .nsITimer);
    closeAlertTimer.initWithCallback(alertTimerCallback,10000,Ci.nsITimer.TYPE_ONE_SHOT);
    //*/
}

我只使用bootstrapped / restartless Firefox插件测试了上面的代码。因此,附加SDK代码可能略有不同。