1

我正在制作我的第一个 chrome 扩展程序,但我在结束前被卡住了。

我从 json 中的服务器获得响应,输出 html,将其缓存在 localstorage 中检查是否有缓存,如果没有再次从服务器获取然后显示。

现在。在 background.js 中,我需要每 30 分钟检查一次服务器上的 json 文件中是否有更新......如果有任何显示徽章,一旦单击删除徽章,直到下次。但我不知道该怎么办。因为如果我做了一个setInterval它会命中服务器并总是显示一个徽章,即使没有什么新东西。你能帮我建立js吗?

    <script>
    setInterval(function(){
        chrome.browserAction.setBadgeText({text:chrome.browserAction.setBadgeText({text: "!!!"});});
    }, 1800000);
    </script>

我也尝试过这种方式,但没有任何反应。

function getUnreadItems(callback) {
    $.ajax(..., function(data) {
        process(data);
        callback(data);
    });
}

function updateBadge() {
    getUnreadItems(function(data) {
        chrome.browserAction.setBadgeText({text:data.unreadItems});
    });
}

var pollInterval = 1*60*60; // 60 min
var timerId;

function startRequest() {
    updateBadge();
    timerId = window.setTimeout(startRequest, pollInterval);
}

function stopRequest() {
    window.clearTimeout(timerId);
}

背景.js

onload='startRequest()'
4

1 回答 1

0

看起来您从未在服务器上将未读项目重置为“已读”,因此每次您 ping 服务器时,它都会回复相同的号码,从而再次显示该号码。

所以你可以做几件事:

  • 当您单击按钮并将徽章重置为 0 时,您可以向服务器发送请求以将所有项目标记为已读。哪个请求当然取决于您的服务器及其接受的内容。这样,服务器上的未读计数将始终是最新的,并且您的扩展程序可能非常“愚蠢”:服务器返回的任何内容都是当前未读项目的数量。

  • 如果你不能这样做,你将不得不在本地保存一些信息到你的扩展,并自己计算未读计数。我的意思是,您需要获取有关特定项目的信息,例如唯一 ID,而不仅仅是请求未读计数。然后,每次轮询服务器以获取项目列表时,将 ID 添加到保存在localStorage例如 (或chrome.storage.sync)中的列表中,如果该 ID 未知,则将viewed标记设置为。false然后后台脚本将遍历该列表并计算已设置viewed标签的项目数false并将其用作未读计数。每当您打开弹出窗口时,您都会浏览整个列表并将viewed标签设置true为所有项目。

我已经为获取您的 Hulu 播放列表的扩展做了类似的事情。当我从您的播放列表中删除视频时,我选择了第一个选项,以便在本地和服务器上删除它。我选择了第二个选项,因为我想显示新视频的计数,但 Hulu 没有记录这一点。(它知道已播放和未播放,但不是我想要的“您已被通知此新视频可用”。

特别参见本节

// Testing that it's the first time I'm seeing this show
if (show_ids.indexOf(new_show.id) == -1) {
    new_shows_number++;
    new_show.seen = "no";
} else {
    new_show.seen = "yes";
}

show_ids是我已经保存并标记为在本地查看的 ID 列表。如果new_show.id不在此列表中,则表示它是未查看的项目。

于 2013-08-16T16:29:57.927 回答