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


332

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

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

window.location.hash = '';

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


3
정말로이 작업을 원하십니까? 페이지를 새로 고칩니다.
seth

9
페이지를 새로 고치지 않고 할 수 있습니까?
Tom Lehman

1
그것은 이다 가능합니다. AJAX 히스토리 라이브러리가이를 처리합니다. 그러나 쉽지는 않으며 거의 ​​모든 브라우저에서 다르게 수행해야합니다. 당신이 들어가고 싶은 것이 아닙니다.
가브리엘 헐리

시각적 인 것 이외의 "#"을 남기는 문제가 있습니까?
user29660

답변:


210

초기 질문 :

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 년 후에 제공되었습니다.


22
이것은 명백한 잘못이며 window.location.hash를 변경할 수 있으며 새로 고침이 트리거되지 않습니다.
Evgeny

61
@ Evgeny-그것이 내 대답에 나와 있습니다. window.location.hash를 변경해도 새로 고침이 트리거되지 않습니다. "새로 고침을 트리거하지 않고 window.location.hash를 변경할 수 있습니다 (해시가 페이지의 id와 일치하면 창이 점프 함)".
Gabriel Hurley

3
페이지를 새로 고치지 마십시오. 문제가 있습니다. 페이지를 새로 고침해야하므로 답이 아닙니다!
Ed_

10
또한 ✓ 답변이되어서는 안된다고 생각하십시오
abernier

4
이것은 OP 질문에 대한 답변이 아닙니다.
브라이스

586

이 문제를 해결하는 것은 오늘날 훨씬 더 많은 범위 내에 있습니다. 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().


9
이 줄을 사용하여 쿼리 문자열을 잃지 않도록하십시오. history.pushState ( "", document.title, window.location.pathname + window.location.search);
Phil Kulak

6
@ 필 : 지적 해 주셔서 감사합니다. 그에 따라 답변을 업데이트했습니다. 예쁜 URL을 사용하는 데 너무 익숙합니다.
Andy E

1
이전 버전의 IE의 경우 document.body 대신 document.documentElement를 사용해야합니다. 이 답변보기 stackoverflow.com/a/2717272/359048
jasonmcclurg

29
브라우저 기록에 추가 항목을 만들지 않으려면 pushState 대신 replaceState를 사용하는 것이 좋습니다.
Nico

1
@ santiagoarizti : 당신 말이 맞아요, 나는 같은 결론에 도달했습니다. 필자가 작성한 코드 (7 년 전에!)를 제대로 검사하지 않았으며 해시를 제거 할 때 버튼의 상태를 토글하는 것을 놓쳤습니다. 해시를 수동으로 변경하기 때문에 항상 이벤트를 직접 트리거 할 수 있다고 생각합니다.
Andy E

85

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

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

5
history.pushState(null, null, ' ')기록을 보존 하려면 대신 사용하십시오 .
nichijou

9
및 매개 변수 전달 null이 궁극적으로 수행 하는 작업을 설명하는 것이 유용 할 수 있습니다 . statetitle
V. Rubinetti

이것과 나머지 문제는 이전이 아니었을 때 해시가 비어 있어도 onhashchange를 트리거하지 않는다는 것입니다.
커티스

1
TypeScript에서는 명령이 문자열을 사용하므로 두 번째 매개 변수에 null이 허용되지 않습니다. Mozilla는 빈 문자열을 권장합니다.
커티스

41

간단하고 우아한 :

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

3
같은 디렉토리에 머 무르려면 슬래시 대신 점을 사용하십시오.
vahanpwns

1
@vahanpwns 참고와 관련하여 답변을 업데이트하여 .대신 사용하십시오 /. 를 사용 /하면 URL을 루트 경로로 변경합니다.
Isaac Gregson

5
이 답변에 감사드립니다 history.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length));. 사용 사례로 수정했습니다 .
Scott Jungwirth

5
URL 쿼리는 유지되지 않습니다.
Vladislav Kostenko 2016 년

2
내 유스 케이스도 푸시 대신 교체하는 것이었지만 나에게는 더 의미가 있습니다.history.replaceState(null, document.title, location.pathname + location.search);
MDMower

16

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

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

13

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

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

이렇게하면 URL에있는 모든 쿼리 매개 변수가 제거됩니다. (
kevgathuku

1
`window.history.pushState ( '', '/', window.location.pathname + window.location.search)`: @kevgathuku 당신은, 예를 들어 location.search에 다시 추가 할 수 있습니다
크리스 Gunawardena

6

다음은 어떻습니까?

window.location.hash=' '

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


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

window.location.hash='invalidtag'

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

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


7
해시를 공백으로 설정하면 여전히 URL 끝에 #이 유지됩니다. 목표는 완전히 제거하는 것입니다.
mahemoff

1
URL 끝에서 해시를 추적합니다. 문제는 그것을 제거하는 방법입니다.
Gurmeet Singh

예. 어떻게 해시 문자열로 #을 제거 할 수 있습니까?
Bhavin Thummar

6

아래와 같이 할 수 있습니다 :

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


1
별표가 표시된 답변은 어느 경우에도 효과가 없었지만 이것은 효과가있었습니다. 감사!
Dev

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

2
이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
rollstuhlfahrer

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>

이 코드를 헤드 섹션에 놓으십시오


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

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

2

더 안전 할 것 같아

if (window.history) {
    window.history.pushState('', document.title, window.location.href.replace(window.location.hash, ''));
} else {
    window.location.hash = '';
}

0

다음을 시도하십시오 :

window.history.back(1);

23
사용자가 해시를 포함한 URL로 직접 온 경우 질문에 대답하지 않습니다.
nickb

이 트릭은 이전 페이지에 대한 링크를 만들려고 할 때 매우 유용하지만 링크는 많은 js 파일에 숨겨져 있습니다.
ValidfroM

정확히 내가 찾던 것. 이것은 javasript 함수가 반환 한 값을 소비하기 위해 웹 응용 프로그램에서 방금 만든 해시 태그를 제거하는 데 완벽하게 작동합니다.
user278859

0

href를 사용하여 위치를 변경하고 스크롤하지 않고 해시를 지우는 또 다른 솔루션이 있습니다.

매직 솔루션은 여기 에 설명되어 있습니다 . 여기 사양 .

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

참고 : 제안 된 API는 이제 WhatWG HTML Living Standard의 일부입니다.


0
  $(window).on('hashchange', function (e) {
        history.replaceState("", document.title, e.originalEvent.oldURL);
    });

-1

해시를 null로 바꿀 수 있습니다

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

1
이 질문은 "페이지를 새로 고치지 않고"라는 메시지를 표시하지만이 방법은 페이지를 새로 고칩니다. 당신은 당신의 대답에서이 사실을 주목해야합니다. 그래서 우리는 당신이 우리가 실제로 여기에 대답하려고하는 질문과 다른 질문에 대답하고 있다는 것을 직접 발견하는 데 시간을 낭비하지 않아도됩니다.
블라디미르 Kornea

페이지를 새로 고치지 않습니다.
Ciprian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.