我想要做的是在FireFox中的页面重新加载/刷新后触发扩展/ GM脚本中的函数...
想象一下:
我想我想编写一些JavaScript来完成所有这些...而且因为需要持久化而且我没有能力更改源站点,我想到写一个FireFox扩展或GreaseMonkey - 基本上客户端的任何事情。
类似DOMContentReloaded事件的行为(如果存在):
addEventListener(“DOMContentReloaded”,pageReloaded,false);
此类代码的典型测试用例是:
所有这些都可以通过FireFox扩展(或GreaseMonkey来完成,以防GM中的洗脱更容易/更好/推荐) - 考虑到这一点,事情应该很容易吗?
答案 0 :(得分:6)
我已更新我的回答,以反映下面的更新问题。
如上所述rjk,您可以使用onbeforeunload
事件在页面刷新时执行操作。
这是一个解决方案,应该解决我将在下面解释的一些潜在问题:
// Just some cookie utils from: http://www.quirksmode.org/js/cookies.html
var Cookie = {
create: function(name, value, days) {
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
var expires = "; expires=" + date.toGMTString();
}
else var expires = "";
document.cookie = name + "=" + value + expires + "; path=/";
},
read: function(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1, c.length);
}
if (c.indexOf(nameEQ) == 0) {
return c.substring(nameEQ.length, c.length);
}
}
return null;
},
erase: function(name) {
createCookie(name, "", -1);
}
}
window.addEventListener('beforeunload', pageClosed, false);
window.addEventListener('load', pageOpened, false);
function pageOpened() {
var timestampString = Cookie.read('closeTester');
if (timestampString) {
var timestamp = new Date(timestampString);
var temp = new Date();
temp.setMinutes(temp.getMinutes() - 1, temp.getSeconds() - 30);
// If this is true, the load is a re-load/refresh
if (timestamp > temp) {
var counter = Cookie.read('counter');
if (counter) {
counter++;
Cookie.create('counter', counter);
} else {
Cookie.create('counter', 1);
}
}
Cookie.erase('closeTester');
}
}
function pageClosed() {
Cookie.create('closeTester', new Date());
}
这样做是在页面卸载时创建一个临时cookie。 cookie存储当前时间的时间戳。加载页面时,将读取该cookie,并检查时间戳以查看它的年龄。如果它在30秒内,它将递增计数器。
我选择了30秒,因为我不知道您的网站数据密集程度或加载时间。如果您的网站速度很快,我会将其更改为5-10秒,以便脚本更准确。要做到这一点,将秒数更改为50-55秒,您将分别获得10秒或5秒窗口。
这只会在浏览器保持打开状态时跟踪重新加载。一旦关闭,计数就会丢失。您可以通过在“count
”Cookie中添加过期来更改它。
由于时间戳cookie仅在浏览器打开时维护,因此该脚本非常值得信赖,因为它不会计算关闭并重新打开浏览器。唯一可能出现问题的情况是用户是否打开了选项卡,然后关闭选项卡并在指定的时间窗口内重新打开它。
所有这些都是在没有firefox扩展的情况下完成的,并且可以在除IE之外的任何浏览器上工作(除非你纠正事件处理程序以使用它)。我不知道如何使用firefox扩展来实现这一点,尽管可能有更好的方法使用扩展。
既然我明白你要做的更好一点,这里有一些可能会有所帮助的事情:
我上面包含的脚本(显然)专门用于跟踪刷新。但是,它也可以用于跟踪导航。在检查“if (timestamp > temp)
”的情况下,您可以调用另一个将执行某些操作的函数(该操作仅在刷新页面时执行,等等)。如果你想要持久数据,你只需要将它存储在cookie中,就像我上面那样。如果您不需要保留页数,则可以在该cookie中存储其他一些信息。
我以前从未创建过greasemonkey脚本,但我假设因为它可以引用DOM中的元素,所以它也可以引用文档的cookie。这将允许您使用greasemonkey存储站点的持久数据,只需使用上面包含的代码即可。如果您无法访问DOM cookie,则可以使用greasemonkey's GM_setValue()
and GM_getValue()
functions来存储持久数据。据我所知,这些数据将存储在浏览器会话中。你必须放入一些标记值,以确保它只适用于页面加载(类似于我上面使用的时间戳示例)。
至于jQuery,这是一般用于JavaScript的JavaScript API。我不知道它对GreaseMonkey脚本有多大用处,虽然我认为如果你在脚本中使用它会有用。如果您想开始使用jQuery,请查看their documentation。它做得非常好。我的示例中唯一可以有效使用jQuery的部分是事件处理部分。以下是如何在jQuery中执行事件处理:
$().ready(pageOpened);
$().unload(pageClosed);
将上述2行替换为“window.addEventListener()
”调用,您就可以实现跨浏览器实施。但是,由于你正在使用greasemonkey脚本,除非你想进行jQuery非常擅长的DOM操作,否则jQuery API就变得不必要了。
答案 1 :(得分:0)
我认为有任何方法可以通过在浏览器中刷新页面来保留JavaScript - 然后再将它们全部加载......
也许你可以从window.onbeforeunload
开始重载重载按钮的默认功能,并使用AJAX重新加载一些主要的div ...
答案 2 :(得分:0)
分配window.onbeforeunload是一个可行的解决方案,如果页面关闭也不会被触发!
还有更多建议......也许FF扩展或GM脚本特定?
答案 3 :(得分:0)
使用window.name
或document.cookie
- 这两个属性都可以在刷新页面后继续存在。
答案 4 :(得分:0)
919756 如果你成功了,TC工作人员会抓住并禁止你。不知道我怎么知道的? hmmmmm ...