IE7 - 页面刷新后访问过的链接恢复为未访问状态

时间:2010-03-29 21:04:19

标签: javascript internet-explorer-7 hyperlink window.open visited

我们的一些用户刚刚从IE6升级到IE7。 upgreaded用户报告在页面刷新后恢复到其未访问颜色的访问链接的问题。这仅发生在使用javascript而不是硬编码URL的链接上:

<script lang="JavaScript">
<!--
 function LoadGoogle()
 {
  var LoadGoogle = window.open('http://www.google.com');
 }
-->
</script>

<a href="javascript:LoadGoogle()">Google using javascript</a>
<a href="#" OnClick="javascript:LoadGoogle()">Google using javascript OnClick</a>

每当刷新页面时,上述链接将恢复为未访问的颜色。由于回发,手动点击刷新或f5按钮或自动刷新功能,页面是否刷新无关紧要。请注意,上面的代码是对实际情况的过度简化,但我认为它足以说明问题。

这对我们的用户造成了问题,因为我们正在为他们提供一个项目列表,这些项目在点击时都会通过javascript打开到新窗口中;并在用户完成后刷新父页面。每次刷新父页面时,所有这些链接都会恢复为未访问的颜色,因此我们的用户正在忘记他们处理过哪些项目。

我一直在挖掘,看起来这是预期的行为。 IE7不会在浏览器历史记录中注册这些链接。有没有人知道一个可以让我们将这些javascript链接保持在访问状态而不必对应用程序代码进行大修的工作?

谢谢。

2 个答案:

答案 0 :(得分:1)

您真的不希望javascript:网址维持访问/未访问状态。它们不是真实的位置,它们是浏览器在当前文档中执行的命令。

javascript:网址也不应该被使用。

<a href="javascript:LoadGoogle()">Google using javascript</a>

这是可访问性和可用性的完全灾难。并且通常也出于搜索引擎优化的原因,但对于一个无关紧要的内部应用程序(可能谷歌在没有你帮助的情况下对他们的SEO做得很好。; - ))

<a href="#" OnClick="javascript:LoadGoogle()">Google using javascript OnClick</a>

由于同样的原因,这仍然很糟糕,而且您已经忘记了点击处理程序中的return false,因此页面滚动到顶部,而javascript:位于事件处理程序的开头没有意义,因为它不是一个URL。 (在这种情况下,javascript:被视为一个行标签,这是一个几乎完全没有意义的语言功能,没有人真正使用过。)

这是你想要的标记:

<a href="http://www.google.com/" onclick="window.open(this); return false;">Google proper link</a>

(实际上你可能不会引人注目 - 而不是包含onclick属性。)

这适用于所有设备,JavaScript是否可用,可视浏览器与否,它将在状态栏中显示正确的链接,并允许用户使用所有正常的浏览器工具,如中键单击链接上的新选项卡或右键单击书签链接,而不会获得相同的页面,空白页面或错误。

当然,它也会正确反映目标网页本身的访问/未访问状态,这比虚假javascript:伪URL更准确。将href属性指向真正访问过的实际位置是获得:visited渲染的唯一可靠方式。

答案 1 :(得分:0)

有趣的是,我以前从未遇到过这个问题,但这是有意义的。

可能的解决方法(我现在无法测试它们,所以我只需要把它们扔到这里,如果你愿意,可以尝试一下):

  • 使用唯一的哈希值:<a href="#JavaScriptLoadGoogle" onClick="...

    也许这足以让IE永久“访问”此链接:这是一个有效的位置。 (页面中不必存在该名称的实际锚点。)

  • 如果这是需要 JS的应用程序,您可以将其访问href属性:

    <a href='http://www.google.com' 
       onclick='LoadGoogle(); return false;'>  
    <!-- You don't need the Javascript: prefix here -->
    

    我不确定此方法是否会将URL注册为已访问,因为我们在点击事件中返回false

也许其中一个修复了它。