如何在弹出窗口中保存background.html的选项?

时间:2012-05-09 12:09:35

标签: javascript jquery google-chrome-extension

我有一个问题,我还无法解决。我有一个带有菜单和选项卡的弹出页面,还有一个设置选项卡。在设置标签上,我保存某个项目到localstorage,其中一个是桌面通知的notification_time。

注意:我没有选项页面!

我的扩展程序有此弹出窗口和后台页面,其功能是通过桌面通知提醒用户。我每隔5,10,30分钟,1,2小时等显示通知。此时间应该可以在弹出页面的选项菜单中选择。问题是,如果保存5分钟,并且当我更新到10分钟时,例如,background.html不会更新自己!我将代码重写了近20次,但无法找到解决方案。下面是一个代码示例和一个打印屏幕,以明确我的问题。

enter image description here

弹出

$("#save_settings").click(function(){
        var bgp = chrome.extension.getBackgroundPage();
        localStorage.setItem("notifynumber",$("#notifynumber").val());

        if($("#notify").attr('checked')){
            localStorage.setItem('chbox','true');
        } else {
            localStorage.setItem('chbox','false');
        }

        if($("#notif_time_select :selected").val()!="default"){
            bgp.setTime(parseInt($("#notif_time_select :selected").val()));
        }

        if($("#org_select :selected").val()!="default"){
            localStorage.setItem('org',$("#org_select :selected").val().replace(/%20/g," "));
        }
    });

注意:save_settings是一个按钮,在选项卡上有一个复选框(如果选中则允许通知,否则禁用)。有两个html选择标签,一个用于选择一些数据(org =组织),另一个用于选择时间。 "#notif_time_select"是html选择标记,我选择5,10,30分钟等...

因此,每当我点击保存按钮,我将复选框状态保存到localstorage,我从后台页面调用一个功能,以节省时间。 :bgp.setTime(parseInt($("#notif_time_select :selected").val()));

背景页:

为节省时间我使用函数setTime:

var time = 300000; // default
function setTime(time){
    this.time=time;
    console.log("time set to: "+this.time);
}

之后,我使用setInterval定期显示通知

setInterval(function(){         
                howmanyOnline("notify",function(data){
                    if(data>localStorage.getItem("notifynumber")){
                        if (!window.webkitNotifications) { // check browser support
                            alert('Sorry , your browser does not support desktop notifications.');
                        }
                        notifyUser(data); // create the notification
                    }
                    if(localStorage.getItem('tweet')=='true'){
                        if(data>localStorage.getItem("notifynumber")){
                            sendTweet(data,localStorage.getItem('org'),localStorage.getItem('ck'),localStorage.getItem('cs'),localStorage.getItem('at'),localStorage.getItem('ats'));
                        }
                    }
                });
    },time);

setInterval中的代码工作正常,唯一的问题是,

},time);

没有很好地更新。如果我更改设置以每10分钟显示一次通知,则会保持5分钟。唯一的方法是重新启动整个扩展。如何在不重新启动整个扩展的情况下更新setInterval的频率?谢谢吉姆


如果我也将notif_time保存到localStorage,在后台,我设置了一个监听器,以监听localStorage更改。有没有办法监听特定的localStorage项目更改?!

2 个答案:

答案 0 :(得分:1)

现在,setInterval仅在您的应用程序加载时运行一次。如果您希望以新的时间间隔触发间隔,则应使用clearInterval,然后重拨setInterval

// set a new time, wipe out the old interval, and set a new interval
function setTime(t) {
    window.time = t;
    clearInterval(notifInterval);
    notifInterval = setInterval(makeNotification, time);
}

// set first interval
notifInterval = setInterval(makeNotification, time);

function makeNotification() {
    // do what you need to make a notification
}

此处,notifInterval是对setInterval返回的区间的引用,用于清除它。

答案 1 :(得分:0)

你问题中的源代码没有完成,但我想你调用了setInterval()然后在后台页面修改了window.time。
window.time不是一个对象而是一个数字值,并且setInterval()在调用后无法“看到”window.time的变化。

试试这个:

function onTimeout() {
    // do your notification.

    setTimeout(onTimeout, time);
}

setTimeout(onTimeout, time);