重置链接上的访问状态

时间:2008-10-20 08:06:28

标签: javascript css client-side

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

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

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

ETA:客户端解决方案完全可以接受。首选偶数..: - )

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

10 个答案:

答案 0 :(得分:7)

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

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

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

所有人都说,实际上尝试“重置链接上的访问状态”可能是一个坏主意。

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

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

答案 1 :(得分:6)

我觉得这个想法有点臭。

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

另一方面,

如果你真的需要这样做 - 更改网址

答案 2 :(得分: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获取the setCookie and readCookie functions

答案 3 :(得分:4)

如果是一个简单的服务器端解决方案,其中包含“更改网址”,例如:

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

不行,您可以使用以下内容:

让服务器在浏览器上存储cookie,其中包含链接的上次访问时间。如果有很多链接并且最大cookie长度是不够的,你可以

  1. 存储会话cookie并在服务器上保留访问数据
  2. 使用Cookie的flash模拟 - 本地共享对象
  3. 如果上次访问时间过期,还要为客户端随机放置一个代码。

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

你真的想要完成什么?

如果您的网站中的子页面发生了更改(指向新内容),则您的用户将会明白。如果您的页面结构中有两三层深的新文章,请在主页上添加一个新的部分,如果它很重要的话。 (或发送带有电子邮件链接的通知,或......)

答案 6 :(得分:1)

仅仅格式化链接的:visited CSS属性是否足以让它看起来好像从未被点击过?

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

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

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

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

答案 7 :(得分:0)

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

在引用页面上,输入一些Javascript来检查cookie是否存在。

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

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

注意:

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

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

  • 请不要这样做!您的用户非常了解“访问”的含义。不要打破它 - 你只会混淆它们。

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

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

答案 8 :(得分:0)

维护一个访问过的网址列表,其中包含用户会话的时间戳。

加载链接页面时

  • flush stale urls
  • 列表中包含的样式链接。

答案 9 :(得分:0)

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

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

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