【问题标题】:using javascript to mark a link as visited使用 javascript 将链接标记为已访问
【发布时间】:2010-10-22 04:37:23
【问题描述】:

FF2(至少)不会将链接标记为 :visited 如果它触发 onclick 处理程序而不遵循 href。我正在使用 onclick 从服务器获取数据并修改页面,链接样式在这里似乎很合适。但该链接未标记为已访问。

是否有跨浏览器的方式将链接标记为已访问?如果做不到这一点,有没有办法确定浏览器的 a:visited 样式并将其应用于链接?

感谢所有回复的人。

看起来答案是:

  • 是否有跨浏览器的方式将链接标记为已访问?
    不,没有办法做到这一点。如果 href 在浏览器历史记录中,则链接被标识为已访问。
  • 有没有办法确定浏览器的 a:visited 样式?
    不,不是仅通过 javascript。

【问题讨论】:

标签: javascript css hyperlink


【解决方案1】:

这就是我的做法。仅适用于支持 HTML5 历史 API 的 browsers

// store the current URL
current_url = window.location.href

// use replaceState to push a new entry into the browser's history
history.replaceState({},"",desired_url)

// use replaceState again to reset the URL
history.replaceState({},"",current_url)

使用replaceState表示后退按钮不受影响。

【讨论】:

【解决方案2】:

我知道的唯一解决方法如下。

说,你访问的链接是红色的:

<a href="#" onclick="someEvent();this.style.color='#ff0000'">link</a>

但这并不意味着当页面重新加载时,链接仍然被标记访问过。

为了实现这一点,我建议提供所有链接 ID,这些 ID 在您的整个应用程序中当然是唯一的,或者每个页面都有命名空间。在您的onclick 中,您将触发另一种方法,该方法将链接的 ID 保存到 cookie。

最简单的方法是用逗号分隔的列表,您可以在阅读之前split()。当页面重新加载时,你会做什么。拆分时,您遍历所有 ID 并设置链接的颜色。

例如,使用 jQuery:

// onclick
function saveID(id) {
  if ($.cookie('idCookie')) {
    $.cookie('idCookie', $.cookie('idCookie') + "," + id);
  } else {
    $.cookie('idCookie', id);
  }
}

// make all links colored
function setVisted() {
  var idArray = $.cookie('idCookie').split(',');
  for (var x=0; x<idArray.length; x++) {
    $('#' + idArray[x]).css('color', '#ff0000');
  }
}

// assign saveID()
$(document).ready(function(){
  $('a').click(function(){
    saveId($(this).attr('id'));
  });
  setVisited();
});

我还没有测试过这段代码,但它应该可以帮助你入门并给你一个想法。如果你幸运的话,那就是粘贴并赢。 ;-) 我也没有研究过你可以在 cookie 中存储多少,性能影响是什么,或者有什么其他限制,也请参阅我的 cmets。

【讨论】:

  • 谢谢,这对于保存信息很有用。我还不了解的部分(而且我的浏览器知识并不深入或最新)是如何获取浏览器默认应用到 :visited 链接的样式。至少在那个迷雾重重的时代,用户可以配置他们的浏览器,以便访问的链接以不同的颜色显示(例如,处理色盲问题)。我不想假设颜色是红色,而是想查询样式信息并将其应用于我的“链接”元素。但我不知道该怎么做,或者即使有可能。
  • 只是对我自己的答案的评论。甚至每页一个 cookie 也是有意义的。但要小心不要因此而发疯。我不确定视觉成就是否值得。
  • @Doug 刚刚看到您的其他评论——您想要浏览器默认设置吗?我认为在 Firefox 中它们“隐藏”在 about:config 中。您可能可以通过扩展来准备它,但不能从网页(谢天谢地)。 ;-)
  • 对于 IE,请检查:msdn.microsoft.com/en-us/library/aa741310.aspx 您始终可以使用默认值并希望用户不要更改它们。一般来说,一个应用程序的一致行为是好的。如果您坚持默认设置,您将被保存。但它不会匹配 100%。
  • 哇,效果很好。这是我的高优先级要求之一。非常感谢。
【解决方案3】:

应用与 :visited 具有相同定义的类。

【讨论】:

  • 我让用户的浏览器确定该定义。我的问题的最后一行询问如何访问定义。
  • 是的,很遗憾,我有时不阅读整个问题。
【解决方案4】:

严格来说,单个链接不存在“已访问”状态。浏览器将 URL 本身解释为“已访问”。指向浏览器历史记录中某个 URL 的任何链接都将接收由 CSS 中的 :visited 伪样式定义的样式。

您可以尝试通过将隐藏 iframe 的位置设置为所需的 URL 来伪造它,但这不会强制当前页面重新绘制,所以我怀疑您会看到 :visited 样式更新 w/oa刷新。

对于你问题的第二部分,我可能会选择 Jordan Jones 的回答。

【讨论】:

  • 嗯,但我仍然不知道如何获取该信息。我想我应该把这个作为一个单独的问题来问。
【解决方案5】:

有没有办法确定浏览器的 a:visited 样式?

我会说是的,因为访问了当前文档,您可以找到它的链接颜色,如下所示:-

alert(mys_getLinkColor(top.location))


function mys_getLinkColor(href) {
var x, body, res=''
x = document.createElement('a')
x.href = href
body = document.getElementsByTagName('body')[0]
body.appendChild(x)
if(x.currentStyle) {
   res = x.currentStyle.color
}
else if(window.getComputedStyle) {
   res = window.getComputedStyle(x,null).color
}
return mys_rgbToHexColor(res) }


function mys_rgbToHexColor(v) { 
// E.g. 'rgb(5,2,11)' converts to "#05020b". All other formats returned unchanged.
var i
v = v.split('(')
if(!v[1]) return v[0]
v = v[1].replace(/ /g, '').replace(/\)/, '')
v = v.split(',')
for(i=0; i<v.length; i++) {
   v[i] = Number(v[i]).toString(16)
   if(v[i].length==1) v[i] = '0' + v[i]
}
return '#'+v.join('')}

【讨论】:

  • 请注意,您不能再这样做了 - 至少在现代、安全的浏览器上……这是由于高调的 CSS 历史泄漏漏洞。有关该问题以及如何在 FireFox 中解决此问题的更多信息,请参阅blog.mozilla.com/security/2010/03/31/…
猜你喜欢
  • 2012-05-16
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2018-11-18
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
相关资源
最近更新 更多