【问题标题】:Selecting the anchor tag of a particular href using jQuery使用 jQuery 选择特定 href 的锚标记
【发布时间】:2020-03-29 05:41:59
【问题描述】:

目标

刷新浏览器后,我希望用户停留在刷新前的菜单/内容中。

问题

刷新浏览器后,用户在刷新之前所在的特定菜单的内容显示为活动的(即显示在屏幕上)。但是,该特定内容的菜单图标未显示为活动状态(即它不显示黑色)。

我正在努力选择当前href 的锚元素(找到图标的位置)(刷新前用户所在的位置,刷新后相同)时间>。

尝试

$(document).ready(function() {

        $('a[class^=menu]').click(function() {
          $('a[class^=menu]').removeClass('active');
          $('div[class^=content]').removeClass('active');

          if($(this).hasClass('menu-1')) {
            $('.menu-1').addClass('active');
            $('.content-1').addClass('active');
          }

          if($(this).hasClass('menu-2')) {
            $('.menu-2').addClass('active');
            $('.content-2').addClass('active');
          }

          if($(this).hasClass('menu-3')) {
            $('.menu-3').addClass('active');
            $('.content-3').addClass('active');
          }
        });

        if (window.location.hash.substr(1) != '') {
          $('a[class^=menu],div[class^=content]').removeClass('active');

          // making the content active
          $('#' + window.location.hash.substr(1)).addClass('active');

          // making the menu active
          $('a[href="' + window.location.hash.substr(1) + '"]').addClass("active");

        }

      });
    .container {
      margin: 0 auto;
      background-color: #eee;
      border: 1px solid lightgrey;
      width: 20vw;
      height: 90vh;
      font-family: sans-serif;
      position: relative;
    }

    header {
      background-color: lightgreen;
      padding: 5px;
      text-align: center;
      text-transform: uppercase;
    }

    .bottom-navbar {
      position: absolute;
      bottom: 0;
      width: 100%;
      padding: 6px 0;
      overflow: hidden;
      background-color: lightgreen;
      border-top: 1px solid var(--color-grey-dark-3);
      z-index: 50;
      display: flex;
      justify-content: space-between;
    }

    .bottom-navbar>a {
      display: block;
      color: green;
      text-align: center;
      text-decoration: none;
      font-size: 20px;
      padding: 0 10px;
    }

    .bottom-navbar>a.active {
      color: black;
    }

    .menu-1.active,
    .menu-2.active,
    .menu-3.active {
      color: black;
    }

    .content-1,
    .content-2,
    .content-3 {
      display: none;
    }

    .content-1.active,
    .content-2.active,
    .content-3.active {
      display: block;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translateX(-50%) translateY(-50%);
    }
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css">
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

 
 <div class="container">
    <header>My header</header>
    <div class="main-content">
      <div class="content-1 active" id="firstPage">House content</div>
      <div class="content-2" id="secondPage">Map content</div>
      <div class="content-3" id="thirdPage">Explore content</div>
      <div class="bottom-navbar">
        <a href="mywebsite#firstPage" class="menu-1 active"><i class="fa fa-home"></i></a>
        <a href="mywebsite#secondPage" class="menu-2"><i class="fa fa-map"></i></a>
        <a href="mywebsite#thirdPage" class="menu-3"><i class="fa fa-search"></i></a>
      </div>
    </div>
 </div>

感谢您的帮助和建议。

【问题讨论】:

  • 如果 menu-xcontent-x 三个类都具有相同的 css 属性,为什么还要它们呢?选择它们会更容易,因为它们只是被称为 menucontent。如果您想在 DOM 中专门识别它们,请使用 idname
  • 在本地存储或会话存储中设置值,如果数据不敏感,则在重新加载时使用该值
  • @user6250770 还有,您介意澄清一下“如果数据不敏感”是什么意思吗?
  • jsfiddle.net/Guruprasad_Rao/9kedou2q/1 关注此以了解有关设置和从本地存储获取数据的更多信息
  • 敏感数据意味着,如果它不影响您的业务。本地存储就像任何人都可以在任何浏览器的控制台中看到数据一样。

标签: javascript jquery href fragment-identifier location-href


【解决方案1】:

您遇到的问题是您正在寻找错误的href

你试图找到a[href="secondPage"],但它应该是a[href="mywebsite#secondPage"]

我还更改了您选择课程并将其添加为活动的方式。这种方式更有活力。

注意:在JS文件中,有一个变量叫hash,现在它指向#secondPage为了假装我们在第二页,你可以改变它的值,重新运行它将选择一个新的活动项目。您只需要将hash 替换为window.location.hash,我也将其取出到变量中,因此您不必每次都调用它。

