我怎样才能删除位置散列,而不会导致页面滚动?

是否有可能从window.location删除散列,而不会导致页面跳转滚动到顶部? 我需要能够修改哈希而不会导致任何跳转。

我有这个:

 $('<a href="#123">').text('link').click(function(e) { e.preventDefault(); window.location.hash = this.hash; }).appendTo('body'); $('<a href="#">').text('unlink').click(function(e) { e.preventDefault(); window.location.hash = ''; }).appendTo('body'); 

在这里看到现场示例: http : //jsbin.com/asobi

当用户点击“ 链接 ”时,哈希标签被修改而没有任何页面跳转,因此工作正常。

但是,当用户点击“ 取消链接 ”时,has标签被删除,页面滚动 – 跳转到顶部。 我需要删除哈希没有这个副作用。

我相信,如果你只是把一个虚拟散列它不会滚动,因为没有匹配滚动到。

 <a href="#A4J2S9F7">No jumping</a> 

要么

 <a href="#_">No jumping</a> 

"#"本身就等于"_top"从而导致滚动到页面的顶部

我在几个网站上使用以下内容,不要跳页!

漂亮干净的地址栏为HTML5友好的浏览器,只是一个#旧版本的浏览器。

 $('#logo a').click(function(e){ window.location.hash = ''; // for older browsers, leaves a # behind history.pushState('', document.title, window.location.pathname); // nice and clean e.preventDefault(); // no page reload }); 

window.location的哈希属性是愚蠢的在几个方面。 这是其中之一; 另一个是有不同的get和set值:

 window.location.hash = "hello"; // url now reads *.com#hello alert(window.location.hash); // shows "#hello", which is NOT what I set. window.location.hash = window.location.hash; // url now reads *.com##hello 

请注意,将哈希属性设置为“”也会删除哈希标记; 这是redirect的页面。 要将url的哈希部分的值设置为“',留下哈希标记,因此不刷新,请写下:

 window.location.href = window.location.href.replace(/#.*$/, '#'); 

没有刷新页面,没有办法彻底删除哈希标记。

2012年更新:

Blazemonger和thinkdj指出,技术有所改善。 有些浏览器确实允许您清除该标签,但有些浏览器却不允许。 为了支持这两个,请尝试如下所示:

 if ( window.history && window.history.pushState ) { window.history.pushState('', '', window.location.pathname) } else { window.location.href = window.location.href.replace(/#.*$/, '#'); } 

这是一个旧的post,但我想分享我的解决scheme在我的项目中由JS处理的所有链接都有href =“#_ js”属性(或任何名称,你只想用于这个目的),并在页面初始化我做:

 $('body').on('click.a[href="#_js"]', function() { return false; }); 

这将会诀窍

我不确定这是否会产生预期的结果,请给它一个机会:

 $('<a href="#">').text('unlink').click(function(e) { e.preventDefault(); var st = parseInt($(window).scrollTop()) window.location.hash = ''; $('html,body').css( { scrollTop: st }); }); 

基本上保存滚动偏移量,并在分配空散列后恢复它。

你尝试过return false;return false; 在事件处理程序? 当你这样做的时候,jQuery做了一些特别的事情,类似于AFAIK,而不是e.preventDefault

将window.location.hash设置为空或不存在的锚名称,将始终强制页面跳转到顶部。 防止这种情况的唯一方法是抓取窗口的滚动位置,并在哈希更改后再次将其设置到该位置。

这也将强制页面的重画(不能避免它),虽然因为它是在一个单独的js进程中执行,它不会跳上/下(理论上)。

 $('<a href="#123">').text('link').click(function(e) { e.preventDefault(); window.location.hash = this.hash; }).appendTo('body'); $('<a href="#">').text('unlink').click(function(e) { e.preventDefault(); var pos = $(window).scrollTop(); // get scroll position window.location.hash = ''; $(window).scrollTop(pos); // set scroll position back }).appendTo('body'); 

希望这可以帮助。

希望这可以帮助

HTML

 <div class="tabs"> <ul> <li><a href="#content1">Tab 1</a></li> <li><a href="#content2">Tab 2</a></li> <li><a href="#content3">Tab 3</a></li> </ul> </div> <div class="content content1"> <p>1. Content goes here</p> </div> <div class="content content2"> <p>2. Content goes here</p> </div> <div class="content content3"> <p>3. Content goes here</p> </div> 

JS

 function tabs(){ $(".content").hide(); if (location.hash !== "") { $('.tabs ul li:has(a[href="' + location.hash + '"])').addClass("active"); var hash = window.location.hash.substr(1); var contentClass = "." + hash; $(contentClass).fadeIn(); } else { $(".tabs ul li").first().addClass("active"); $('.tabs').next().css("display", "block"); } } tabs(); $(".tabs ul li").click(function(e) { $(".tabs ul li").removeAttr("class"); $(this).addClass("active"); $(".content").hide(); var contentClass = "." + $(this).find("a").attr("href").substr(1); $(contentClass).fadeIn(); window.location.hash = $(this).find("a").attr("href"); e.preventDefault(); return false; }); 

url没有任何散列。
http://output.jsbin.com/tojeja

具有不跳转到锚点的哈希标签的url。
http://output.jsbin.com/tojeja#content1