history.replaceState () 예제?


127

누구나 history.replaceState에 대한 실제 예제를 제공 할 수 있습니까? 이것이 w3.org가 말하는 것입니다 :

history . replaceState(data, title [, url ] )

주어진 데이터, 제목 및 제공된 경우 (널이 아닌 경우) URL을 갖도록 세션 히스토리의 현재 항목을 업데이트합니다.

최신 정보:

이것은 완벽하게 작동합니다.

history.replaceState( {} , 'foo', '/foo' );

URL은 변경되지만 제목은 변경되지 않습니다. 버그입니까, 아니면 뭔가 빠졌습니까? 최신 Chrome에서 테스트되었습니다.


3
일반적으로 JavaScript 질문에 대한 애드온 라이브러리를 푸시하지는 않지만이 경우에는 예외를 적용합니다. History.js의 라이브러리는 작은 심입니다 현대적인 브라우저에서 역사 API의 이상한 버릇을 많이 정리합니다. 이전 버전의 IE에 대한 선택적 지원도 제공합니다.
— Pointy


@Pointy history.js는 훌륭하게 작동합니다. 내 질문에 코드를 업데이트했습니다. 내 문제는 없습니다. 브라우저 뒤로 버튼으로 이전 페이지로 돌아갈 수 없습니다
— Serjas

3
Mozilla 에 따르면 이 title매개 변수는 실제로 사용되지 않습니다.
— 로켓 Hazmat

3
첫 번째 답변은 질문에 대한 replaceState예가 필요하다는 점을 감안할 때 실제로 허용되는 답변이되어서는 안되며 , 허용되는 답변은 결코 replaceState예가 아닙니다 .
— CorayThan

답변:


68

실제로 이것은 2 년 동안 의도적이지만 버그입니다. 문제는 불분명 한 스펙과 복잡 할 때 document.title와 뒤로 / 앞으로 의 복잡성 에 있습니다.

Webkit 및 Mozilla의 버그 참조를 참조하십시오 . 또한 History API 도입에 관한 Opera 는 title 매개 변수를 사용 하지 않았으며 여전히 사용하지 않을 것이라고 말했다 .

현재 history 항목의 제목 인 pushState 및 replaceState의 두 번째 인수는 Opera 구현에 사용되지 않지만 하루가 될 수 있습니다.

잠재적 인 해결책

내가 보는 유일한 방법은 제목 요소를 변경하고 pushState를 대신 사용하는 것입니다.

document.getElementsByTagName('title')[0].innerHTML = 'bar';
window.history.pushState( {} , 'bar', '/bar' );

jquery 사용자의 경우. try $ ( "title"). html (_title);
— suraj jain

3
이로 인해 사용자는 구현 방법에 따라 뒤로 버튼을 "두 번 클릭"해야 할 수 있습니다. 더 간단한 해결책은 계속 사용 replaceState()하고 문서 제목을 수동으로 설정하는 것입니다.document.title = "title"
— newshorts

38

여기에 최소한의 고안된 예가 있습니다.

console.log( window.location.href );  // whatever your current location href is
window.history.replaceState( {} , 'foo', '/foo' );
console.log( window.location.href );  // oh, hey, it replaced the path with /foo

더 많은 것이 replaceState()있지만 정확히 무엇을하고 싶은지 모르겠습니다.


2
URL이 변경되지만 제목이 변경되지 않습니다. 최신 크롬 @trott로 테스트
— Serjas

6
@Serjas titlein 매개 변수 replaceState()는 내가 아는 한 모든 브라우저에서 무시됩니다.
— Trott

10

history.pushState현재 페이지 상태를 히스토리 스택으로 푸시하고 주소 표시 줄에서 URL을 변경합니다. 따라서 돌아 가면 해당 상태 (전달한 객체)가 반환됩니다.

현재는 이것이 전부입니다. 새 페이지 표시 또는 페이지 제목 변경과 같은 다른 모든 페이지 작업은 사용자가 수행해야합니다.

링크 한 W3C 사양은 초안 일 뿐이며 브라우저가 다르게 구현할 수 있습니다. 예를 들어 Firefox 는 title매개 변수를 완전히 무시합니다 .

