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와 뒤로 / 앞으로 의 복잡성 에 있습니다.

WebkitMozilla의 버그 참조를 참조하십시오 . 또한 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 사양은 초안 일 뿐이며 브라우저가 다르게 구현할 수 있습니다. 예를 들어 Firefoxtitle매개 변수를 완전히 무시합니다 .

여기 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.