我正在开发一个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时。
答案 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);
}
}
});
瞧,瞧!问题解决了:)