여기 pushState내 웹 사이트에서 사용 하는 간단한 예가 있습니다.

(function($){
    // Use AJAX to load the page, and change the title
    function loadPage(sel, p){
        $(sel).load(p + ' #content', function(){
            document.title = $('#pageData').data('title');
        });
    }

    // When a link is clicked, use AJAX to load that page
    // but use pushState to change the URL bar
    $(document).on('click', 'a', function(e){
        e.preventDefault();
        history.pushState({page: this.href}, '', this.href);
        loadPage('#frontPage', this.href);
    });

    // This event is triggered when you visit a page in the history
    // like when yu push the "back" button
    $(window).on('popstate', function(e){
        loadPage('#frontPage', location.pathname);
        console.log(e.originalEvent.state);
    });
}(jQuery));

29
허용 된 답변이 "replaceState"대신 "pushState"를 설명하는 이유는 무엇입니까?
— Giwrgos Tsopanoglou

1
@GiwrgosTsopanoglou : 1 년 전에이 질문에 답 했으므로 왜 :-P 어쨌든 replaceState현재 페이지 상태가 변경 되는지 잘 모르겠습니다 . 현재 페이지 상태 의 상태 객체와 URL을 변경할 수 있습니다 .
— 로켓 Hazmat

2
replaceState에 대한 정보를 찾고 있었고 pushState : P
— Giwrgos Tsopanoglou

6

예를 봐

window.history.replaceState({
    foo: 'bar'
}, 'Nice URL Title', '/nice_url');

window.onpopstate = function (e) {
    if (typeof e.state == "object" && e.state.foo == "bar") {
        alert("Blah blah blah");
    }
};

window.history.go(-1);

그리고 검색 location.hash;



2

MDN History doc 에 따르면
두 번째 논거는 현재로서는 사용되지 않을 미래를위한 것이라고 분명히 언급되어 있습니다. 두 번째 주장은 웹 페이지 제목을 다루는 것이 맞지만 현재는 모든 주요 브라우저에서 무시됩니다.

Firefox는 현재이 매개 변수를 무시하지만 나중에 사용할 수도 있습니다. 빈 문자열을 여기에 전달하면 나중에 메소드를 변경하지 않아도 안전합니다. 또는 이동중인 주에 짧은 제목을 전달할 수도 있습니다.


두 번째 주장 은 웹 페이지의 제목을 나타내지 않습니다. 연결 한 MDN 문서에 " 이동중인 주 에 대한 짧은 제목을 전달하십시오" 라고 표시 되어 있습니다. . 이는 W3C 히스토리 인터페이스 문서의 "제목이 지정된 세션 히스토리에 지정된 데이터를 푸시합니다"라는 내용에 동의합니다 . 해당 문구의 데이터는 상태 데이터이므로 제목은 다시 상태 (데이터)를 나타냅니다.
— Stephen P

1

@Sev의 답변에 정말로 응답하고 싶었습니다.

Sev는 옳습니다. 내부에 버그가 있습니다. window.history.replaceState

이 문제를 해결하려면 생성자를 다시 작성하여 제목을 수동으로 설정하십시오.

var replaceState_tmp = window.history.replaceState.constructor;
window.history.replaceState.constructor = function(obj, title, url){
    var title_ = document.getElementsByTagName('title')[0];
    if(title_ != undefined){
        title_.innerHTML = title;
    }else{
        var title__ = document.createElement('title');
        title__.innerHTML = title;
        var head_ = document.getElementsByTagName('head')[0];
        if(head_ != undefined){
            head_.appendChild(title__);
        }else{
            var head__ = document.createElement('head');
            document.documentElement.appendChild(head__);
            head__.appendChild(title__);
        }
    }
    replaceState_tmp(obj,title, url);
}

2
하지마 기본 기능을 덮어 쓰는 것은 매우 나쁜 스타일
— René Roth

3
이 버그 수정이 필요할 때 다른 제안은 무엇입니까?
— Glenn Plas

@GlennPlas는 반응 저장소에 대해 PR을 엽니 다. :)
— zero_cool

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