// just replace this with "window.location.hash"
const hash = "#secondPage";
$(document).ready(function() {

  $('a[class^=menu]').click(function() {
    // we remove the active classes.
    $('a[class^=menu]').removeClass('active');
    $('div[class^=content]').removeClass('active');

    // we get the item that was clicked and select the item
    // in a dynamic way.
    const clickedClass = $(this).attr('class');
    const [identifier, number] = clickedClass.split('-')

    $(`.${clickedClass}`).addClass('active');
    $(`.content-${number}`).addClass('active');

  });


  const active = hash.substr(1);
  if (active != '') {
    $('a[class^=menu],div[class^=content]').removeClass('active');


    // making the content active
    $(`#${active}`).addClass('active');


    // making the menu active
    $(`a[href="mywebsite#${active}"]`).addClass("active")

  }

});
.container {
  margin: 0 auto;
  background-color: #eee;
  border: 1px solid lightgrey;
  width: 20vw;
  height: 90vh;
  font-family: sans-serif;
  position: relative;
}

header {
  background-color: lightgreen;
  padding: 5px;
  text-align: center;
  text-transform: uppercase;
}

.bottom-navbar {
  position: absolute;
  bottom: 0;
  width: 100%;
  padding: 6px 0;
  overflow: hidden;
  background-color: lightgreen;
  border-top: 1px solid var(--color-grey-dark-3);
  z-index: 50;
  display: flex;
  justify-content: space-between;
}

.bottom-navbar>a {
  display: block;
  color: green;
  text-align: center;
  text-decoration: none;
  font-size: 20px;
  padding: 0 10px;
}

.bottom-navbar>a.active {
  color: black;
}

.menu-1.active,
.menu-2.active,
.menu-3.active {
  color: black;
}

.content-1,
.content-2,
.content-3 {
  display: none;
}

.content-1.active,
.content-2.active,
.content-3.active {
  display: block;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translateX(-50%) translateY(-50%);
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>


<div class="container">
  <header>My header</header>
  <div class="main-content">
    <div class="content-1 active" id="firstPage">House content</div>
    <div class="content-2" id="secondPage">Map content</div>
    <div class="content-3" id="thirdPage">Explore content</div>
    <div class="bottom-navbar">
      <a href="mywebsite#firstPage" class="menu-1 active"><i class="fa fa-home"></i></a>
      <a href="mywebsite#secondPage" class="menu-2"><i class="fa fa-map"></i></a>
      <a href="mywebsite#thirdPage" class="menu-3"><i class="fa fa-search"></i></a>
    </div>
  </div>
</div>

【讨论】:

  • 谢谢。但是,现在第一次打开浏览器或刷新浏览器时,内容和菜单都不会显示为活动状态...
  • @Joehat 我刚刚将整个代码复制到一个新的 index.html 以在本地对其进行测试,它运行良好。 /index.html#firstPage 选择第一个内容和第一个图标 /index.html#secondPage 选择第二个内容和第二个图标,实际上/index.html#thirdPage 选择第三个内容和第三个图标。您是否更改了我放在 JS 文件顶部的 hash 变量?
  • 我实际上输入了“window.location.hash”而不是window.location.hash,这就是它不起作用的原因。谢谢!
  • 您介意澄清一下您使用 ` 而不是 ' 或 "吗?我是第一次看到它吗...
  • 基本上,使用`可以在字符串中添加一个变量,例如: var myName = 'foo' console.log(my name is: ${foo}) 与:console.log('my名称是:' + foo) 变量总是在 ${ } .... 我使用它,因为对我来说它使一切更容易阅读,比较你的: $('a[href="' + window.location. hash.substr(1) + '"]') 来挖掘:$(a[href="mywebsite#${active}"]) 看到区别了吗?更少的代码,更少的错误哈哈。
【解决方案2】:

这听起来像你想在导航中添加一个类,如果它与当前页面 url 相同?

如果您想在客户端执行此操作,则可以这样做。 这也可以由服务器处理(php/c#)

$(function(){
    var current = location.pathname;
    $('#nav li a').each(function(){
        var $this = $(this);
        // if the current path is like this link, make it active
        if($this.attr('href').indexOf(current) !== -1){
            $this.addClass('active');
        }
    })
})

类似的线程/问题 - 来自 Rob M Add Active Navigation Class Based on URL 的回答者

【讨论】:

  • 这使得刷新后的所有图标都处于活动状态,而不仅仅是刷新前处于活动状态的图标......关于如何改进它以获得我的目标的任何建议?
  • 你能告诉我链接的href吗?它们都是相同的 url 但不同的哈希值还是查询字符串?
  • 它们的 URL 相同,但哈希值不同。根据您的回答,如果我没记错的话,链接确实有效,即刷新浏览器后,链接与刷新浏览器之前的菜单/内容相关。 @PrinceHernandez 的回答解决了我的问题。但是,知道另一种方法不会有什么坏处。如果您能帮助我理解您的建议没有奏效的原因,我将不胜感激。
  • 我的建议假设不同的 url,它将 href 与 location.pathname 匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多