javascript - 页内 anchor 链接的两个脚本之间的冲突

标签 javascript jquery html css

我有两个小脚本,单独工作时没有问题。

但是,当它们一起出现在同一文档中时,它们无法正常工作。

脚本 #1:启动模态对话框

我网站上的所有页面都有指向以下功能的链接:

  • 登录页面
  • 联系页面
  • 电子邮件注册

当用户点击其中一个链接时,会出现一个灯箱,并且相关的模式会滑入。

为了防止页面在灯箱处于事件状态时在后台滚动,我有这个脚本:

$(document).ready(function(){
    $("[href$='#contact'],[href$='#email'],[href$='#login']").click(function(){
      $("body").addClass("noscroll");
    });
    $("a[href$='#close']").click(function(){
      $("body").removeClass("noscroll");
    });    
});

CSS 很简单:

.noscroll {
    overflow: hidden;
}

据我所知,这个功能完美无缺。

脚本 #2:平滑滚动

我有几个内容很长的网页(例如,服务条款、隐私政策等)

为了使这些页面更加用户友好,我在顶部添加了目录。 TOC 中的每一项都是指向页面相关部分的 anchor 链接。

例子:

目录

<ol>
    <li><a href="terms-of-service/#copyrights">Copyrights</a></li>
    <li><a href="terms-of-service/#trademarks">Trademarks</a></li>
    <li><a href="terms-of-service/#indemnification">Indemnification</a></li>
</ol>

内容

<h3 id="trademarks">Trademarks</h3>
    <p> text text text </p>

页内链接的标准行为是立即跳转到内容。为了更优雅的体验,我添加了平滑的滚动效果:

$('a[href*="\\#"]').on('click', function(event){     
    event.preventDefault();
    $('html,body').animate({scrollTop:$(this.hash).offset().top}, 500);
});

与脚本 #1 一样,这似乎工作得很好。

但是,当这两个脚本同时出现在页面上时,一切都无法正常工作。

没有控制台错误。主要问题是模态脚本激活了 CSS(滚动条消失),但没有启动灯箱。

这两个脚本如何协同工作?

最佳答案

这应该可以做到。但是,我盲目地编码了它。如果它不起作用,我可以在实际示例中对其进行测试,以查看它失败的地方。不过,它应该可以工作。它的作用很简单:如果按下其中任何一个,它会跳过平滑滚动:(#contact, #email, #login#close)。

$(document).ready(function(){
  $("[href$='#contact'],[href$='#email'],[href$='#login']").click(function(){
    $("body").addClass("noscroll");
  });
  $("a[href$='#close']").click(function(){
    $("body").removeClass("noscroll");
  });    
  $('a[href*="\\#"]').on('click', function(event){
    var href = $(event.target).closest('a').attr('href'), 
        exceptions = ['#contact', '#email', '#login', '#close'], 
        skip = false;
    for (i = 0; i < exceptions.length; i++) {
      if (href.indexOf(exceptions[i]) > -1) {
        skip = true;
      }
    }
    if (!skip) {
      event.preventDefault();
      $('html,body').animate({scrollTop:$(this.hash).offset().top}, 500);
    }
  });
});

注意。上面的脚本结合了您在问题中显示的两个脚本,应该替换它们。

关于javascript - 页内 anchor 链接的两个脚本之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182130/

相关文章:

javascript - 图像在 mouseenter 事件 JQuery 上不断闪烁

javascript - 通过每个元素中的键之一对JS中的对象进行排序

javascript - 为什么我的汉堡包菜单在两次屏幕大小调整后切换两次而不是只切换一次?

javascript - Gulp 没有将文件输出到构建文件夹中的正确文件夹

javascript - 如何捕获 Select2 下拉菜单上的滚动事件?

javascript - CSS 选择器查找其中一个子元素具有特定文本值的元素

javascript - 用于模糊图像的简单 JavaScript 函数

javascript - 重置 setTimeout

javascript - 从特定元素中删除 jQuery 元素验证

html - 限制空间文本可以占用一个 div