현재 상태와 일치하도록 AJAX 앱의 주소 표시 줄 URL 수정


166

AJAX 앱을 작성하고 있지만 사용자가 앱을 통해 이동할 때 페이지 다시로드가 부족하더라도 주소 표시 줄의 URL을 업데이트하고 싶습니다. 기본적으로, 나는 그들이 언제라도 북마크 할 수 있기를 원하므로 현재 상태로 돌아갑니다.

사람들이 AJAX 앱에서 RESTfulness 유지를 어떻게 처리하고 있습니까?


2
앱 상태를 유지하는 데 사용되지만 "RESTfulness"와는 아무 관련이 없습니다.
Mohamed

29
window.history.pushState(null,'hi','page1?id=32')
Omu

3
수락 된 답변은 5 년 전에 작성되었으며 그 동안 @Omu가 말한 것처럼 window.history.pushState를 얻었습니다. location.hash는 많은 문제를 일으켰으므로 피하는 것이 가장 좋습니다.
pcarvalho

pushState 접근 방식이 눈에 띄도록 답변을 편집했습니다.
jasonjwwilliams

답변:


116

이 작업을 수행하는 방법은 location.hashAJAX 업데이트로 인해 별도의 URL이 필요한 상태 변경이 발생하는시기 를 조작 하는 것입니다. 예를 들어 페이지의 URL이 다음과 같은 경우

http://example.com/

클라이언트 측 함수가이 코드를 실행 한 경우 :

// AJAX code to display the "foo" state goes here.

location.hash = 'foo';

그러면 브라우저에 표시된 URL이 다음과 같이 업데이트됩니다.

http://example.com/#foo

이를 통해 사용자는 페이지의 "foo"상태를 북마크하고 브라우저 기록을 사용하여 상태를 탐색 할 수 있습니다.

