有没有办法覆盖浏览器单击哈希值的默认行为?

发布于 2024-10-17 23:46:06 字数 461 浏览 6 评论 0原文

当我有以下内容时:

<a name='test'></a>

...并将其加载到浏览器中,我可以将 #test 附加到 URL,浏览器将滚动,以便 位于页面顶部。

但是,我想更改此行为(如果可能的话使用 JavaScript),以便使用哈希不会滚动页面 - 我希望它什么也不做。

有没有办法在不删除 元素的情况下实现这一点?


更新:我需要浏览器仍然发送 onhashchange() 事件,但不滚动到 元素。原因是我想在保留事件通知的同时覆盖滚动。

When I have the following:

<a name='test'></a>

...and load it in a browser, I can append #test to the URL and the browser will scroll so that the <a> is at the top of the page.

However, I would like to change this behavior (using JavaScript if possible) so that using the hash does not scroll the page - I'd like it to simply do nothing.

Is there a way to do that without removing the <a> element?


Update: I need the browser to still send onhashchange() events but without scrolling to the <a> element. The reason being that I want to override the scrolling while retaining the event notification.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

紧拥背影 2024-10-24 23:46:06

一个快速的肮脏黑客,但它是您可以构建的东西:

var curScroll = prevScroll = $(window).scrollTop()

$(window).bind('scroll', function() {
  prevScroll = curScroll
  curScroll = $(this).scrollTop()
}).bind('hashchange', function() {
  $(this).scrollTop(prevScroll)
})

我在这里使用 jQuery 使其跨浏览器工作并保持页面的 onhashchange 和 onscroll 处理程序完好无损。我发现的一个问题是,如果您单击同一个主题标签两次,它无论如何都会滚动。


UPD。我刚刚找到了一个更好的解决方案:

$('a').live('click', function() {
  if (this.href.split('#')[0] == location.href.split('#')[0]) {
    var scrollTop = $(window).scrollTop()
    setTimeout(function() {
      $(window).scrollTop(scrollTop)
    }, 0)
  }
})

A quick dirty hack, but it's something you can build upon:

var curScroll = prevScroll = $(window).scrollTop()

$(window).bind('scroll', function() {
  prevScroll = curScroll
  curScroll = $(this).scrollTop()
}).bind('hashchange', function() {
  $(this).scrollTop(prevScroll)
})

I used jQuery here to make it work across browsers and keep the page's onhashchange and onscroll handlers intact. One problem I spotted is that if you click the same hashtag twice it scrolls anyway.


UPD. I just figured out a better solution:

$('a').live('click', function() {
  if (this.href.split('#')[0] == location.href.split('#')[0]) {
    var scrollTop = $(window).scrollTop()
    setTimeout(function() {
      $(window).scrollTop(scrollTop)
    }, 0)
  }
})
衣神在巴黎 2024-10-24 23:46:06

好吧,你可以尝试变得更残酷:

var i, elems = document.getElementsByTagName('a');
for (i = 0; i < elems.length; i++) {
    elems[i].removeAttribute('name');
}

它必须在 DOM 准备好之后、渲染之前运行,所以你必须将它放在正确的位置。它不适用于“id”属性 - 仅适用于

它能达到你想要的效果吗?

Well, you can try to be brutal:

var i, elems = document.getElementsByTagName('a');
for (i = 0; i < elems.length; i++) {
    elems[i].removeAttribute('name');
}

It has to be run after the DOM is ready but before it gets rendered so you have to put it in the right place. It won't work for 'id' attributes - only with <a name=...>

Does it do what you want?

川水往事 2024-10-24 23:46:06

试试这个:

$( 'a[href="#"]' ).click( function(e) {
  e.preventDefault();
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Try this:

$( 'a[href="#"]' ).click( function(e) {
  e.preventDefault();
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

烙印 2024-10-24 23:46:06

一种 hacky 技术是,如果 url 中存在哈希值,则自动滚动到页面顶部:

if (window.location.hash) {
    window.scrollTo(0, 0);
}

A kind-of hacky technique would be to just automatically scroll to the top of the page if there's a hash in the url:

if (window.location.hash) {
    window.scrollTo(0, 0);
}
呆萌少年 2024-10-24 23:46:06

也许您需要使用一些jquery和字符串操作

removeHashPartFromString = function() {
 ...
}

$('a').each(function() {
    this.attr('href') = removeHashPartFromString(this.attr('href'));
}); 

,或者找到带有散列的元素并从这些元素中删除名称散列属性。

perhaps you need to use a bit of jquery and string manipulation

removeHashPartFromString = function() {
 ...
}

$('a').each(function() {
    this.attr('href') = removeHashPartFromString(this.attr('href'));
}); 

Or find the elements with the hash and remove the name hash attributes from those elements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文