19

有什么方法可以重置链接上的访问状态?

场景是这样的:在一个自然有很多链接的 Intranet 站点上,我们希望一个链接在一段时间内具有“已访问”状态。因此,我正在寻找一种方法来操纵链接的访问状态。

这是可行的吗?当然应该是跨浏览器的。

ETA:客户端解决方案是完全可以接受的。甚至更喜欢.. :-)

ETA-2:允许使用 Cookie。这里没有禁止:-)

4

10 回答 10

8

当浏览器选择应用:visited CSS 伪类时,链接显示为“已访问” 。

将链接重置为未访问状态的客户端方法是(以某种方式)清除浏览历史记录。得知有一种便携式方法可以做到这一点,我会感到非常惊讶。它还具有令人不快的副作用,例如削弱对历史敏感的智能位置栏的行为,例如 Firefox 3 中的智能位置栏。

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

总而言之,实际上尝试“重置链接上的访问状态”可能是一个坏主意。

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

如果您手边没有用户身份,并且不想要求登录,您可以随时使用随机持久 cookie。

于 2008-10-20T08:33:40.830 回答
7

我觉得这个想法很臭。

重置链接访问状态的目的是什么?通知一些新数据可用?那么也许像“新”图像这样更冗长的东西会更合适?

另一方面,如果您确实需要这样做 - 更改 URL

于 2008-10-20T09:16:37.997 回答
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 函数。

于 2008-10-20T18:41:42.113 回答
4

如果使用“更改 url”的简单服务器端解决方案,例如:

24 小时后变成“http://url1?expire2008_10_21”的“ http ://url1?expire2008_10_20 ” ,

不行,可以使用以下方法:

让服务器在浏览器上存储一个带有链接最后访问时间的 cookie。如果有很多链接并且最大 cookie 长度不够,您可以

  1. 存储会话 cookie 并将访问过的数据保存在服务器上
  2. 使用 cookie 的 flash 模拟 - 本地共享对象

如果上次访问时间已过,还要放置一个随机化客户端 url 的代码。

于 2008-10-20T08:33:10.377 回答
2

我相信这是浏览器的属性,因此无法从服务器端控制。

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

于 2008-10-20T08:10:39.987 回答
1

更改链接的工作方式通常会使您的用户感到困惑和/或不安。这是降低您网站的感知可用性的可靠方法。

你真正想要完成什么?

如果您的站点中的子页面发生了变化(指向新内容),您的用户会发现这一点。如果您的页面结构中有两到三个层次的闪亮新文章,如果重要的话,请在主页上添加一个带有链接的新功能部分。(或者在电子邮件中发送带有链接的通知,或者......)

于 2008-10-20T18:54:59.593 回答
1

仅仅格式化:visited链接的 CSS 属性就足够了,让它看起来好像从未被点击过?

我不知道您是否想暂时跟踪访问过的链接,或者只是一直显示它们;如果是后者,那么一个简单的 CSS(如下所示)就可以了。

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

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

于 2008-10-20T19:04:54.127 回答
0

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

在引用页面上,放置一些 Javascript 来检查 cookie 的存在。

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

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

笔记:

  • 我假设链接的目标与引用页面在同一个域上。如果没有,请使用同一域上的重定向页面。

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

  • 请不要这样做!您的用户对“已访问”的含义有很好的理解。不要破坏它 - 你只会混淆他们。

  • 您是否需要为不运行 Javascript 的人考虑服务器端解决方案?

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

于 2008-10-20T08:38:21.193 回答
0

维护与用户会话的时间戳访问的 url 列表。

链接页面加载时

  • 刷新过时的网址
  • 列表中包含的样式链接作为已访问。
于 2008-10-20T09:22:34.787 回答
0

作为纯粹的可视化问题,您无需担心以某种方式将访问过的链接标记回未访问过的链接。

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

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

于 2008-10-20T09:47:00.010 回答