[javascript] JavaScript를 사용하여 새 페이지를로드하지 않고 브라우저에서 URL을 변경하십시오.

현재 페이지에 약간의 영향을 줄 수 있지만 브라우저에서 URL을 변경하여 사용자가 다시로드하거나 책갈피를 놓으면 새 URL이 사용되는 JavaScript 작업을 어떻게 수행합니까?

뒤로 버튼이 원래 URL을 다시로드하면 좋을 것입니다.

URL에 JavaScript 상태를 기록하려고합니다.



답변

HTML 5에서는 history.pushState함수를 사용하십시오 . 예로서:

<script type="text/javascript">
var stateObj = { foo: "bar" };
function change_my_url()
{
   history.pushState(stateObj, "page 2", "bar.html");
}
var link = document.getElementById('click');
link.addEventListener('click', change_my_url, false);
</script>

그리고 href :

<a href="#" id='click'>Click to change url to bar.html</a>

뒤로 단추 목록에 항목을 추가하지 않고 URL을 변경하려면 history.replaceState대신 사용하십시오.


답변

당신이 브라우저에서 작동하도록하려는 경우 그 지원하지 않는 history.pushStatehistory.popState 아직, “오래된”방법은 페이지를 다시로드가 발생하지 않습니다 조각 식별자를 설정하는 것입니다.

기본 아이디어는 window.location.hash필요한 상태 정보가 포함 된 값으로 속성 을 설정 한 다음 window.onhashchange 이벤트 를 사용하거나 지원하지 않는 이전 브라우저 onhashchange(IE <8, Firefox <3.6)를 정기적으로 확인하는 것입니다. 해시가 변경되었는지 확인하십시오.setInterval 예 )하고 페이지를 업데이트하십시오. 또한 초기 컨텐츠를 설정하려면 페이지로드시 해시 값을 확인해야합니다.

jQuery 를 사용하는 경우 브라우저가 지원하는 방법을 사용 하는 해시 변경 플러그인 이 있습니다. 다른 라이브러리 용 플러그인도 있다고 확신합니다.

브라우저가 ID가 일치하는 요소로 스크롤하기 때문에주의해야 할 사항은 페이지의 ID와 충돌하는 것입니다.


답변

window.location.href는 현재 URL을 포함합니다. 읽을 수 있고 추가 할 수 있으며 페이지를 다시로드 할 수 있습니다.

페이지에서 다시로드하지 않고 북마크 할 수 있도록 URL에 자바 스크립트 상태를 기록하려는 경우 # 다음에 현재 URL에 추가하고 onload 이벤트에 의해 트리거 된 자바 스크립트가 현재 구문 분석되도록합니다. 저장된 상태를 포함하는지 확인하기위한 URL입니다.

를 사용하면? # 대신에, 당신은 페이지를 새로 고침 할 것이지만,로드시에 저장된 상태를 파싱하기 때문에 이것은 실제로 문제가되지 않을 것입니다; 그러면 앞으로 및 뒤로 버튼도 올바르게 작동합니다.


답변

나는 이것이 불가능한 보안 문제 일 것이기 때문에 이것이 불가능하다는 것을 강력히 의심 할 것입니다. 예를 들어, 은행 로그인 페이지처럼 보이는 페이지를 만들고 주소 표시 줄의 URL을 실제 은행처럼 보이게 할 수 있습니다 !

아마도 왜 당신이 이것을하고 싶어하는지 설명한다면, 사람들은 대체 접근법을 제안 할 수 있습니다 …

[2011 년 편집 : 2008 년에이 답변을 썼기 때문에 URL이 같은 출처에서 수정되는 한 HTML5 기술 에 대한 더 많은 정보가 밝혀 졌습니다.]


답변

브라우저 보안 설정은 사람들이 표시된 URL을 직접 수정하지 못하게합니다. 발생할 수있는 피싱 취약점을 상상할 수 있습니다.

페이지를 변경하지 않고 URL을 변경하는 확실한 방법은 내부 링크 또는 해시를 사용하는 것입니다. 예 : http://site.com/page.htmlhttp://site.com/page.html#item1이 됩니다. 이 기술은 종종 hijax (AJAX + 기록 보존)에서 사용됩니다.

이 작업을 수행 할 때 종종 해시가있는 조치에 대한 링크를 href로 사용하고 요청 된 해시를 사용하여 조치를 결정하고 위임하는 jquery로 클릭 이벤트를 추가합니다.

나는 그것이 당신을 올바른 길로 인도하기를 바랍니다.


답변

jQuery 에는 jQuery-pusher 라는 브라우저의 URL을 변경하기위한 훌륭한 플러그인이 있습니다. 있습니다.

다음과 같이 JavaScript pushState와 jQuery를 함께 사용할 수 있습니다.

history.pushState(null, null, $(this).attr('href'));

예:

$('a').click(function (event) {

  // Prevent default click action
  event.preventDefault();

  // Detect if pushState is available
  if(history.pushState) {
    history.pushState(null, null, $(this).attr('href'));
  }
  return false;
});

JavaScript 만 사용 history.pushState()상태를 변경 한 후 생성 된 XMLHttpRequest 객체의 HTTP 헤더에서 사용되는 리퍼러를 변경하는 .

예:

window.history.pushState("object", "Your New Title", "/new-url");

pushState () 메소드 :

pushState()상태 개체, 제목 (현재 무시 됨) 및 URL (선택 사항)의 세 가지 매개 변수를 사용합니다. 이 세 가지 매개 변수 각각에 대해 자세히 살펴 보겠습니다.

  1. state 객체 — state 객체는 JavaScript 객체로, 새로운 기록 항목과 연결됩니다.pushState() . 사용자가 새 상태로 이동할 때마다 popstate 이벤트가 시작되고 이벤트의 state 속성에 기록 항목의 상태 객체 복사본이 포함됩니다.

    상태 객체는 직렬화 할 수있는 모든 것이 될 수 있습니다. Firefox는 상태 객체를 사용자의 디스크에 저장하여 사용자가 브라우저를 다시 시작한 후 복원 할 수 있으므로 상태 객체의 직렬화 된 표현에 640k 문자의 크기 제한을 적용합니다. 직렬화 된 표현이 이것보다 큰 상태 객체를 전달하면pushState() 하면 메소드에서 예외가 발생합니다. 이보다 더 많은 공간이 필요한 경우 sessionStorage 및 / 또는 localStorage를 사용하는 것이 좋습니다.

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

  3. URL — 새 기록 항목의 URL은이 매개 변수로 제공됩니다. 브라우저는을 호출 한 pushState()후이 URL을로드하려고 시도하지 않지만, 예를 들어 사용자가 브라우저를 다시 시작한 후 나중에 URL로드를 시도 할 수 있습니다. 새로운 URL은 절대적 일 필요는 없습니다. 상대적인 경우 현재 URL을 기준으로 해결됩니다. 새 URL은 현재 URL과 동일한 출처 여야합니다. 그렇지 않으면 pushState()예외가 발생합니다. 이 매개 변수는 선택 사항입니다. 지정하지 않으면 문서의 현재 URL로 설정됩니다.


답변

이를 처리 할 수있는 Yahoo YUI 구성 요소 (브라우저 히스토리 관리자)가 있습니다. http://developer.yahoo.com/yui/history/