【问题标题】:Highlight active (opened) link突出显示活动(打开)链接
【发布时间】:2014-04-24 04:18:11
【问题描述】:

我想突出显示活动(打开的)链接。此颜色必须在链接打开时始终保持。不仅在鼠标单击或悬停时。

这是我尝试过的 JS 方式:

<script type="text/javascript">
    $(document).ready(function(){
     $("a.nav1").click(function () {
      $(".active").removeClass("active");
        $(this).addClass("active");
      });
    });
</script>

html 链接:

 <div id="navigation">              
          <ul>
          <li><a class="nav1" data-tab="#home" id="link-home"href="#home">Home</a></li>
          <li><a class="nav1" data-tab="#football" id="link-football" href="#football">Football</a></li>
          <li><a class="nav1" data-tab="#hockey" id="link-hockey"href="#hockey">Hockey</a
</li>
          </ul>
     </div>

它可以工作,但问题在于刷新和返回按钮。它不会将此颜色更改为上一个链接。 使用其他 JS 方式我遇到了同样的问题。

只有使用 css 才行不通。例如:

  <div id="navigation">             
              <ul>
              <li><a class="nav1" data-tab="#home" id="link-home"href="#home">Home</a></li>
              <li><a class="nav1" data-tab="#football" id="link-football" href="#football">Football</a></li>
              <li><a class="nav1" data-tab="#hockey" id="link-hockey"href="#hockey">Hockey</a
    </li>
              </ul>
         </div>

和 CSS

#home .nav1 {
    color: #000;
    background-image:url(farba3.png);
 }
#football .nav1 {
    color: #000;
    background-image:url(farba3.png);
 }
#hockey .nav1 {
    color: #000;
    background-image:url(farba3.png);
 }

【问题讨论】:

  • 为什么不使用a:visited 伪?据我所知,即使在页面刷新后它仍然存在。
  • @Homungus:这对 OP 有什么帮助?
  • @LéoLam:我以为他想突出显示访问/打开的链接,不是吗?这就是样式伪a:visited 所做的。
  • a:visited 最终会突出显示所有链接,如果用户单击(这意味着访问)所有链接。
  • 不,这不是我想要的。 a:visited 更改颜色访问的链接,但我想更改颜色打开的链接(特定颜色必须在链接打开时保持)

标签: javascript jquery html css highlight


【解决方案1】:

您需要监听哈希更改事件 (window.onhashchange),并相应地更改活动链接。

这是一个例子:

function locationHashChanged() {
    $('.nav1').removeClass('active'); // remove the active class from all elements
    $('.nav1[href="' + location.hash + '"]').addClass('active'); // add the active class to the element whose href equals the new fragment identifier ("hashtag")
}

window.onhashchange = locationHashChanged; // listen for hash change event
locationHashChanged(); // add the active class to the appropriate link on initial page load

然后,在您的 CSS 中,您将为具有 .active 类的列表项添加规则。

想试试吗? There you go.

请注意,history API 是可用的,它允许使用干净、漂亮的 URL。为什么不使用它?使用片段标识符已经过时,对于那些碰巧禁用了 JS 的人来说并不好。

如果你真的想使用历史 API 并且担心browser support,你可以使用history.js,这使得即使在不支持它的浏览器上也可以使用历史 API。有关详细信息,请参阅存储库。

【讨论】:

  • @Fakt7:这对你有帮助吗?只是想知道这是否对您有帮助,如果没有,我会尝试改进答案。
  • @Fakt7:我已经编辑了代码,所以它现在在初始页面加载时将活动类添加到适当的链接。我还添加了一个活生生的例子。
【解决方案2】:

尝试使用 cookie 或 localStorage,您可以在其中编写点击链接并在页面加载时阅读。为此有几个 jQuery 插件,例如 Storage API

【讨论】:

  • 本地存储/会话存储解决刷新按钮问题。HistoryAPI 解决后退按钮问题,但这不是一个好主意。有不良浏览器支持。
  • 因为 HTTP 是无状态的,我害怕刷新某种存储,无论如何你都需要。而对于 Back 我有一些模糊的想法,比如设置一个计时器并检查一些属性,比如滚动位置或可见性/显示(以找出应该突出显示的链接)...... - 但当然这是一个令人讨厌且非常低效接近。
  • 好的,我发现了另一个问题,所以我必须使用 HistoryAPI。但怎么做。我试过 window.history.back();但没有结果
  • 通过history.pushState(state_data_JSON, pageTitle, pageURL)调用它;并通过 window.addEventListener("popstate", function(e) {});对于“后退”,应该可以使用 window.history.back();或 window.history.go(-1);您可以在 diveintohtml5.info/history.html 上找到示例
  • @Fakt7:我已经更新了我的答案,提到了一个基于历史 API 的解决方案,适用于不支持它的浏览器。
猜你喜欢
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 2016-11-19
  • 2016-11-27
  • 2017-07-06
  • 1970-01-01
相关资源
最近更新 更多