【问题标题】:Preventing anchor from jumping on page load防止锚在页面加载时跳转
【发布时间】:2013-10-18 15:50:55
【问题描述】:

我目前在我的 wordpress 页面上使用“平滑滚动”,并且我试图让页面从我想要的外部链接(使用锚点(#portfolio)从那里平滑滚动到请求的部分从顶部开始的页面,然后滚动到投资组合部分。

发生的情况是它会短暂显示“投资组合部分”(锚点跳转),然后重置到顶部并向下滚动。

代码

$(function() {
    $('.menu li a').click(function() {
    if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) {
    var target = $(this.hash);
    target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
    if (target.length) {
        $root.animate({
        scrollTop: target.offset().top - 75
        }, 800, 'swing');
            return false;  
            }
        }
    });
});

页面加载

$(window).on("load", function() {
if (location.hash) { // do the test straight away
    window.scrollTo(0, 0); // execute it straight away
    setTimeout(function() {
    window.scrollTo(0, 0); // run it a bit later also for browser compatibility
    }, 1);
}
var urlHash = window.location.href.split("#")[1];
if (urlHash && $('#' + urlHash).length)
    $('html,body').animate({
    scrollTop: $('#' + urlHash).offset().top - 75
    }, 800, 'swing');
});

如何防止页面加载时出现的“跳跃”?

HTML - 导航链接(使用虚拟链接)

<a href="link.com/#portfolio>portfolio</a>

HTML - div

<div id="portfolio></div>

【问题讨论】:

  • 设置的超时使其在其他代码触发后跳转到顶部...
  • 问题是link.com/#portfolio对浏览器有意义——在这个位置打开。您无法更改浏览器,因此它在此位置启动,然后运行您的 jovascript。
  • 嗨,霍根,我以前见过这种做法。显然它不是使用我正在做的方法完成的,还有这个吗?我的谷歌整个早上都让我失望了。是否有一些我缺少的工作?感谢您回答我的问题。
  • 如果这是我能做到的最好的,请告诉我。我只是想确保没有其他选择。
  • 在页面加载时根据 location.hash 跳转到元素是默认浏览器行为,我认为您无法覆盖它。

标签: javascript jquery html


【解决方案1】:

您可以通过更改锚点来规避浏览器行为,以便它携带一些页面访问独有的附加文本。在下面的示例中,我已将前六行添加到您的函数中以设置 AnchorSeed 变量,然后在您分配 urlHash 变量时使用该变量:

$(window).on("load", function() {
    var AnchorSeed = new Date() * 1;
    $( ".AnchorUpdate" ).each(
        function() {
            $( this ).attr( "id", this.id + AnchorSeed );
        }
    );
    if (location.hash) { // do the test straight away
        window.scrollTo(0, 0); // execute it straight away
        setTimeout(function() {
            window.scrollTo(0, 0); // run it a bit later also for browser compatibility
        }, 1);
    }
    var urlHash = window.location.href.split("#")[1] + AnchorSeed;
    if (urlHash && $('#' + urlHash).length)
        $('html,body').animate({
        scrollTop: $('#' + urlHash).offset().top - 75
        }, 800, 'swing');
});

您需要将 AnchorUpdate 类添加到您可能跳转到的任何页面元素,以便 jQuery 例程可以找到它并使用 AnchorSeed 值更新其 id。在这种情况下,我们知道“portfolio”就是这样一个链接,因此将其修改为:

<div class="AnchorUpdate" id="portfolio></div>

这样做的效果是 id 将从“portfolio”更改为“portfolio1382124849780”之类的内容(当然,这取决于页面加载时的时间戳)。

因为页面完成加载后 id “portfolio”将不存在(即使它是源 HTML 的一部分),所以浏览器不应反弹到它。

我完全使用 JavaScript,因为我不知道您是否可以访问服务器变量。如果你这样做,我认为它们可能是一个更可取的解决方案,因为代码将更具可读性。如果可能,您可以使用页面计数器变量,或者只是服务器端时间戳。

编辑:

在您提到的 cmets 中,这适用于外部链接,但它破坏了内部链接。我现在没有时间设置测试,但我认为添加一个 jQuery 例程来更新类似于上面所做的那些内部链接是可行的。例如,您的内部链接是:

<a href="#InternalLink">Jump to Internal Link</a>

你可以给它一个不同的类来表明它需要更新:

<a class="InternalLinkUpdate" href="#InternalLink">Jump to Internal Link</a>

然后使用 jQuery 触发对该类的类似修改:

$( ".InternalLinkUpdate" ).each(
    function() {
        $( this ).attr( "href", $( this ).attr( "href" ) + AnchorSeed );
    }
);

(由于我目前无法从工作代码中复制,我可能在上面犯了标点错误或类似的错误——但它不应该花太多的修补才能让它正常工作。

【讨论】:

  • 嗨,乔,感谢您的回复。将尝试并报告!
  • 嗨,乔,它似乎不起作用。事实上,当它来自另一个页面时,它会破坏滚动功能。它仍然可以在主页上使用。我知道您要做什么,尽管我会对其进行修改以查看是否可以使其正常工作。感谢您的帮助!
  • 这很奇怪。你没有说你正在测试哪个浏览器——但它在 Chrome 和 Firefox 中对我有用。 (由于与脚本无关的原因,我无法测试 Internet Explorer,而且我没有安装 Safari。)
  • 嗨,乔,我使用的是最新版本的 Chrome。所以你是说当你测试它时,它不会跳转并且在页面加载后它会滚动到选定的部分?如果是这样,那可能是我的错误。
  • 是的——这是我的经验。但我不知道为什么我们的 Chrome 版本会有不同的行为。
猜你喜欢
  • 1970-01-01
  • 2011-04-09
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2016-08-14
  • 1970-01-01
相关资源
最近更新 更多