IE没有将链接标记为"访问过"通过javascript渲染时

时间:2013-09-20 14:35:00

标签: javascript ajax internet-explorer hashchange

我正在使用一个网站,其中所有内容都是使用jquery通过ajax回发呈现的。我正在使用Ben Alman的hashchange(http://benalman.com/projects/jquery-hashchange-plugin/)来管理哈希历史记录,它允许我为页面添加书签,使用后退按钮等...当然,除了IE 9之外,其他所有内容都能完美运行。在IE中存在一个小问题,“访问”链接未标记为已访问。在加载新内容之前单击链接后,您可以看到该链接在一瞬间变为紫色(已访问)。但是,一旦单击后退按钮,链接就会显示为从未访问过。这是我正在谈论的一个例子: http://jsfiddle.net/7nj3x/3/

这是jsfiddle代码,假设你有jquery和head中引用的hashchange插件:

$(function(){
  // Bind an event to window.onhashchange that, when the hash changes, gets the
  // hash and adds the class "selected" to any matching nav link.
  $(window).hashchange( function(){
    alert("Hash changed to:"+location.hash);  
    var hash = location.hash;
    // Set the page title based on the hash.
    document.title = 'The hash is ' + ( hash.replace( /^#/, '' ) || 'blank' ) + '.';
    //simulate body being rendered by ajax callback 
      if(hash == ""){  
        $("body").html("<p id='nav'><a href='#test1'>test 1</a> <a href='#test2'>test 2</a> <a href='#test3'>test 3</a></p>");
      }
      else{
        $("body").html("Right click within this pane and select \"Back\".");  
      }
  })
  // Since the event is only triggered when the hash changes, we need to trigger
  // the event now, to handle the hash the page may have loaded with.
  $(window).hashchange(); 
});

7 个答案:

答案 0 :(得分:2)

您可以简单地使用IE条件注释来加载特定样式:

<!--[if IE]>
  a:visited {
     padding-left: 8px;
     background: url(images/checkmark.gif) no-repeat scroll 0 0;
}
<![endif]-->

答案 1 :(得分:0)

为什么不设置仅供IE使用的代码块来设置隐藏输入标记的值以反映点击行为。如果单击一个链接,您可以将输入标记的值设置为等于该链接ID,并允许您更新元素类以反映更改。

HTML if IE
<input type="hidden" id="clicked_link" />


JQuery JS if IE
$(function() {
    $(a).click(function() {
        $(this).attr('id').addClass('visited_link_class');
    });
});

CSS
.visited_link_class { color:#your color;}

答案 2 :(得分:0)

也许如果您在将其附加到文档之前创建正确的元素并构建DOM片段。

不确定它是否会起作用,无法在此进行测试,但这是我尝试调整您的代码。

$(function(){
  // Bind an event to window.onhashchange that, when the hash changes, gets the
  // hash and adds the class "selected" to any matching nav link.
  $(window).hashchange( function(){
    alert("Hash changed to:"+location.hash);  
    var hash = location.hash;
    // Set the page title based on the hash.
    document.title = 'The hash is ' + ( hash.replace( /^#/, '' ) || 'blank' ) + '.';
    //simulate body being rendered by ajax callback 
      if(hash == ""){  
        $("body").html(
          $("<p>").id("nav")
            .append($("<a>")
              .attr("href","#test1")
              .text("teste 1"))
            .append($("<a>")
              .attr("href","#test2")
              .text("test 2"))
            .append($("<a>")
              .attr("href","#test3")
              .text("test 3"))
        );
      }
      else{
        $("body").text("Right click within this pane and select \"Back\".");  
      }
  })
  // Since the event is only triggered when the hash changes, we need to trigger
  // the event now, to handle the hash the page may have loaded with.
  $(window).hashchange(); 
});

答案 3 :(得分:0)

尝试考虑css LVHA角色,这意味着标签伪类的顺序很重要。

第一次定义这些类:

  • A:link
  • A:已访问
  • A:悬停
  • A:活性

如果这仍然无法解决您的问题,您可以使用另一个js路由器(hashchange):https://github.com/flatiron/director 我经常使用这个,它在很多情况下都能很好地工作。

答案 4 :(得分:0)

一个选项是使用HTML5历史记录API伪造浏览器历史记录。这种方式只有在删除浏览器历史记录后,链接才会被“取消访问”。

喜欢说on this useful page

  上面的

[...]方法用地址栏中的URL切换出来   '/ hello'尽管没有请求资产且窗口仍然存在   同一页面。但这里有一个问题。击中后面   按钮我们会发现我们没有返回到本文的URL但是   相反,我们会回到之前的任何页面。这是   因为replaceState不会操纵浏览器的历史记录   只需替换地址栏中的当前URL即可。

所以,就像在该页面上提到的那样,你必须做一个:

history.pushState(null, null, hash);

答案 5 :(得分:0)

 You can simply use IE conditional comments to load a specific style:    
<!--[if IE]>
      a:visited {
         padding-left: 8px;
         background: url(images/checkmark.gif) no-repeat scroll 0 0;
    }
<![endif]-->

答案 6 :(得分:-1)

这是ie中的安全功能。在许多现代浏览器中,访问的功能受到限制,以防止CSS利用。 因此,这个问题没有解决方法。