我怎样才能删除位置散列,而不会导致页面滚动?
是否有可能从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