사용자가 브라우저 기록으로 돌아갈 수 있는지 확인하는 방법


답변:


119

짧은 대답 : 할 수 없습니다.

기술적으로 정확한 방법이 있습니다.이 방법은 속성을 확인하는 것입니다.

history.previous

그러나 작동하지 않습니다. 이것의 문제는 대부분의 브라우저에서 보안 위반으로 간주되며 일반적으로 undefined를 반환한다는 것 입니다.

history.length

다른 사람들이 제안한 속성입니다 ...
그러나 길이는 역사의 현재 위치 를 나타내지 않기 때문에 완전히 작동하지 않습니다 . 또한 항상 같은 숫자로 시작하지는 않습니다. 예를 들어 방문 페이지를 갖도록 설정되지 않은 브라우저는 0에서 시작하지만 방문 페이지를 사용하는 다른 브라우저는 1에서 시작합니다.

대체 텍스트

대부분의 경우 다음을 호출하는 링크가 추가됩니다.

history.back();

또는

 history.go(-1);

되돌아 갈 수 없다면 링크를 클릭해도 아무런 효과가 없을 것으로 예상됩니다.


이것은 좋은 정보이지만 문제를 해결하지는 못합니다. 실제로 모든 브라우저에서 작동하는 일부 코드를 정교화해야합니다. 아마도 사용중인 브라우저를 먼저 확인하는 코드 일 것입니다.
Santiago Bendavid

5
내가 말하는 것은 결정적인 대답이 없다는 것입니다. 각 접근법의 장단점을 말하고 있지만 사용중인 브라우저를 확인하고 하나 또는 다른 코드 조각을 조건부로 실행하는 스크립트를 얻는 방법은 아닙니다.
Santiago Bendavid

'이 문제는 대부분의 브라우저에서 이것이 보안 위반으로 간주된다는 것입니다.'라는 의미가 무엇인지 알고 싶습니다. 다른 스레드의 다른 사용자는 클라이언트의 브라우저 기록을 가져올 수 있다는 것이 보안을 위반하는 것으로 지적했지만 설명하지는 않습니다. 왜 그런 겁니까. 보안 위협이 무엇인지 예를 들어 줄 수 있습니까?
케빈 찬드라

웹 사이트는 간접 개인 정보를 포함 할 수있는 사용자의 이력을 알 수 없어야합니다. 사이트는 추적 / 쿠키를 사용하여 사용자가 사이트 자체에서 수행하는 작업을 알 수 있지만 예를 들어 내가 사용하는 은행, 자녀가 어느 학교에 있는지 등을 파악해서는 안됩니다. 따라서, 브라우저는 해당 속성에 액세스 할 수 없습니다
McAden

84

확인하는 또 다른 방법이 있습니다-리퍼러를 확인하십시오. 첫 페이지에는 일반적으로 빈 리퍼러가 있습니다 ...

if (document.referrer == "") {
    window.close()
} else {
    history.back()
}

2
개인 정보 보호를 위해 리퍼러를 숨길 수 있습니다.
Kornel

11
링크를 통해 페이지를로드하지 않고 주소 표시 줄에 URL을 입력하거나 책갈피를로드하여 리퍼러는 항상 비어 있습니다. 브라우저 탭 / 윈도우가 이전에 다른 페이지를로드했을 때 이러한 페이지는 확실히 히스토리를 가질 수 있습니다!
ygoe

1
그러나 다중 페이지 웹 사이트 탐색에 적용 가능한 솔루션
Dan

36
target = "_ blank"로 창을 열어 새 창을 강제 실행하면 작동하지 않습니다. 브라우저의 뒤로 버튼은 작동하지 않지만 document.referrer가 있습니다.
Mike_K

3
보안 (HTTPS) 페이지에서 안전하지 않은 페이지 (HTTP)로 오는 경우에는 참조 페이지가 제거되므로 작동하지 않습니다.
케빈 국경

54

내 코드는 브라우저가 한 페이지 뒤로 돌아가도록 허용하고 실패하면 대체 URL을로드합니다. 또한 해시 태그 변경도 감지합니다.

뒤로 버튼을 사용할 수없는 경우 대체 URL은 500ms 후에로드되므로 브라우저는 이전 페이지를로드 할 시간이 충분합니다. window.history.go(-1);js 스크립트가 아직 중지되지 않았기 때문에 대체 URL을로드하면 브라우저에서 대체 URL을 사용하게됩니다.

