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


답변:


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.