【问题标题】:Javascript Tabs - How to add hashtags on URL?Javascript 标签 - 如何在 URL 上添加主题标签?
【发布时间】:2019-05-30 10:04:56
【问题描述】:

我的标签工作正常,但我需要有一个单独的函数,它通过一个 URL 指向标签,所以我可以为每个标签有一个单独的链接。

我怎样才能做到这一点?

url.com/#tab1

url.com/#tab2

我尝试了很多方法,但总是收到未定义的标签。我想请教一下,我整理了一个演示,展示了完整的工作经验。

var boxLink = $( '.but' );
var box = $( '.tab' );

boxLink.click( function() {
	$('#but1').removeClass('active');
 
    var boxID = $(this).attr("data-target");
    var currentbox = $('.tab:not(.is-hidden)');
    var targetBox = $('.tab#' + boxID);
    
    if (!$(this).hasClass('active'))    {
        boxLink.removeClass('active');
        $(this).addClass('active');

        TweenMax.to( currentbox, 0.2, {ease:Power4.easeOut, className: '-=visible', autoAlpha: 0,  onComplete: boxIn, onCompleteParams: [targetBox] });
    }
    
    return false;
});

var boxIn = function( targetBox ) {
    box.addClass( 'is-hidden' );
    targetBox.removeClass( 'is-hidden' );
    
    TweenMax.to( targetBox, 0.2, {autoAlpha: 1,className: '+=visible', ease:Power4.easeIn});
}
body {
  background-color:black;
 }
#tab01 {
background: white;
}

#tab02 {
background: red;
} 
 
.tab {
width:100px;
height:100px;
font-size:30px;
line-height:100px;
text-align:center;
}
.is-hidden {
  display: none;
  opacity:0;
  visibility:hidden;
} 

button {
  cursor:pointer;
  padding: 5px;
  margin-top: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/TweenMax.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="tab" id="tab01">one</div>
<div class="tab is-hidden" id="tab02">two</div>

<button  class="but active" id="but1" data-target="tab01">slide 1</button>
<button  class="but" id="but2" data-target="tab02">slide 2</button>

【问题讨论】:

  • 您只想在 URL 中添加#divId 吗?还是别的什么?
  • 我需要使用 url 直接导航到特定选项卡。喜欢:google.com/#tab2,因此 tab2 将处于活动状态。也许是另一个更语义化的名称。喜欢页面名称的标题
  • @Bharat Bhushan 你能帮忙吗?
  • 对不起,伙计,我昨天下班了。如果您没有找到解决方案,请告诉我

标签: javascript jquery gsap


【解决方案1】:

如果我没听错的话,你想在加载时显示一个特定的标签,以防页面的 URL 中添加了一个哈希,对吗?如果是这样,您应该解析 window.location.href 并检查 URL 中的哈希标记。如果存在,则哈希值,例如'#tab2' 应该显示具有相同 ID 的容器。

更新代码:

var currentUrl= window.location.href;
if (currentUrl.indexOf('#') > -1) {
  var hashTag= currentUrl.substring(currentUrl.indexOf('#')+1);
  var targetBox = $('.tab#' + hashTag);
  TweenMax.to( currentbox, 0.2, {ease:Power4.easeOut, 
    className: '-=visible', autoAlpha: 0,  onComplete: boxIn, onCompleteParams: [targetBox] });

  // added: highlight the proper buttons and remove the default "active" element
  $('.active').removeClass('active');
  $('.' + hashTag + '-control').addClass('active');
}

要同时突出显示按钮,您需要给它们一个类(这是最简单的方法,因为您不能使用重复的 ID,因此我们通过 ID 识别选项卡,通过类识别按钮):

<button  class="tab01-control but active" id="but1" data-target="tab01">slide 1</button>
<button  class="tab02-control but" id="but2" data-target="tab02">slide 2</button>

您的boxIn(targetBox) 方法期望接收一个jQuery 对象作为“targetBox”参数,它是一个字符串。当您在本地测试 URL 时,只需将“#tab02”附加到您的 URL 即可显示第二个选项卡。

旁注:

您的代码 sn-p 当前无法正常工作,您应该包括...

<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/TweenMax.min.js"></script>

... 使您的动画按预期工作,否则在单击其中一个按钮时会收到 JS 错误消息。

编辑 1

当您询问如何使用有意义的“哈希名称”而不是控件的 ID(如 tab01)时,这可以通过简单的 switch-case 来实现:

let hashTag = window.location.hash;
if (hashTag !== '') {
    hashTag = hashTag.substring(1);

    let targetName = '';

    switch (hashTag) {
        case "home":
            targetName = 'tab01';
            break;
        case "profile":
            targetName = 'tab02';
            break;
    }
    if (targetName !== '') {
        var targetBox = $('.tab#' + targetName);
        ...
    }

【讨论】:

  • 谢谢 你测试了吗?它有效吗?你能做一个演示吗?好像不行
  • @user173420 我更新了上面的代码示例,请再试一次。我在本地对其进行了测试,效果很好。
  • 转到您的浏览器网址栏并在其末尾添加#fun。现在打开开发者控制台并输入window.location.hash
  • @Taplar 谢谢你的提示,我不知道有location.hash
  • @Taplar 绝对;-)
猜你喜欢
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 2014-07-14
  • 1970-01-01
  • 2014-07-14
相关资源
最近更新 更多