- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 Firefox WebExtension,它有一个弹出窗口并使用 chrome.storage.local
来存储状态。到目前为止,我已经使用标签 ID 为特定标签存储数据。
如果重新加载当前选项卡,我想重新初始化本地存储。这是因为扩展可能对 DOM 做了一些更改,如果重新加载选项卡,这些更改将会丢失;因此它存储的状态是不正确的。
从弹出窗口调用初始 JavaScript 代码。
如何在页面重新加载时运行一些代码?
谢谢
最佳答案
如果您没有提供更多关于您想要做什么的信息,则很难确定实现此目的的最佳方式。特别是,很难确切地知道您希望对哪些情况使用react。
看起来您可以使用 tabs.onUpdated
的监听器事件。虽然这比您实际期望的更频繁地触发,但它确实会在重新加载页面时触发。
下面是在页面上加载或重新加载 URL 时调用函数 completedLoadingURLInTab()
的代码。我留下了一堆 console.log()
调用作为评论,我通常会删除这些评论。它们可以取消注释以在事件触发时始终显示在控制台中。这对于准确确定从事件接收的数据内容以及在各种页面导航期间触发的事件序列非常有用。
注意 1: 我发现 changeInfo
对象在某些情况下可能无效。有必要使用 hasOwnProperty()
查看属性是否存在然后从 tabs.Tab
中获取值也传递给事件处理程序的对象。
注意 2:manifest.json 中的 tabs
权限是必需的。
function completedLoadingURLInTab(tabId, newUrl,oldUrl) {
//We have completed, loading a URL.
if(newUrl === oldUrl) {
//We re-loaded the previous URL
console.log(">>>>>>> Re-load tab=" + tabId + " with URL=" + newUrl);
} else {
//This URL _may_ be just a new position in the same page. That
// is something that needs to be checked for here.
console.log(">>>>>>> New URL loaded in tab=" + tabId + ". URL=" + newUrl);
}
//Remember the newUrl so we can check against it the next time
// an event is fired.
tabsInfo[tabId].previousCompleteUrl = newUrl;
tabsInfo[tabId].loadingUrl = newUrl;
}
let tabsInfo = {};
function InfoForTab(_loadingUrl,_previousUrl,_status) {
this.loadingUrl = _loadingUrl;
this.previousCompleteUrl = (_previousUrl === undefined) ? "" : _previousUrl;
this.status = (_status === undefined) ? "" : _status;
}
function foundNewTab(tabId) {
//Create an object to hold the collected info for the tab.
tabsInfo[tabId] = new InfoForTab();
console.log("New tab. ID=" + tabId);
}
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if(!tabsInfo.hasOwnProperty(tabId)) {
//This is the first time we have encountered this tab.
foundNewTab(tabId);
}
let output="";
//We use the properties of "tab" instead of "changeInfo" because in testing it was
// clear that changeInfo was not always properly populated. The key(s) may just
// exist, but not have any value associated with them.
/*
//Testing output showing when the event is fired.
// This is used to determine, by experimentation, what events to ignore and which
// combinations and sequence of events occur during page navigation.
output += (changeInfo.hasOwnProperty("status")) ? "\nstatus=" + tab.status : "";
output += (changeInfo.hasOwnProperty("url")) ? "\nurl=" + tab.url : "";
output += (changeInfo.hasOwnProperty("pinned")) ? "\npinned=" + tab.pinned : "";
output += (changeInfo.hasOwnProperty("audible")) ? "\naudible=" + tab.audible : "";
output += (changeInfo.hasOwnProperty("mutedInfo")) ? "\nmutedInfo="+tab.mutedInfo : "";
output +=(changeInfo.hasOwnProperty("favIconUrl"))?"\nfavIconUrl="+tab.favIconUrl : "";
console.log("tabs.updated event: tabId=" + tabId + ":: changeInfo="
+ Object.keys(changeInfo) + output
);
*/
if(changeInfo.hasOwnProperty("status") && changeInfo.hasOwnProperty("url")
&& (tab.status === "loading")) {
//A URL is being loaded into the tab. This can be for the first time,
// or transitioning to a new URL, or reloading the page.
let outputFirst = "";
let outputLoading = "Loading";
if(tabsInfo[tabId].previousCompleteUrl === tab.url) {
//We are re-loading the same URL
outputLoading = "Re-loading";
}
//console.log(outputLoading + " URL=" + tab.url);
//We save the URL which is being loaded, but we really don't do anything with it.
tabsInfo[tabId].loadingUrl = tab.url;
tabsInfo[tabId].status = "loading";
return;
} //else
if(changeInfo.hasOwnProperty("status") && (tab.status === "complete")) {
if( tabsInfo[tabId].status === "loading") {
tabsInfo[tabId].status = "complete";
//console.log("In tabId="+tabId+" completed loading URL="+tab.url);
completedLoadingURLInTab(tabId, tab.url, tabsInfo[tabId].previousCompleteUrl);
return;
} //else
if( tabsInfo[tabId].status === "complete") {
if(tabsInfo[tabId].previousCompleteUrl === tab.url) {
//console.log("In tabId=" + tabId + " got completed status change after"
// + "already complete with URL="
// + tabsInfo[tabId].previousCompleteUrl);
return;
}//else
//console.log("In tabId=" + tabId + " completed directly loading new URL="
// + tab.url);
completedLoadingURLInTab(tabId, tab.url, tabsInfo[tabId].previousCompleteUrl);
return;
}
}//else
if(changeInfo.hasOwnProperty("status") && (tab.status === "loading")
&& ( tabsInfo[tabId].status === "complete")) {
//console.log("In tabId=" + tabId + " leaving page");
return;
}//else
if(changeInfo.hasOwnProperty("status") ) {
if((tab.status === "complete") && (tab.url === "about:newtab")
&& tabsInfo[tabId].loadingUrl === undefined ) {
//We have completed loading about:newtab for the first time in this tab.
tabsInfo[tabId].status = "complete";
completedLoadingURLInTab(tabId, tab.url, tabsInfo[tabId].previousCompleteUrl);
return;
} //else
//console.log("In tabId=" + tabId + " got status change to " + tab.status
// + " prior to loading a URL with current URL=" + tab.url);
return;
}//else
});
加载附加组件、打开新选项卡并进行一些导航(包括重新加载一些页面)后,控制台中的输出可能如下所示:
New tab. ID=6
>>>>>>> New URL loaded in tab=6. URL=about:newtab
>>>>>>> New URL loaded in tab=6. URL=https://www.google.com/?gws_rd=ssl
>>>>>>> Re-load tab=6 with URL=https://www.google.com/?gws_rd=ssl
>>>>>>> New URL loaded in tab=6. URL=https://www.google.com/?gws_rd=ssl#q=test
>>>>>>> Re-load tab=6 with URL=https://www.google.com/?gws_rd=ssl#q=test
>>>>>>> New URL loaded in tab=6. URL=https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/Tabs/onUpdated
>>>>>>> New URL loaded in tab=6. URL=https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/Tabs/onUpdated#changeInfo
>>>>>>> Re-load tab=6 with URL=https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/Tabs/onUpdated#changeInfo
webNavigation
事件webNavigation
事件直接为您提供有关网络导航的信息。他们可能会为您提供比 tabs.onUpdated
更好的解决方案。
如果您使用 webNavigation
事件,您将需要进行试验以了解针对您所关注的情况会触发哪些事件组合。这很可能是 Completed
和/或 ReferenceFragmentUpdated
.
因此您可以了解当这些事件触发时发生了什么,以下代码会将所有 webNavigation
事件记录到控制台:
var webNavEvents = ['BeforeNavigate',
'Committed',
'Completed',
//'CreatedNavigationTarget', //Not supported by Firefox
'DOMContentLoaded',
'ErrorOccurred',
'HistoryStateUpdated',
'ReferenceFragmentUpdated'
//'TabReplaced' //Not supported by Firefox
];
webNavEvents.forEach(function(navType){
browser.webNavigation['on' + navType].addListener(function(type,details){
console.log('\twebNavigation->' + type
+ ': tadId=' + details.tabId
+ ':: url=' + details.url
+ ((typeof details.transitionType === 'string') ? ':: transitionType='
+ details.transitionType : '')
);
}.bind(undefined,navType));
});
关于firefox - 网络扩展 : React when a a tab is reloaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38407703/
请帮助修复算法并防止点击提交后重新加载:我的网站必须检查,用户是否曾经输入过昵称。如果他有,那么网站必须显示他的名字,如果没有,则要求输入。如果用户决定更改它,他将单击“重置用户名”。 点击“重置”后
我最近在 Chrome 中发现了这个新功能: 我可以找出选项 1 和选项 3 之间的区别,选项 2 可能介于两者之间,但我在任何地方都找不到更精确的信息。 有人知道这 3 个选项的确切行为吗? 最佳答
当我在模拟器上开发时一切都很好,但现在我正处于我的应用程序几乎完成但必须在真实设备上更改一些视觉小东西的阶段。出于这个原因,我希望有与在模拟器上测试时相同的选项:实时重载或热重载。 这是我摇动设备时的
所以,我在我的项目中使用了 gulp。 我使用 gulp-compass 来编译我的 Assets 。 而且,我的任务之一是监视开发人员的任务。像这样: gulp.task('live', funct
在 lein REPL 中有一个奇怪且非常烦人的行为,更不用说经常耗时了。 即,如果我将 :reload-all 与命名空间一起使用,并且它所需的命名空间有错误,则 repl 不会告诉我任何相关信息。
我需要使用 JavaScript 刷新页面。我尝试了 window.location.reload() 和 location.reload()。两者都在工作并重新加载页面。我应该使用哪一个? 最佳答案
我知道这很愚蠢,但我真的想了解 Location.reload() 和 window.location.reload() 之间的区别; 如果我使用 location.reload() 会发生什么?如果
In this plunk你有两个 ui-router 状态,一个父状态和一个子状态。当通过单击链接调用子级时,由于它具有选项 reload: true,因此它始终会重新加载。这很好,但问题是父状态也
当我用 expo 打开开发者菜单时,它显示: 实时重新加载不可用 和 热重载不可用 我已根据需要登录,我也尝试过使用二维码加载应用程序,但没有帮助。 .expo/settings.json: {
为什么 Live Reload、Hot Reload 和 Remote Debugger 都不可用?我试过了 重新加载 JS 包 重启模拟器 重新启动打包器 重新启动打包程序并清除缓存 重置模拟器 重
我在 Controller 中有这个: $scope.foo = function(){ return RolesService.remove({ data: rol
Angular.js 中的 $window.location.reload() 和 $route.reload() 有什么区别? 我已经使用了这两个东西,但它们的工作进度相同。 谁能解释一下区别? 最
只是一个简短的问题。我想知道是否有一个选项或开关可以启用重新加载按钮下的“硬重新加载”和“清空缓存和硬重新加载”选项而无需打开devtools,以便它们始终弹出,即使devtools没有开放。 我知道
我已经使用 flutter_web 有一段时间了,从来没有真正质疑过它在按下“热重载”时总是重新启动整个应用程序,但自从现在 flutter_web 被合并到主要的 flutter channel 我
例如,我希望导航中的此更改能够重新加载状态: #/detail/1 #/detail/2 但是我不希望这个导航重新加载状态: #/detail/1?search=blah #/detail/1?sea
遵循 uvicorn-gunicorn-fastapi-docker 中的文档我应该通过运行来运行我的图像: docker run -d -p 80:80 -v $(pwd):/app myimage
我看过很多关于 的帖子和出版物实时重载 , 热重载 , 和 热模块更换 ,指的是在 Web 客户端/FE 层工作时,在浏览器中立即反射(reflect)代码更改的不同做法。 我对这些术语指的是什么有一
我有一个脚本可以检查两个或多个选项是否相似。如果它们相似,我会阻止提交该页面。它有效,但仅当我在显示警报消息后刷新页面时才有效。如果我选择了一个合适的选项,除非刷新页面,否则错误警报仍保留在内存中。
我有一个脚本,可以动态地将一些参数写入配置文件,我需要根据更新的参数从链接模块调用一些函数。但是,当我在配置文件上调用 reload() 时,有时我看不到任何变化。 以下代码片段将解释该场景: imp
我已连接到远程 mysql 服务器,但在几次连接不良(由于自动化)后,我被服务器阻止。我正在尝试解锁自己。 提示建议我执行mysqladinlush-hosts # This was done loc
我是一名优秀的程序员,十分优秀!