我有一个问题,我还无法解决。我有一个带有菜单和选项卡的弹出页面,还有一个设置选项卡。在设置标签上,我保存某个项目到localstorage,其中一个是桌面通知的notification_time。
注意:我没有选项页面!
我的扩展程序有此弹出窗口和后台页面,其功能是通过桌面通知提醒用户。我每隔5,10,30分钟,1,2小时等显示通知。此时间应该可以在弹出页面的选项菜单中选择。问题是,如果保存5分钟,并且当我更新到10分钟时,例如,background.html不会更新自己!我将代码重写了近20次,但无法找到解决方案。下面是一个代码示例和一个打印屏幕,以明确我的问题。
弹出:
$("#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项目更改?!
答案 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);