问号“?”在锚 link

Question mark '?' in anchor link

我这里有 jsfiddle 来说明我的问题。

https://jsfiddle.net/morettmt/psh674k7/69/

我有一个带锚点 link 的导航到页面中的块(它工作不完美,但这不是问题所在)。

这是在 WordPress 站点中实际使用的,其中块和 links 是由后端的内容管理器创建的。

我的问题是 link 如果有问号 '?' 之类的字符则无法正常工作在里面。

如果 link.

中有问号,为什么这不起作用
.block{
    background: #ddd;
    height: 300px;
    margin: 0 0 10px 0;
    padding: 10px;
}

在您的 HTML 中,删除 a 标签上 href 的问号:

<nav>
    <ul>
        <li><a href="#one" class="js-sticky-link">One</a></li>
        <li><a href="#two" class="js-sticky-link">Two</a></li>
        <li><a **href="#three"** class="js-sticky-link">Three?</a></li>
        <li><a href="#four" class="js-sticky-link">Four</a></li>
        <li><a href="#five" class="js-sticky-link">Five</a></li>
    </ul>
</nav>

此外,删除 divid 的问号:

<div class="col-sm-12">
    <div class="three block" **id="three"**>
        <h2>Three</h2>
    </div>

我在更改的地方添加了星星。

要使 link 与脚本一起工作,您需要转义问号以便它作为选择器工作:

<a href="#three\?" class="js-sticky-link">Three?</a>

但是,如果回退到使用本机书签,这会使它失败。为此,您可以 URL 将问号编码为 %3f:

<a href="#three%3f" class="js-sticky-link">Three?</a>

然后为了使脚本工作,它应该将 URL 编码的书签转换为转义的选择器:

$('html, body').animate({
  'scrollTop': $($(this).attr('href').replace(/%3f/ig, '\?')).offset().top-navHeight
}, 1000);

这里是fiddle实现的地方。我还添加了一个 link 用于打开和关闭动画,以便您可以测试回退行为:https://jsfiddle.net/Guffa/psh674k7/83/

要使其适用于任何字符,您可以使用 decodeURIComponent 方法对字符串进行 URL 解码,然后转义任何需要转义以使其在选择器中起作用的字符,如this question.

中显示