如何在没有页面刷新的情况下使用JavaScript从window.location(URL)中删除哈希?

时间:2009-09-09 02:59:22

标签: javascript window.location fragment-identifier

我的网址如下:http://example.com#something,如何在不导致页面刷新的情况下删除#something

我尝试了以下解决方案:

window.location.hash = '';

但是,这不会从网址中删除哈希符号#

17 个答案:

答案 0 :(得分:529)

现在可以解决这个问题。 HTML5 History API允许我们操纵位置栏以显示当前域中的任何URL。

function removeHash () { 
    history.pushState("", document.title, window.location.pathname
                                                       + window.location.search);
}

工作演示:http://jsfiddle.net/AndyE/ycmPt/show/

适用于IE 10中的Chrome 9,Firefox 4,Safari 5,Opera 11.50 。对于不受支持的浏览器,您可以随时编写一个优雅降级的脚本,在可用的情况下使用它: / p>

function removeHash () { 
    var scrollV, scrollH, loc = window.location;
    if ("pushState" in history)
        history.pushState("", document.title, loc.pathname + loc.search);
    else {
        // Prevent scrolling by storing the page's current scroll offset
        scrollV = document.body.scrollTop;
        scrollH = document.body.scrollLeft;

        loc.hash = "";

        // Restore the scroll offset, should be flicker free
        document.body.scrollTop = scrollV;
        document.body.scrollLeft = scrollH;
    }
}

所以你可以摆脱哈希符号,但不是在所有浏览器中。

注意:如果您要替换浏览器历史记录中的当前页面,请使用replaceState()代替pushState()

答案 1 :(得分:187)

初步问题:

window.location.href.substr(0, window.location.href.indexOf('#'))

window.location.href.split('#')[0]

两者都将返回没有哈希值的URL或其后的任何内容。

关于您的修改:

window.location的任何更改都会触发页面刷新。您可以在不触发刷新的情况下更改window.location.hash(尽管如果您的哈希值与页面上的ID匹配,窗口将跳转),但您无法摆脱哈希符号。选择哪个更糟糕......

最新的答案

关于如何在不牺牲的情况下做出正确答案(完全重新加载或在那里留下哈希标志)是down here。在这里留下这个答案,虽然是2009年的原始答案,而利用新浏览器API的正确答案是在1。5年后给出的。

答案 2 :(得分:45)

(太多的答案是多余的和过时的。)现在最好的解决方案是:

history.replaceState(null, null, ' ');

答案 3 :(得分:39)

简单而优雅:

history.replaceState({}, document.title, ".");  // replace / with . to keep url

答案 4 :(得分:15)

要删除哈希,您可以尝试使用此功能

function remove_hash_from_url()
{
    var uri = window.location.toString();
    if (uri.indexOf("#") > 0) {
        var clean_uri = uri.substring(0, uri.indexOf("#"));
        window.history.replaceState({}, document.title, clean_uri);
    }
}

答案 5 :(得分:11)

这也将删除尾随哈希。 例如:http://test.com/123#abc - > http://test.com/123

if(window.history.pushState) {
    window.history.pushState('', '/', window.location.pathname)
} else {
    window.location.hash = '';
}

答案 6 :(得分:5)

const url = new URL(window.location);
url.hash = '';
history.replaceState(null, document.title, url);

答案 7 :(得分:4)

以下怎么样?

window.location.hash=' '

请注意,我将散列设置为单个空格而不是空字符串。


将哈希值设置为无效锚点也不会导致刷新。如,

window.location.hash='invalidtag'

但是,我发现上述解决方案具有误导性。这似乎表明在给定位置上有一个具有给定名称的锚点,尽管它没有。同时,使用空字符串会导致页面移动到顶部,这有时是不可接受的。使用空格还可确保无论何时复制URL并为其添加书签和访问权限,页面通常都位于顶部,空格将被忽略。

而且,嘿,这是我在StackOverflow上的第一个答案。希望有人发现它有用并符合社区标准。

答案 8 :(得分:3)

<script type="text/javascript">
var uri = window.location.toString();
if (uri.indexOf("?") > 0) {
    var clean_uri = uri.substring(0, uri.indexOf("?"));
    window.history.replaceState({}, document.title, clean_uri);
}
</script>

将此代码放在头部

答案 9 :(得分:3)

您可以按照以下步骤进行操作:

history.replaceState({}, document.title, window.location.href.split('#')[0]);

答案 10 :(得分:3)

function removeLocationHash(){
    var noHashURL = window.location.href.replace(/#.*$/, '');
    window.history.replaceState('', document.title, noHashURL) 
}

window.addEventListener("load", function(){
    removeLocationHash();
});

答案 11 :(得分:2)

我认为,这样会更安全

    <body>

       <h1>Some content</h1>
      
    </body>

答案 12 :(得分:1)

尝试以下方法:

window.history.back(1);

答案 13 :(得分:0)

这是使用href更改位置并在不滚动的情况下清除哈希的另一种解决方案。

解释了神奇的解决方案here。规格here

const hash = window.location.hash;
history.scrollRestoration = 'manual';
window.location.href = hash;    
history.pushState('', document.title, window.location.pathname);

注意:建议的API现在是WhatWG HTML Living Standard的一部分

答案 14 :(得分:0)

bike_id

答案 15 :(得分:0)

根据上面给出的答案之一,使用这个:

var scrollV, scrollH
var loc = window.location;
scrollV = document.body.scrollTop;
scrollH = document.body.scrollLeft;
if ("pushState" in history) {
    history.pushState("", document.title, loc.pathname + loc.search);

    // Restore the scroll offset
    document.body.scrollTop = scrollV;
    document.body.scrollLeft = scrollH;

} else {
    loc.hash = "";

    // Restore the scroll offset
    document.body.scrollTop = scrollV;
    document.body.scrollLeft = scrollH;
}

答案 16 :(得分:-1)

您可以将hash替换为null

var urlWithoutHash = document.location.href.replace(location.hash , "" );