0

まだ解決できない問題があります。メニューとタブのあるポップアップページがあり、設定タブがあります。[設定]タブで、いくつかのアイテムをローカルストレージに保存します。そのうちの1つは、デスクトップ通知の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はボタンであり、タブにはチェックボックスがあります(チェックされている場合は通知が許可され、そうでない場合は無効になります)。2つのhtmlselectタグがあります。1つはデータを選択するためのもの(org =組織)、もう1つは時間を選択するためのものです。"#notif_time_select"html selectタグで、5、10、30分などを選択します。

したがって、[保存]ボタンをクリックするたびに、チェックボックスの状態をlocalstorageに保存し、時間を節約するためにバックグラウンドページから1つの関数を呼び出します。: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アイテムの変更をリッスンする方法はありますか?!

4

2 に答える 2

1

現在、setIntervalアプリケーションが読み込まれるときに1回だけ実行されます。間隔を新しい時間間隔で起動する場合は、を使用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それをクリアするために使用されます。

于 2012-05-09T15:04:53.823 に答える
0

質問のソースコードは完成していませんが、setInterval()を呼び出してから、バックグラウンドページでwindow.timeを変更したと思います。
window.timeはオブジェクトではなく数値であり、setInterval()は呼び出し後のwindow.timeの変更を「見る」ことができません。

これを試して:

function onTimeout() {
    // do your notification.

    setTimeout(onTimeout, time);
}

setTimeout(onTimeout, time);
于 2012-05-09T16:15:30.483 に答える