重置链接的访问状态

21

有没有办法重置链接的访问状态?

情境如下:在一个自然含有大量链接的内联网站上,我们希望链接仅在设定的一段时间内具有“已访问”的状态。因此,我正在寻找一种操纵链接访问状态的方法。

这可行吗?当然应该跨浏览器支持。

预计完成时间:客户端解决方案完全可行。甚至更好。:-)

ETA-2:允许使用Cookie。在这里没有限制。:-)


1
说实话,我希望能够在某个页面上看到一些重置链接状态的快捷键。比如Ctrl+Shift+R或Ctrl+Alt+R,可以重置当前页面的状态,也许只是当前页面(目前用于清除缓存,但这不会重置链接状态),第二个则是递归重置。这将很酷 :) - Jerry Green
10个回答

9
链接会在浏览器选择应用 :visited CSS 伪类 时出现为"已访问"。

重置链接到未访问状态的客户端方法是(某种方式)清除浏览历史记录。我很惊讶地发现没有一种便携的方法可以实现它。它还有不良副作用,例如瘫痪 Firefox 3 中的智能位置栏等历史敏感型工具栏的行为。

正如 Drew Noakes 所建议的,服务器端的方法是向链接添加一些噪声查询参数,并定期更改查询参数。这只给出了您想要的行为的糟糕近似值。要获取“正确”的行为,您需要跟踪每个用户的已访问页面的历史记录,以便您可以在必要的时间之后仅为特定页面更改噪声参数。

总之,尝试“重置链接的已访问状态”很可能是一个坏主意。

我认为更好的解决方案是调整页面样式,使 :visited 伪类呈现与 :link 伪类相同。然后保留每个用户的已访问链接的服务器端历史记录,并使用显式的 visited 类来调整链接的显示。

如果您没有用户身份信息,又不想要求登录,您可以随时使用一个随机的持久化cookie。

7

我感觉这个想法有点不太对劲。

重设链接访问状态的目的是什么?是为了通知一些新数据可用吗?那么可能更适合使用“NEW”图像之类的更详细说明。

另一方面,如果你真的需要这样做,那就改变URL。


3
这是一个内部网络。所有链接都会很快地被任何一个用户访问。因此,如果不定期重置已访问状态,则已访问状态将失去任何意义。 - erlando
1
那么有一个问题,为什么需要区分已访问和未访问的链接?有任何真正的可用性优势吗? - miceuz
3
这就回答了所有问题,@erlando。如果你想重置访问状态,需要在你希望的每个链接结尾添加一些东西,比如http://intranet/link#modified-2010-03-17。 - cregox
我认为重置已访问链接状态指示器没有任何问题。它们存在是有原因的,但对某些情况可能没有意义(如erlando所指出的)。这可以通过在链接的href值中添加随机查询字符串参数来轻松地在客户端使用javascript完成。 - user6096790

6

所以您只想在一定时间内使“已访问”链接看起来不同?如果您绕过浏览器的: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 函数


4
如果像“更改url”这样的简单服务器端解决方案不可行,比如:http://url1?expire2008_10_20在24小时后变为http://url1?expire2008_10_21,则您可以使用以下方法:
让服务器在浏览器上存储一个cookie,其中包含链接的最后访问时间。如果有很多链接且最大cookie长度不足,则可以:
1.存储会话cookie并在服务器上保留已访问数据 2.使用Flash的类似cookie的本地共享对象
此外,如果最后访问时间过期,则为客户端随机化URL的代码也要放置。

2

我认为这是浏览器的属性,所以无法从服务器端进行控制。

一个“hack”的方法可能是在链接末尾添加一个未使用的查询字符串,并定期旋转它们。虽然这意味着特定客户端的“已访问”状态的长度取决于查询字符串旋转的时间,而不是固定的时间段。


2

仅仅将链接的:visited CSS属性格式化,使其看起来从未被点击,这样就足够了吗?

我不知道您是否想要跟踪已访问的链接一段时间,还是只需始终以相同方式显示它们;如果是后者,则可以使用简单的CSS(如下所示)。

    a, a:visited {
         color: blue;
         text-decoration: underline
    }

    a:hover, a:active {
         color: orange;
    }

1

改变链接的工作方式通常会使您的用户感到困惑和/或不满。这是降低您网站感知易用性的一种确定的方法。

您真正想要实现什么目标?

如果您的网站有子页面进行更改(指向新内容),您的用户会理解的。如果您在页面结构的两三层深处拥有一个全新的文章,请在主页上添加一个“最新动态”部分并提供链接,如果它非常重要。(或通过电子邮件发送带有链接的通知,或其他方式...)


0

将目标页面更改为接受来自查询字符串的参数,并设置一个适当生命周期的cookie值。

在引用页面上,添加一些Javascript代码以检查cookie是否存在。

如果不存在,则让Javascript在URL中添加一个带有大随机数的参数(这样浏览器的历史记录就不会识别它)。

如果存在,则让Javascript添加一个具有与cookie相同值的参数(这样浏览器的历史记录就会识别它)。

注意:

  • 我假设链接的目标与引用页面位于同一域中。如果不是,请在同一域上使用重定向页面。

  • 这仅在浏览器历史记录与cookie寿命一样长时才有效。如果浏览器历史记录很短或没有历史记录,则客户端不会将其显示为已访问。

  • 请不要这样做!您的用户对“已访问”的含义有很好的理解。不要打破它-您只会使他们感到困惑。

  • 您需要考虑那些不运行Javascript的人的服务器端解决方案吗?

  • 我没有测试过这个设计。


0
在用户会话中维护一个具有时间戳的已访问网址列表。
当链接页面加载时,进行以下操作:
  • 清除过期的网址
  • 将列表中包含的链接样式设置为已访问。

0

由于这个问题纯粹是可视化的,所以您不需要担心如何将已访问的链接标记回未访问状态。

为您的链接添加一个onclick处理程序,将链接样式更改为类似于已访问状态。从此处理程序中,您可以将链接状态写入cookie。

然后,您可以定期检查是否有链接不再应该可见,并将样式更改回正常状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接