检测用户刷新页面的时间

时间:2017-09-29 19:02:13

标签: javascript google-chrome google-chrome-extension

我正在开发一个Chrome扩展程序,在某些域上显示弹出窗口。 每次用户访问网页时都应显示弹出窗口,或者使用其中一个目标域刷新当前页面。 所以首先我在更新当前标签时推出了一个监听器:

chrome.runtime.onInstalled.addListener(function () {
    chrome.tabs.onUpdated.addListener(onTabUpdate);
});

每次加载页面时都会执行onTabUpdate函数(我删除了一些不必要的代码,比如域测试):

function onTabUpdate(tabId, info, tab) {
//if page is refreshed
if (info.url === undefined) {
    if (info.status == 'loading') {
        console.log('Refresh happened for tab: ' + tabId)
        tabsLoaded = {};
        loadPopup(tabId);
    }
}
//if page is first time loaded 
if (tab.status !== 'complete') {
    return;
} else {
    console.log("page loaded ");
    loadPopup(tabId);

}}

代码运行良好并检测页面加载或刷新的时间,问题是当我显示弹出窗口并且用户关闭它时,触发刷新事件并再次显示弹出窗口。我认为因为chrome重绘了DOM并刷新了页面。 因此,我正在寻找方法来检测用户自己何时刷新页面,而不是在Chrome时。

1 个答案:

答案 0 :(得分:0)

我发现了黑客攻击。我不认为有办法通过chrome原生API来做到这一点。 将内容脚本注入每个选项卡,以检测用户何时刷新页面并发送消息:

if (performance.navigation.type == 1) {
    chrome.runtime.sendMessage("your_extension_id", "pageRefreshed");
}

然后在后台脚本中设置一个监听器,以捕获此消息:

chrome.runtime.onMessage.addListener(function (e, sender) {
        if (e == "pageRefreshed") {
            var hostName = extractHostname(sender.tab.url);
            if (partnersList.some(function (el) {
                    return hostName.indexOf(el) !== -1;
                })) {
                loadPopup(sender.tab.id);
            }
        }
    });
瞧,瞧!问题解决了:)