【问题标题】:Resetting visited status on links重置链接上的访问状态
【发布时间】:2008-10-20 08:06:27
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 老实说,我希望看到一些用于重置某个页面上的链接状态的热键。像 Ctrl+Shift+R 或 Ctrl+Alt+R 之类的东西 - 会重置当前页面上的状态,可能只是当前页面(当前用于清除缓存,但这不会重置链接状态),第二个用于递归重置。会很酷:)

标签: javascript css client-side


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我觉得这个想法很臭。

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

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

    【讨论】:

    • 这是一个内网。任何一个用户都可以快速访问所有链接。因此,如果不偶尔重置,访问状态将失去任何意义。
    • 那么有一个问题,为什么需要区分已访问和未访问的链接?有什么真正的可用性优势吗?
    • 这回答了一切,@erlando。如果您想重置访问状态,请在您想要的每个链接的末尾添加一些内容,例如intranet/link#modified-2010-03-17
    • 我认为重置已访问链接状态指示器没有任何问题。它们存在是有原因的,在某些情况下这可能没有意义(如 erlando 所述)。这可以通过在链接的 href 值中添加随机查询字符串参数来使用 javascript 在客户端轻松完成。
    【解决方案3】:

    如果一个简单的服务器端解决方案带有“更改网址”,例如:

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

    不行,可以用下面的:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          你真正想要完成什么?

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

          【讨论】:

            【解决方案7】:

            只需格式化链接的:visited CSS 属性,使其看起来好像从未被点击过就足够了吗?

            我不知道您是想暂时跟踪访问过的链接,还是始终以相同的方式显示它们;如果是后者,那么一个简单的 CSS(如下所示)就可以了。

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

            【讨论】:

              【解决方案8】:

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

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

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

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

              注意事项:

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

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

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

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

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

              【讨论】:

                【解决方案9】:

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

                链接页面加载时

                • 刷新过时的网址
                • 样式链接包含在已访问列表中。

                【讨论】:

                  【解决方案10】:

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

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

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

                  【讨论】:

                    猜你喜欢
                    • 2019-02-11
                    • 2012-09-19
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-05-04
                    • 2018-11-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多