我已经更新了我的答案,以反映您下面更新的问题。
正如rjk所提到的那样,您可以使用onbeforeunload
事件来在页面刷新时执行操作。
这里有一个解决方案,应该可以解决一些潜在的问题,我将在下面解释:
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 (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之外的任何浏览器(除非您更正事件处理程序以使其与IE兼容)。我不知道如何使用Firefox扩展程序来实现这一点,尽管可能有一种更好的方法可以使用扩展程序。
更新:
现在我更好地理解了您想要做什么,以下是一些可能有用的信息:
我上面包含的脚本(显然)是专门用于跟踪刷新的。但是,它也可以用于跟踪导航。在检查“if(timestamp > temp)”的条件中,您可以调用另一个函数来执行某些操作(仅在页面刷新时执行该操作等)。如果您需要持久数据,只需将其存储在cookie中,就像我上面所做的那样。如果您不需要保留页面计数,则可以在该cookie中存储其他信息。
我以前从未创建过油猴脚本,但我认为它可以引用DOM中的元素,也可以引用文档的cookie。通过使用上面提供的代码,您可以使用油猴存储站点的持久数据。如果无法访问DOM cookie,则可以使用
greasemonkey 的 GM_setValue()
和 GM_getValue()
函数来存储持久数据。据我所知,这些数据将在浏览器会话中保存。您需要放置一些标志值,以确保它仅在页面加载时起作用(类似于我上面使用的时间戳示例)。
至于jQuery,它是用于JavaScript的API。我不知道它对油猴脚本有多大帮助,尽管我认为如果您在脚本中使用它,它应该能够发挥作用。如果您想开始使用jQuery,请查看
它们的文档。它真的做得很好。我的示例中唯一真正可以有效使用jQuery的部分是事件处理部分。以下是如何在jQuery中处理事件的方法:
$().ready(pageOpened);
$().unload(pageClosed);
使用上述两行代码替换 '
window.addEventListener()
' 调用,即可实现跨浏览器。然而,由于您正在使用 greasemonkey 脚本,除非您需要进行 DOM 操作,否则 jQuery API 是不必要的,而 jQuery 在这方面非常擅长。