有什么方法可以重置链接上的访问状态?
场景是这样的:在一个自然有很多链接的 Intranet 站点上,我们希望一个链接在一段时间内具有“已访问”状态。因此,我正在寻找一种方法来操纵链接的访问状态。
这是可行的吗?当然应该是跨浏览器的。
ETA:客户端解决方案是完全可以接受的。甚至更喜欢.. :-)
ETA-2:允许使用 Cookie。这里没有禁止:-)
有什么方法可以重置链接上的访问状态?
场景是这样的:在一个自然有很多链接的 Intranet 站点上,我们希望一个链接在一段时间内具有“已访问”状态。因此,我正在寻找一种方法来操纵链接的访问状态。
这是可行的吗?当然应该是跨浏览器的。
ETA:客户端解决方案是完全可以接受的。甚至更喜欢.. :-)
ETA-2:允许使用 Cookie。这里没有禁止:-)
当浏览器选择应用:visited
CSS 伪类时,链接显示为“已访问” 。
将链接重置为未访问状态的客户端方法是(以某种方式)清除浏览历史记录。得知有一种便携式方法可以做到这一点,我会感到非常惊讶。它还具有令人不快的副作用,例如削弱对历史敏感的智能位置栏的行为,例如 Firefox 3 中的智能位置栏。
正如 Drew Noakes 所建议的,服务器端的方法是在链接中添加一些噪声查询参数,并定期更改查询参数。这只会给出您想要的行为的错误近似值。要获得“正确”的行为,您需要跟踪每个用户服务器端访问页面的历史记录,因此您只能在必要时间之后更改特定页面的噪声参数。
总而言之,实际上尝试“重置链接上的访问状态”可能是一个坏主意。
我认为更好的解决方案是调整页面样式,以便 :visited 伪类呈现与 :link 伪类相同。然后保留每个用户访问链接的服务器端历史记录,并使用显式visited
类调整链接的显示。
如果您手边没有用户身份,并且不想要求登录,您可以随时使用随机持久 cookie。
我觉得这个想法很臭。
重置链接访问状态的目的是什么?通知一些新数据可用?那么也许像“新”图像这样更冗长的东西会更合适?
另一方面,如果您确实需要这样做 - 更改 URL
所以你只是想让“访问过的”链接在一段时间内看起来不同?如果您绕过浏览器的:visited
伪类并只分配自定义类名,这很容易。使用cookies;他们有内置的过期时间。
当您单击链接时设置一个 JavaScript 处理程序。伪代码:
function clickHandler(event) {
var href = /* (figure out which anchor was clicked and get the href) */
// (you might need to escape the href)
setCookie(href, "visited", 5); // set cookie for 5 days
}
它将在跟随链接之前运行此功能。
然后,在页面加载时,您可以执行以下操作:
function markVisitedLinks() {
var anchors = document.getElementsByTagName("a");
for (var i = 0; i < anchors.length; i++) {
if (readCookie(anchors[i].href) == "visited") {
anchors[i].className += " visited";
}
}
}
从 QuirksMode中获取setCookie和 readCookie 函数。
如果使用“更改 url”的简单服务器端解决方案,例如:
24 小时后变成“http://url1?expire2008_10_21”的“ http ://url1?expire2008_10_20 ” ,
不行,可以使用以下方法:
让服务器在浏览器上存储一个带有链接最后访问时间的 cookie。如果有很多链接并且最大 cookie 长度不够,您可以
如果上次访问时间已过,还要放置一个随机化客户端 url 的代码。
我相信这是浏览器的属性,因此无法从服务器端控制。
一个“hack”可能是在链接末尾附加一个未使用的查询字符串,并定期轮换它们。尽管这意味着特定客户端的“已访问”状态的长度取决于查询字符串何时轮换,而不是固定的时间段。
更改链接的工作方式通常会使您的用户感到困惑和/或不安。这是降低您网站的感知可用性的可靠方法。
你真正想要完成什么?
如果您的站点中的子页面发生了变化(指向新内容),您的用户会发现这一点。如果您的页面结构中有两到三个层次的闪亮新文章,如果重要的话,请在主页上添加一个带有链接的新功能部分。(或者在电子邮件中发送带有链接的通知,或者......)
仅仅格式化:visited
链接的 CSS 属性就足够了,让它看起来好像从未被点击过?
我不知道您是否想暂时跟踪访问过的链接,或者只是一直显示它们;如果是后者,那么一个简单的 CSS(如下所示)就可以了。
a, a:visited {
color: blue;
text-decoration: underline
}
a:hover, a:active {
color: orange;
}
更改目标页面以接受来自查询字符串的参数,并将具有适当生命周期的 cookie 设置为该值。
在引用页面上,放置一些 Javascript 来检查 cookie 的存在。
如果它不存在,让 Javascript 在 URL 中添加一个带有大随机数的参数(这样浏览器的历史记录就无法识别它。)
如果确实存在,让 Javascript 添加一个与 cookie 具有相同值的参数(这样浏览器的历史记录就可以识别它。)
笔记:
我假设链接的目标与引用页面在同一个域上。如果没有,请使用同一域上的重定向页面。
这仅在浏览器的历史与您的 cookie 的生命周期一样长时才有效。如果浏览器历史记录很短或没有,则客户端不会将其显示为已访问。
请不要这样做!您的用户对“已访问”的含义有很好的理解。不要破坏它 - 你只会混淆他们。
您是否需要为不运行 Javascript 的人考虑服务器端解决方案?
我没有测试过这个设计。
维护与用户会话的时间戳访问的 url 列表。
链接页面加载时
作为纯粹的可视化问题,您无需担心以某种方式将访问过的链接标记回未访问过的链接。
为您的链接添加一个 onclick 处理程序,将链接样式更改为类似于已访问状态。从这个处理程序你可以例如。将链接状态写入 cookie。
然后您可以定期检查是否有不再可见的链接并将样式更改回正常。