function historyBackWFallback(fallbackUrl) {
    fallbackUrl = fallbackUrl || '/';
    var prevPage = window.location.href;

    window.history.go(-1);

    setTimeout(function(){ 
        if (window.location.href == prevPage) {
            window.location.href = fallbackUrl; 
        }
    }, 500);
}

6
나는 이것이 질문의 핵심, 사람이 돌보는 이유 및 실제로 신뢰할 수 있고 일관된 방법으로 그것에 대해 무엇을 할 수 있는지 생각합니다.
Chris Marisic

1
이것은 뒤로 버튼이있는 URL을 가져 와서 크롬의 새 탭에 붙여 넣을 때까지 작동했습니다. 뒤로 버튼을 클릭하면 빈 탭으로 전송되었습니다. :(
karlingen

2
이것이 Chrome의 기본 동작입니다. 페이지를 "방문"하여 chrome://newtab기록으로 돌아갈 수 있습니다.
redelschaap

네트워크 연결 속도가 느리면 대체 URL이 꽤 규칙적으로 표시되므로주의하십시오.
cameck

14

여기 내가 한 일이 있습니다.

내가 사용하는 'beforeunload'이벤트를 부울을 설정할 수 있습니다. 그런 다음 'beforeunload'가 시작되었는지 시간 초과를 설정했습니다.

var $window = $(window),
    $trigger = $('.select_your_link'),
    fallback = 'your_fallback_url';
    hasHistory = false;

$window.on('beforeunload', function(){
    hasHistory = true;
});

$trigger.on('click', function(){

    window.history.go(-1);

    setTimeout(function(){
        if (!hasHistory){
            window.location.href = fallback;
        }
    }, 200);

    return false;
});

주요 브라우저 (FF, Chrome, IE11에서 테스트 됨)에서 작동하는 것 같습니다.


1
이것은 질문에 대한 가장 좋은 답변입니다. 당신은 쉽게 교체 할 수 있습니다 window.location.href = fallback으로 window.close()그것도 작동합니다.
Vitani

13

내 프로젝트에서 사용하는 스 니펫이 있습니다.

function back(url) {
    if (history.length > 2) {
        // if history is not empty, go back:
        window.History.back();
    } else if (url) {
        // go to specified fallback url:
        window.History.replaceState(null, null, url);
    } else {
        // go home:
        window.History.replaceState(null, null, '/');
    }
}

참고 : History.js 를 사용 하여 브라우저 기록을 관리합니다.


history.length를 숫자 2와 비교하는 이유는 무엇입니까?

Chrome의 시작 페이지는 브라우저 기록에서 첫 번째 항목으로 계산되기 때문입니다.


몇 가지 가능성 history.length과 사용자 행동이 있습니다.

  • 사용자 는 브라우저에서 비어있는 새 탭 을 연 다음 페이지를 실행합니다. 이 경우 사용자가 빈 탭으로 이동하기 때문에 history.length = 2비활성화하고 싶습니다 back().
  • 사용자는 이전의 링크를 클릭하여 새 탭 에서 페이지를 엽니 다 . history.length = 1다시 우리는 back()메소드 를 비활성화하고 싶습니다 .
  • 마지막으로 사용자는 몇 페이지를 다시로드 한 후 현재 페이지에 도착 합니다 . history.length > 2이제 back()활성화 할 수 있습니다.

참고 : 외부 웹 사이트에서 링크를 클릭하지 않고 사용자가 현재 페이지에 방문하면 사례가 생략됩니다 target="_blank".

참고 2 : document.referrer 주소를 입력하여 웹 사이트를 열 때와 웹 사이트가 ajax를 사용하여 하위 페이지를로드 할 때 비어 있으므로 첫 번째 경우에는이 값을 확인하지 않았습니다.


이 방법은 저에게 효과적이었습니다. 실제로 폴백에 사용하는 내 페이지에 대한 정적 폴백 백 링크를 저장합니다.
Greg Blass

그러나 되돌아 가면 history.length는 변하지 않습니다. 따라서 제대로 작동하지 않습니다
Ciprian Mocanu

불행히도 네 말이 맞아 "스텝 백"구조로만이 스 니펫을 사용합니다…
gregmatys 8:11에

12

이것은 트릭을 수행하는 것 같습니다.

function goBackOrClose() {  

    window.history.back();
    window.close(); 

    //or if you are not interested in closing the window, do something else here
    //e.g. 
    theBrowserCantGoBack();

}

history.back ()을 호출 한 다음 window.close ()를 호출하십시오. 브라우저가 히스토리로 되돌아 갈 수 있으면 다음 명령문으로 이동할 수 없습니다. 되돌아 갈 수 없으면 창을 닫습니다.

그러나 URL을 입력하여 페이지에 도달하면 firefox에서 스크립트가 창을 닫을 수 없습니다.


3
나는 그렇지 않으면 history.back () 실행 한 후 어쨌든 실행하겠습니다, 내가 다음 문을 실행하기 위해 시도하기 전에 수백 밀리 초 정도의 지연으로의 setTimeout을 사용하지 않으면 작동하지 않습니다이 발견 한
켄 펠링

나는 그것을 개인적으로 경험하지 못했습니다. 어떤 브라우저입니까?
xtrahelp.com

아래 답변에서 setTimeout 함수로 잘 작동했습니다. 예 : setTimeout (function () {window.close ()}, 400);
gilchris

2
window.close()많은 최신 브라우저에서 보안 위험으로 간주됩니다. 일부는 당신이 그것을 못하게합니다.
Rudi Kershaw

window.history.back (); 이후에는 무엇이든 할 수 있습니다. window.close (); 단지 예입니다
hariszaman

10

다음 window.history.length항목도 포함되어 있으므로주의하십시오.window.history.forward()

따라서 window.history.length항목이 두 개 이상 있지만 기록이없는 항목 이있을 수 있습니다 . 이것은 당신이 발사하면 아무 일도 일어나지 않음을 의미합니다window.history.back()


9

뒤로 버튼을 사용할 수 있는지 직접 확인할 수 없습니다. 를 볼 수 history.length>0있지만 현재 페이지 보다 앞쪽 에 페이지 있는 경우에도 마찬가지입니다. 이 때 뒤로 버튼을 사용할 수 없다는 것을 확신 할 수 있습니다 history.length===0.

그것으로 충분하지 않으면, 당신이 할 수있는 전부는 전화 history.back()이고, 그 후에도 여전히 페이지가로드되면 뒤로 버튼을 사용할 수 없습니다! 물론 뒤로 버튼 사용할 수 있다면 페이지에서 다른 곳으로 이동 한 것입니다. 에서 탐색을 취소 onunload할 수 없으므로 실제로 발생하는 등을 중지하기 위해 할 수있는 모든 작업은에서 무언가를 반환 onbeforeunload하는 것이므로 큰 성가신 프롬프트가 표시됩니다. 그것은 가치가 없어.

실제로 역사와 관련된 일을하는 것은 일반적으로 정말 나쁜 생각입니다. 방문 기록 탐색은 웹 페이지가 아닌 브라우저 크롬 용입니다. "돌아 가기"링크를 추가하면 일반적으로 가치보다 더 많은 사용자 혼란이 발생합니다.


2
길이와 관련하여 모든 브라우저 에서조차 마찬가지입니다. 일부 브라우저는 현재 페이지를 내역 항목으로 계산하고 1부터 시작합니다. 브라우저 감지 기능을 포함해야합니다.
McAden

실제로 나는 그것이 항상 생각했다 1! 이것은 0뇌파였습니다. 브라우저는 항상 1그 이상으로 반응 할 것이라고 생각했습니다 . Opera와 IE는 그렇지 않다고 생각합니다.
bobince

1
"역사 탐색은 웹 페이지가 아닌 브라우저 크롬 용입니다."-동의
Brian

5

history.length사용자가 기록으로 돌아갈 수 있는지 표시되지 않으므로 쓸모가 없습니다. 또한 다른 브라우저는 초기 값 0 또는 1을 사용합니다. 브라우저에 따라 다릅니다.

작동하는 솔루션은 $(window).on('beforeunload'이벤트 를 사용하는 것이지만 페이지가 ajax를 통해로드되고 pushState를 사용하여 창 기록을 변경하면 작동하는지 확실하지 않습니다.

그래서 다음 해결책을 사용했습니다.

var currentUrl = window.location.href;
window.history.back();
setTimeout(function(){
    // if location was not changed in 100 ms, then there is no history back
    if(currentUrl === window.location.href){
        // redirect to site root
        window.location.href = '/';
    }
}, 100);

나를 위해 다음과 같이 작동합니다. function goBackOrTo (targetUrl) {var currentUrl = window.location.href; window.history.go (-1); setTimeout (function () {// 위치가 800ms 내에 변경되지 않은 경우, 과거 기록이 없습니다 if (currentUrl === window.location.href) {// 사이트 루트로 리디렉션 window.location.href = targetUrl; }}, 800); }
alfonx

2

나는 다음과 같은 접근법을 생각해 냈습니다. 브라우저가 페이지를 떠나기 시작하는지 여부를 감지하기 위해 onbeforeunload 이벤트를 사용합니다. 특정 기간이 아닌 경우 대체로 리디렉션됩니다.

var goBack = function goBack(fallback){
    var useFallback = true;

    window.addEventListener("beforeunload", function(){
      useFallback = false;
    });

    window.history.back();

    setTimeout(function(){
        if (useFallback){ window.location.href = fallback; }
    }, 100); 
}

을 사용하여이 함수를 호출 할 수 있습니다 goBack("fallback.example.org").


1
나는 이것을 가장 좋아하고 방금 windows.onbeforeunload이벤트 리스너로 변경 window.addEventListener("beforeunload", function (event) { useFallback = false; });했으므로 window.onbeforeunload를 덮어 쓰지 않습니다.
MiChAeLoKGB

2

여기여기 에 대한 답변을 바탕으로 . 더 결정적인 대답은 이것이 새로운 탭의 새 페이지인지 확인하는 것입니다.

페이지 기록이 둘 이상이면 현재 페이지 이전 페이지로 돌아갈 수 있습니다. 그렇지 않은 경우 탭은 새로 열린 탭이므로 새 탭을 만들어야합니다.

다르게, 링크 된 답변에 대해서는 referrer새 탭에 여전히 추천자 가 있기 때문에 확인하지 않습니다 .

if(1 < history.length) {
    history.back();
}
else {
    window.close();
}

1
감사합니다. 당신은 내 하루를 저장 :).
Bijay Yadav

1

또이 근처 에서 찍은 완벽한 솔루션, 다른 SO의 대답은 :

if( (1 < history.length) && document.referrer ) {
    history.back();
}
else {
    // If you can't go back in history, you could perhaps close the window ?
    window.close();
}

누군가 사용할 때 작동하지 않지만 target="_blank"Chrome에서 작동하는 것 같습니다.


0

브라우저에는 뒤로 및 앞으로 버튼이 있습니다. 이 질문에 대한 해결책을 제시합니다. 그러나 브라우저 순방향 작업에 영향을 미치고 일부 브라우저에서 버그가 발생합니다.

브라우저가 새 URL을 열면 열지 않은 경우 history.length가 커집니다.

그래서 당신은 해시를 변경할 수 있습니다

  location.href = '#__transfer__' + new Date().getTime() 

표시되지 않은 URL을 얻으려면 history.length가 실제 길이를 얻습니다.

  var realHistoryLength = history.length - 1

그러나 항상 잘 작동하는 것은 아니며 특히 URL 자동 점프가 빠른 이유를 모르겠습니다.


0

나는 해결책을 찾으려고 노력했지만 이것이 내가 얻을 수있는 최선입니다 (그러나 훌륭하게 작동하며 여기에서도 내가 찾은 가장 쉬운 해결책입니다).

필자의 경우 뒤로 버튼으로 기록을 다시 방문하고 싶었지만 사용자가 처음 연 페이지가 내 앱의 하위 페이지 인 경우 메인 페이지로 돌아갑니다.

해결책은 앱이로드되는 즉시 기록 상태에서 교체를 수행 한 것입니다.

history.replaceState( {root: true}, '', window.location.pathname + window.location.hash)

이렇게하면 history.state.root돌아 가기 전에 확인해야합니다 . 사실이라면 대신 역사를 대신합니다.

if(history.state && history.state.root)
    history.replaceState( {root: true}, '', '/')
else
    history.back() 

다른 좋은 사용 사례가 있다고 생각하지 않습니다. 앱 외부의 기록을 확인하려면 좋은 생각이 아닐 수 있습니다.
Maxwell sc

-1
var fallbackUrl = "home.php";
if(history.back() === undefined)
    window.location.href = fallbackUrl;

정말 쉬워요?! 다양한 브라우저에서 테스트 되었습니까?
벤츠 지

크롬 history.back()입니다 undefined만 빈 탭 페이지
gregmatys

-2

해결책

'use strict';
function previousPage() {
  if (window.location.pathname.split('/').filter(({ length }) => length > 0).length > 0) {
    window.history.back();
  }
}

설명

window.location.pathname현재 URI를 제공합니다. 예를 들어 https://domain/question/1234/i-have-a-problem줄 것이다 /question/1234/i-have-a-problem. 자세한 내용은 window.location에 대한 설명서 를 참조하십시오.

다음으로 호출하면 split()해당 URI의 모든 조각이 제공됩니다. 이전 URI를 가져 오면 다음과 같은 것이 생깁니다 ["", "question", "1234", "i-have-a-problem"]. 자세한 내용은 String.prototype.split ()에 대한 설명서 를 참조하십시오.

에 대한 호출 filter()은 백 슬래시로 생성 된 빈 문자열을 필터링하기위한 것입니다. 기본적으로 길이가 1 (빈 문자열이 아닌)보다 큰 조각 URI 만 반환합니다. 그래서 우리는 같은 것을 가질 것 ["question", "1234", "i-have-a-question"]입니다. 이것은 다음과 같이 작성 될 수 있습니다.

'use strict';
window.location.pathname.split('/').filter(function(fragment) {
  return fragment.length > 0;
});

자세한 내용은 Array.prototype.filter ()Destructuring 할당에 대한 설명서를 참조하십시오.

이제 사용자가에있는 동안 되돌아 가려고 https://domain/하면 if 문을 트리거하지 window.history.back()않으므로 메소드를 트리거하지 않으므로 사용자가 웹 사이트에 머무를 수 있습니다. 이 URL에 해당됩니다 []의 길이를 가지고있는 0, 그리고 0 > 0false입니다. 따라서 조용히 실패합니다. 물론 원하는 경우 무언가를 기록하거나 다른 작업을 수행 할 수 있습니다.

'use strict';
function previousPage() {
  if (window.location.pathname.split('/').filter(({ length }) => length > 0).length > 0) {
    window.history.back();
  } else {
    alert('You cannot go back any further...');
  }
}

한계

물론 브라우저가 History API를 지원하지 않으면이 솔루션이 작동하지 않습니다 . 이 솔루션을 사용하기 전에 설명서를 확인하여 자세한 내용을 확인하십시오.


-5

이것이 작동하는지 확실하지 않으며 완전히 테스트되지 않았지만 다음을 시도하십시오.

<script type="text/javascript">

    function goBack() {
        history.back();
    }

    if (history.length > 0) { //if there is a history...
        document.getElementsByTagName('button')[].onclick="goBack()"; //assign function "goBack()" to all buttons onClick
    } else {
        die();
    }
</script>

그리고 어딘가에 HTML :

<button value="Button1"> //These buttons have no action
<button value="Button2">

편집하다:

당신이 할 수있는 일은 뒤로 기능을 지원하는 브라우저 (모두가 생각하는 것)를 조사 하고이 페이지 에서 발견되고 철저하게 설명 된 표준 JavaScript 브라우저 감지 객체를 사용하는 것 입니다. 그런 다음 두 개의 다른 페이지를 가질 수 있습니다. 하나는 뒤로 버튼과 호환되는 "좋은 브라우저"를위한 것이고 다른 하나는 브라우저를 업데이트하라고 알려주는 "나쁜 브라우저"를위한 것입니다.


2
history.back함수입니다. 당신은 확인하고 싶어history.length > 0 이로 돌아 가기 경우 다음history.back()
pixl 코더

3
또한 []NodeList에서 의미가 없으므로 이벤트 핸들러에 문자열을 지정할 수 없습니다.
bobince

-8

window.history.length0 인지 확인하십시오 .


6
아니 좋은 방법, 당신은 ... 역사에서 어디 history.length 당신을 말하지 않기 때문에
론 라이터

@ Ron Reiter : 예,이 질문에 대한 최고의 답변과 기타 의견이 이미 1 년 전에 이미 확립 된 것으로 생각합니다.
Cristian Sanchez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.