当前位置: 首页 > 知识库问答 >
问题:

当URL中存在哈希时,防止浏览器滚动到元素,但将其保留在URL中

澹台浩广
2023-03-14

我有一些按钮加载问题和答案(这是一个常见问题)。 单击按钮时,我使用window.location.hash设置URL中的哈希值,以获得人们可以复制的URL,因此稍后我可以自动打开按钮,其中包含问题,例如:website.nl/FAQ#category1

问题是当一个按钮被点击并设置了散列后,浏览器瞬间滚动到该按钮,这不是我想要的。 我怎么才能关掉它?

这是我当前的代码:

if(window.location.hash) {
    var hash = window.location.hash.substring(1); //Puts hash in variable, and removes the # character
    $('#' + hash).addClass('activeblok');
    } else {

}

const $blokje = $('.klantenblokje');
$blokje.on("click", function(e) {
    e.preventDefault();
    var id = $(this).attr('id');
    $blokje.not(this).removeClass('activeblok');
    $(this).addClass('activeblok');
        window.location.hash = id;
        // Ajax post which retrieves the questions
        $.ajax({
         type:'post',
         url:"includes/faqresult.php",
         data:{id: id},
         success:function(data){
             $( "#faqresult" ).show().empty().append( data );
         }
     });
});

和我的HTML:

<div class="col-md-2 col-6">
  <a href="#bezorgen" id="bezorgen" class="klantenblokje">
    <i class="icon-transport"></i>
    <span>Bezorgen</span>
  </a>
</div>
<div class="col-md-2 col-6">
  <a href="#bestellen" id="bestellen" class="klantenblokje">
    <i class="icon-cart"></i>
    <span>Bestellen</span>
  </a>
</div>
<div class="col-md-2 col-6">
  <a href="#betalen" id="betalen" class="klantenblokje">
    <i class="icon-euro"></i>
    <span>Betalen</span>
  </a>
</div>
<div class="col-md-2 col-6">
  <a href="#uploaden" id="uploaden" class="klantenblokje">
    <i class="icon-upload"></i>
    <span>Bestanden uploaden</span>
  </a>
</div>
<div class="col-md-2 col-6">
  <a href="#garantie-reparatie" id="garantie-reparatie" class="klantenblokje">
    <i class="icon-box"></i>
    <span>Garantie en reparatie</span>
  </a>
</div>
<div class="col-md-2 col-6">
  <a href="#account" id="account" class="klantenblokje">
    <i class="icon-user"></i>
    <span>Account</span>
  </a>
</div>

我从另一个问题中尝试过,但没有结果:

if (location.hash) {
  setTimeout(function() {

    window.scrollTo(0, 0);
  }, 1);
}

共有2个答案

狄宇
2023-03-14

滚动取决于元素的id。 您可以尝试通过数据属性来标识元素(id更好用于标识,因为它应该是唯一的,但在您的情况下,使用数据会有帮助)。

如果你改变

<div class="col-md-2 col-6">
  <a href="#bezorgen" id="bezorgen" class="klantenblokje">
    <i class="icon-transport"></i>
    <span>Bezorgen</span>
  </a>
</div>

<div class="col-md-2 col-6">
  <a href="#bezorgen" data-name="bezorgen" class="klantenblokje">
    <i class="icon-transport"></i>
    <span>Bezorgen</span>
  </a>
</div>

并更改脚本以查找属性中的特定数据

$('*[data-name='+hash+']').addClass('activeblok');

并添加到url

var id = $(this).data('name'); 
林玮
2023-03-14

您可以通过使用HTML5历史API及其pushstatereplaceste方法来实现这一点。

history.pushState(true, '', '#your-hash')

history.replaceState(true, '', '#your-hash')

这两种方式都将更改地址栏中显示的URL,但不会跳转到页面中的元素,滚动位置将保持不变。

两者的区别在于,第一个将在浏览器历史记录中创建一个新条目,而第二个将覆盖当前条目--因此,这将影响用户之后单击浏览器中的“后退”按钮时所发生的情况。 如果您更改了五次哈希,但不希望用户必须单击六次back按钮才能返回到上一页,那么使用ReplaceState

 类似资料:
  • 问题内容: 如果转到页面a并滚动浏览,则刷新页面将在您离开页面的位置刷新。这很好,但是在URL中存在锚点位置的页面上也会发生这种情况。例如,如果您单击一个链接并在环顾四周后刷新页面,您将不会处于锚点,而页面会跳来跳去。有什么办法可以防止使用javascript吗?因此,无论如何,您始终可以导航到锚点。 问题答案: 由于浏览器行为的更改,不再建议使用此解决方案。查看其他答案。 基本上,如果使用锚,则

  • 问题内容: 我有一个模态框窗口(弹出窗口),其中包含一个iframe, 并且在该 iframe中 有一个可滚动的 div 。 当我滚动iframe的内部DIV,并且达到其上限或下限时, 浏览器本身的窗口就会开始滚动。这是 不想要的行为 。 我已经尝试过类似的操作, 当鼠标进入弹出框区域时,该操作会在onMouseEnter时终止主窗口滚动: e.preventDefault()由于某些原因无法正常

  • 问题内容: 我有一个“浮动工具箱”-的div 。效果很好。 但是,当在该框内滚动(使用鼠标滚轮)并到达底部或顶部时,父元素将“接管”“滚动请求”:工具箱后面的文档将滚动。 -这很烦人,而不是用户的“要求”。 我正在使用jQuery,并认为可以使用event.stoppropagation()停止此行为: 它确实输入了该函数,但是仍然会发生传播(文档滚动) 很难在SO(和Google)上搜索此主题,

  • 问题内容: 我这里有使用struts2-jquery插件的代码 当我单击其内容时,URL会更改为类似的内容,而URL中没有任何变化。它仍然保持不变,我想要的是当我单击链接时会发生类似的情况。当我运行代码时,锚标记被翻译成这样 有了给定的内容,我该如何在网址中添加哈希? 问题答案: 这是一个工作示例(不考虑Struts2):

  • 我使用这段代码在滚动到部分时突出显示导航栏。当我滚动到某个分区时,是否可以立即更改地址栏中的URL?有人能帮我吗? 提前感谢

  • 问题内容: 如何防止浏览器缓存Ajax结果?我有事件触发的Ajax脚本,仅在清除浏览器数据后才显示结果。 在IE6和Firefox 3.0.10中测试 问题答案: 将随机查询字符串添加到您要发送的URL。 例如,如果将Ajax请求发送到“ http://www.xyz.com/a ”,则在末尾添加一个随机字符串:“ http://www.xyz.com/a?q=39058459ieutm39 ”

  • 问题内容: 有谁知道为什么1.1.5版会自动在您的网址中添加井号,以及如何将其关闭?海事组织这看起来很丑。只要您的网址不以正斜杠结尾,它就会发生。(我没有使用路线之类的东西)。 所以这: 变成 还有这个: 变成: 但是这个: 没有这个问题。 问题答案: 前几天,我遇到了这个问题。我通过为启用HTML5模式解决了该问题。看到 $ location的文件- HTML5模式 更新了$ location-