有没有办法重置链接的访问状态?
情境如下:在一个自然含有大量链接的内联网站上,我们希望链接仅在设定的一段时间内具有“已访问”的状态。因此,我正在寻找一种操纵链接访问状态的方法。
这可行吗?当然应该跨浏览器支持。
预计完成时间:客户端解决方案完全可行。甚至更好。:-)
ETA-2:允许使用Cookie。在这里没有限制。:-)
有没有办法重置链接的访问状态?
情境如下:在一个自然含有大量链接的内联网站上,我们希望链接仅在设定的一段时间内具有“已访问”的状态。因此,我正在寻找一种操纵链接访问状态的方法。
这可行吗?当然应该跨浏览器支持。
预计完成时间:客户端解决方案完全可行。甚至更好。:-)
ETA-2:允许使用Cookie。在这里没有限制。:-)
:visited
CSS 伪类 时出现为"已访问"。
重置链接到未访问状态的客户端方法是(某种方式)清除浏览历史记录。我很惊讶地发现没有一种便携的方法可以实现它。它还有不良副作用,例如瘫痪 Firefox 3 中的智能位置栏等历史敏感型工具栏的行为。
正如 Drew Noakes 所建议的,服务器端的方法是向链接添加一些噪声查询参数,并定期更改查询参数。这只给出了您想要的行为的糟糕近似值。要获取“正确”的行为,您需要跟踪每个用户的已访问页面的历史记录,以便您可以在必要的时间之后仅为特定页面更改噪声参数。
总之,尝试“重置链接的已访问状态”很可能是一个坏主意。
我认为更好的解决方案是调整页面样式,使 :visited 伪类呈现与 :link 伪类相同。然后保留每个用户的已访问链接的服务器端历史记录,并使用显式的 visited
类来调整链接的显示。
我感觉这个想法有点不太对劲。
重设链接访问状态的目的是什么?是为了通知一些新数据可用吗?那么可能更适合使用“NEW”图像之类的更详细说明。
另一方面,如果你真的需要这样做,那就改变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 函数。
我认为这是浏览器的属性,所以无法从服务器端进行控制。
一个“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的人的服务器端解决方案吗?
我没有测试过这个设计。
由于这个问题纯粹是可视化的,所以您不需要担心如何将已访问的链接标记回未访问状态。
为您的链接添加一个onclick处理程序,将链接样式更改为类似于已访问状态。从此处理程序中,您可以将链接状态写入cookie。
然后,您可以定期检查是否有链接不再应该可见,并将样式更改回正常状态。