Ajaxã¨çµã¿åããã¦ä¾¿å©ãªHistory APIã使ãã
ããã«ã¡ã¯ãPR TIMESããã³ãã»ã¨ã³ã¸ãã¢ã®å±±ç°ã§ãã
å¼ç¤¾ã§ã¯Ajaxã使ã£ããµã¤ãããµã¼ãã¹ãå¤ãéå¶ãã¦ãã¾ãã
ãã¦ããã®Ajaxã§ãããã¼ã¸é·ç§»ãªãã«ã³ã³ãã³ããåãæ¿ããå ´åãå½ç¶ãªãããã®ã¾ã¾ã§ã¯ãã©ã¦ã¶ã®URLãå¤ããã¾ãããããã§ã¯ã¦ã¼ã¶ã¼ãç´æ¥èªã¿è¾¼ã¿å ã«ã¢ã¯ã»ã¹ãããããã©ã¦ã¶ã®BACKãã¿ã³ã§åã«æ»ã£ããã§ããªãã®ã§ä¸ä¾¿ã§ãããããªæã«ä½¿ããã®ããHisotry APIãããã¯ãã©ã¦ã¶ã®å±¥æ´ãJavascriptãã管çãæä½ã§ãã便å©ãªAPIã§ãã
ã¾ã以ä¸ã®4ã¤ã¯ä»¥åãããããå¤ããã©ã¦ã¶ã§ãåä½ãã¾ãã
history.back();//表示ããå±¥æ´ã®1ã¤åã®ãã¼ã¸ã«ãã©ã history.go(4);//表示ããå±¥æ´ã®4ã¤åã®ãã¼ã¸ã«ãã©ã history.go(2);//表示ããå±¥æ´ã®2ã¤å ã®ãã¼ã¸ã«é²ã history.forward();//表示ããå±¥æ´ã®1ã¤å ã®ãã¼ã¸ãé²ã
ãã¦HTML5ã§ã¯ãããã«å ãã¦pushState,replaceStateã¨ãã颿°ãå ããã¾ããã
history.pushState(state, title, url); history.replaceState(state, title, url);
stateâ¦stateãªãã¸ã§ã¯ããhistory.stateã§ãã®å¤ã«ã¢ã¯ã»ã¹ã§ãã¾ãã
titleâ¦ç¾ç¶ä½¿ç¨ã§ãã¾ãããå°æ¥ã«åãã弿°ã§ãã空ç½ã«ã§ããªãã®ã§nullãæå®ãã¦ãã ããã
urlâ¦å±¥æ´ã«è¿½å ããURLããã ãã»ãã¥ãªãã£ä¸ãå¤é¨ãµã¤ããæå®ãããã¨ã¯ã§ãã¾ããã
pushStateã¯ãã©ã¦ã¶ã«ä»»æã®å±¥æ´ã追å ãã¢ãã¬ã¹ãã¼ã®URLãæ¸ãæãã¾ããreplaceStateã¯ç¾å¨ã®å±¥æ´ãæ¸ãæãããã¨ãã§ãã¾ããå±¥æ´ã®æä½ã¨ã¢ãã¬ã¹ãã¼ã®URLãæ¸ãæããã ãã§ãå®éã«ãªã³ã¯ã¯ãã¾ããã
ããã«popstateã使ããã¨ã«ãã£ã¦ãURLãå¤ãã£ãã¨ãã«ã¤ãã³ããçºåãããã¨ãã§ãã¾ãã
window.addEventListener("popstate", function);
Ajaxã¨çµã¿åãããå®éã®ãµã³ãã«ã³ã¼ãã§ãã
âèªã¿è¾¼ãâãã¿ã³ãæ¼ãã¨Ajaxã§test.htmlãèªã¿è¾¼ã¿ãdivå
ã«è¡¨ç¤ºãã¾ãããã®ã¨ãURLãhttp://ï½ï½ï½/test.htmlã«æ¸ãæããå±¥æ´ã«è¿½å ãã¾ãpopstateã使ããã¨ã§ããã©ã¦ã¶ã®æ»ã/é²ããã¿ã³ã§ã³ã³ãã³ãåãæ¿ããã§ãã¾ãã
<a href="test.html" onclick="loadTestFile(event);">èªã¿è¾¼ã</a> <div id="contents"></div>
var loaded;
function loadTestFile(event){
event.preventDefault();
$.ajax({
type: "GET",
url: "test.html",
dataType: "html",
success: function(out) {
loaded = out;
$("#contents").html(out);
history.pushState("testState", null, "/test.html");
}
});
}
window.addEventListener("popstate", function(event){
if(event.state == null){
$("#contents").html("");
}else if(event.state == "testState"){
$("#contents").html(loaded);
}
});
History APIã®ãã©ã¦ã¶å¯¾å¿ç¶æ³ã¯ãã¡ããã覧ãã ãããhttp://caniuse.com/#feat=history
æ§IEãªã©ã¯åä½ããªãã®ã§ã対象ã«å«ããå ´åã¯ä»£æ¿ã®ææ®µãå¿
è¦ã«ãªãã¾ãã
ä¾ãã°IE9ã®å ´åãä¸è¨ã®ä¾ã§ã¯Ajaxã§test.htmlãèªã¿è¾¼ã¾ãã¾ããURLã¯å¤ããã¾ããã
ããã§ã¯ããã¯ãã¼ã¯ãã·ã§ã¢ãã¦ãããæã«ä¸ä¾¿ã§ãã
ãã®å ´åã以ä¸ã®ããã«ããã·ã¥ãã¤ãããªã©ãã¦ç®¡çããã¨è¯ãã§ãã
if ("pushState" in history){
history.pushState("testState", null, "/test.html");
}else{
location.hash = "test";
}
History APIã¨ç´æ¥ã¯é¢ä¿ããã¾ããããURLãæ¸ãæããæã«ã¿ã¤ãã«ãªã©ãã³ã³ãã³ãã«åããã¦æ¸ãæããæ¹ã親åã§ãã
以ä¸ã®ãããªæ¹æ³ã§èªã¿è¾¼ã¿å
HTMLã®ã¿ã¤ãã«ãåå¾ãã¦ãæ¸ãæãããã¨ãã§ãã¾ãã
$.ajax({
type: "GET",
url: "test.html",
dataType: "html",
success: function(out) {
loaded = out;
$("#contents").html(out);
var titleScr = /<title>(.*)<\/title>/;
var titleStr = titleScr.exec(out)[1];
$("title").text(titleStr);
history.pushState("testState", null, "/test.html");
}
});
HTML5ã«ãã£ã¦ã¾ãã¾ã便å©ã«ãªãAjaxãã¦ã¼ã¶ã¼ã«è¦ªåãªè¨è¨ãã©ãã©ãå°å ¥ãã¦ããã¾ãããã