[javascript] 페이지를 새로 고치지 않고 JavaScript로 window.location (URL)에서 해시를 제거하는 방법은 무엇입니까?

페이지를 새로 고치지 않고 URL을 http://example.com#something제거하려면 어떻게해야 #something합니까?

다음 해결책을 시도했습니다.

window.location.hash = '';

그러나 이것은 #URL에서 해시 기호 를 제거하지 않습니다 .



답변

초기 질문 :

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

또는

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

둘 다 해시없이 URL을 반환합니다.

편집과 관련하여 :

로 변경 window.location하면 페이지 새로 고침이 시작됩니다. window.location.hash새로 고침을 트리거하지 않고 변경할 수 있지만 (해시가 페이지의 ID와 일치하면 창이 점프하지만) 해시 기호를 제거 할 수는 없습니다. 더 나쁜 것을 골라라 …

가장 최신의 답변

희생하지 않고 (완전히 다시로드하거나 해시 기호를 남기지 않고) 수행하는 방법에 대한 정답은 여기에 있습니다 . 2009 년에 원래 답변이었던 것에 대해서는이 답변을 남겨두고 새로운 브라우저 API를 활용하는 올바른 답변은 1.5 년 후에 제공되었습니다.


답변

이 문제를 해결하는 것은 오늘날 훨씬 더 많은 범위 내에 있습니다. HTML5 역사 API는 우리가 현재 도메인 내의 모든 URL을 표시 할 위치 표시 줄을 조작 할 수 있습니다.

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

실무 데모 : http://jsfiddle.net/AndyE/ycmPt/show/

이 기능은 Chrome 9, Firefox 4, Safari 5, Opera 11.50 IE 10에서 작동합니다. 지원되지 않는 브라우저의 경우, 사용 가능한 경우이를 사용하는 정상적으로 저하 된 스크립트를 항상 작성할 수 있습니다.

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().


답변

(너무 많은 답변이 중복되고 구식입니다.) 이제 가장 좋은 해결책은 다음과 같습니다.

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


답변

간단하고 우아한 :

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


답변

해시를 제거하려면이 기능을 사용해보십시오

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


답변

후행 해시도 제거됩니다. 예 : http://test.com/123#abc- > http://test.com/123

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


답변

다음은 어떻습니까?

window.location.hash=' '

해시를 빈 문자열이 아닌 단일 공백으로 설정하고 있습니다.


해시를 잘못된 앵커로 설정해도 새로 고침이 발생하지 않습니다. 같은

window.location.hash='invalidtag'

그러나 위의 해결책이 오도 된 것으로 나타났습니다. 이것은 주어진 이름에 앵커가 없지만 주어진 위치에 앵커가 있음을 나타냅니다. 동시에 빈 문자열을 사용하면 페이지가 맨 위로 이동하여 때때로 허용되지 않을 수 있습니다. 공백을 사용하면 URL을 복사하여 책갈피에 추가하고 다시 방문 할 때마다 페이지가 보통 맨 위에 오며 공백이 무시됩니다.

그리고, 이것이 StackOverflow에 대한 첫 번째 대답입니다. 누군가가 유용하다고 생각하고 커뮤니티 표준과 일치하기를 바랍니다.