이 메커니즘을 사용하면 자바 스크립트를 사용하여 클라이언트 측에서 URL의 해시 부분을 구문 분석하여 조각 식별자 (# 다음 부분)가 섬기는 사람.

Ben Alman의 hashchange 플러그인 은 jQuery를 사용하는 경우 후자를 산들 바람으로 만듭니다.


당신이 옳은 것 같습니다. 이것이 유일한 접근법입니다. 이 조언의 좋은 자세한 설명처럼 보인다 : < ajaxpatterns.org/Unique_URLs는 >
jasonjwwilliams

@buymeasoda 편집 해 주셔서 감사합니다. 그 부분을 쓸 때 내가 무슨 생각을했는지 잘 모르겠습니다.
Dave Ward

1
와우,이 답변은 매우 도움이되었습니다. URL 예제는 약간 혼란 스럽지만 SO는 링크를 제목으로 자동 대체합니다. example.com 및 example.com/#foo와 같은 것으로 대체하여 URL 전체를 일반 텍스트로 볼 수 있습니다.
Neil

4
@Pascal HTML5의 pushState를 지원하는 브라우저에서만 가능합니다. 여기에 관한 좋은 정보 : diveintohtml5.info/history.html
Dave Ward

1

18

book.cakephp.org와 같은 사이트를보십시오. 이 사이트는 해시를 사용하지 않고 URL을 변경하고 AJAX를 사용합니다. 정확히 어떻게되는지 확실하지 않지만 알아 내려고 노력했습니다. 아는 사람이 있으면 알려주세요.

또한 특정 프로젝트 내에서 탐색을 볼 때 github.com.


나는 일주일 전에 GitHub와 함께 그것을 알아 차렸다. 그들은 어떻게 지구에서 그렇게합니까? 돌아가서 확인해야합니다.
Drew Noakes

16
그들은 자바 스크립트 함수 pushState ()를 사용하는 것 같습니다. 브라우저 기록에 추가됩니다. 그것을 들여다보십시오; 꽤 흥미롭고 시원합니다.
daniel.wright

이것에 대해 감사합니다. 제가 찾던 것이 었습니다. github이 어떻게했는지 궁금했습니다. 처음에는 다시로드해야한다고 생각했지만 AJAX 요청 만있었습니다. Opera에서는 페이지를 다시로드했습니다.
kamranicus

다른 그룹의 페이지를 탐색하는 동안 유사한 기술이 fb에 의해 사용됩니다. 다른 그룹이 언급 된 왼쪽 탐색 열이 있습니다. 특정 그룹 이름을 클릭하면 URL이 변경되고 기본 컨텐츠 창의 컨텐츠 만 url (해시 없음)과 함께 변경됩니다. 따라서 사용자가 페이지를 다시로드하면 홈 페이지가 아닌 그룹 페이지로 리디렉션됩니다.
Madeyedexter


11

이것은 Kevin이 말한 것과 유사합니다. 클라이언트 상태를 일부 자바 스크립트 객체로 가질 수 있으며 상태를 저장하려는 경우 객체를 직렬화합니다 (JSON 및 base64 인코딩 사용). 그런 다음 href 조각을이 문자열로 설정할 수 있습니다.

var encodedState = base64(json(state));
var newLocation = oldLocationWithoutFragment + "#" + encodedState;

document.location = newLocation; // adds new entry in browser history
document.location.replace(newLocation); // replaces current entry in browser history

첫 번째 방법은 새로운 상태를 새로운 위치로 취급하므로 뒤로 버튼은 이전 위치로 이동합니다. 후자는 그렇지 않습니다.


페이지를 새로 고치지 않고 책갈피 기록에 항목을 추가하는 방법이 있습니까? 첫 번째 예에서와 같이 위치를 설정하면 새로 고침이 발생합니까?
Drew Noakes

document.location.replace를 수행하면 브라우저가 해당 URL로 리디렉션됩니다 (크롬 콘솔에서 시도했습니다)
Omu

3

SWFAddress는 Flash 및 Javascript 프로젝트에서 작동하며 위에서 언급 한 해시 방법을 사용하여 책갈피 가능한 URL을 만들 수 있으며 뒤로 버튼 지원을 제공 할 수 있습니다.

http://www.asual.com/swfaddress/


3

window.location.hash 메소드는 선호되는 작업 방법입니다. 이를 수행하는 방법에 대한 설명은 Ajax Patterns-Unique URLs 입니다.

YUI에는이 패턴을 모듈로 구현 한 것으로, 여기에는 해시를 사용하여 주소를 다시 쓰면서 뒤로 단추가 작동하도록하는 IE 관련 해결 방법이 포함되어 있습니다. YUI 브라우저 기록 관리자 .

다른 프레임 워크도 비슷한 구현을 가지고 있습니다. 중요한 점은 주소를 다시 쓰는 것과 함께 기록이 작동하도록하려면 브라우저마다 다른 방법으로 처리해야합니다. (이것은 첫 번째 링크 기사에 자세히 나와 있습니다.)

IE는 iframe 기반 해킹이 필요합니다. Firefox는 동일한 방법으로 이중 기록을 생성합니다.


3

OP 또는 다른 사람들이 여전히 상태를 활성화하기 위해 브라우저 기록을 수정하는 방법을 찾고 있다면 IESUS에서 제안한대로 pushState 및 replaceState를 사용하는 것이 현재 올바른 방법입니다. location.hash에 비해 주요 이점은 해시뿐만 아니라 실제 URL을 생성하는 것 같습니다. 해시를 사용한 브라우저 기록을 저장 한 다음 자바 스크립트를 비활성화 한 상태로 다시 방문하면 해시가 서버로 전송되지 않으므로 앱이 작동하지 않습니다. 그러나 pushState가 사용 된 경우 전체 라우트가 서버로 전송되며, 라우트에 적절하게 응답하도록 빌드 할 수 있습니다. 서버와 클라이언트 모두에서 동일한 콧수염 템플릿이 사용 된 예를 보았습니다. 클라이언트가 자바 스크립트를 사용하도록 설정 한 경우 서버로의 왕복을 피함으로써 빠른 응답을 얻을 수 있습니다. 그러나 응용 프로그램은 자바 스크립트없이 완벽하게 작동합니다. 따라서 자바 스크립트가없는 경우 앱이 정상적으로 저하 될 수 있습니다.

또한 history.js와 같은 이름의 프레임 워크가 있다고 생각합니다. HTML5를 지원하는 브라우저의 경우 pushState를 사용하지만 지원하지 않는 브라우저는 자동으로 해시를 사용합니다.


2

사용자가 페이지에 있는지 확인하고 URL 표시 줄을 클릭하면 javascript가 페이지 외부에 있다고 말합니다. URL 표시 줄을 변경하고 그 안에 '#'기호가있는 'ENTER'를 누르면 마우스 커서로 수동으로 페이지를 클릭하지 않고 페이지로 다시 이동하면 javascript의 keyboad 이벤트 명령 (document.onkeypress)이 리디렉션을 위해 자바 스크립트를 입력하고 활성화했는지 확인할 수 있습니다. window.onfocus를 사용하여 페이지에 사용자가 있는지 확인하고 window.onblur를 사용하지 않는지 확인할 수 있습니다.

네 가능합니다.

;)


이것은 사용자가 # 기호로 URL 막대를 편집 할 때 페이지를 변경하는 것이 우아하게 보인 방법입니다.
Marcelo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.