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

时间:2011-02-19 18:37:19

标签: javascript html hash default behavior

当我有以下内容时:

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

...并在浏览器中加载它,我可以将#test附加到网址,浏览器将滚动,以便<a>位于页面顶部。

但是,我想更改此行为(如果可能,使用JavaScript),以便使用散列滚动页面 - 我希望它只是简单什么都不做。

有没有办法在没有删除<a>元素的情况下执行


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

5 个答案:

答案 0 :(得分:2)

快速肮脏的黑客,但这是你可以建立的东西:

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)
  }
})

答案 1 :(得分:1)

嗯,你可以尝试残忍:

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

必须在DOM准备好之后但在渲染之前运行,因此您必须将它放在正确的位置。它不适用于'id'属性 - 只能使用&lt; a name = ...&gt;

它能做你想做的吗?

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分:0)

如果网址中有哈希值,那么一种hacky技术就是自动滚动到页面顶部:

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

答案 4 :(得分:-1)

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

removeHashPartFromString = function() {
 ...
}

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

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