history.pushStateを使用して、ブラウザの戻る処理をコントロールする
2018年2月4日
画面遷移せずにAJAXで画面を表示している時、ブラウザの戻るボタンを押してしまうと前の画面に移動してしまいます。
それを防ぐ方法としてhistory.pushStateが使用できるようです。
以下はサンプルです。
var page = 1;
document.getElementById('go_next').addEventListener('click', function(e){
e.preventDefault();
page++;
document.getElementById('result').innerHTML = 'PAGE:'+page+'(click)';
var name = document.getElementById('name').value.trim();
var href = location.pathname + "?";
href += "page=" + page;
href += "&name=" + encodeURIComponent(name);
history.pushState(null, null, href);
return false;
});
window.addEventListener('popstate', function(e) {
if(window.location.search.length > 1){
var p = window.location.search.substring(1).split('&'), params = {};
for (var i = 0; i < p.length; i++) {
var tmp = p[i].split('=');
if(tmp[0] && tmp[1]){
params[tmp[0]] = escape_html(decodeURIComponent(tmp[1]).trim());
}
}
document.getElementById('name').value = (params["name"] ? params["name"] : "");
document.getElementById('result').innerHTML = 'PAGE:'+(params["page"] ? params["page"] : "")+'(popstate)';
}
},false);
var escape_html = function escape_html(string) {
if(string == '') {
return '';
}
if(typeof string !== 'string') {
return string;
}
return string.replace(/[&'`"<>]/g, function(match) {
return {
'&': '&',
"'": ''',
'`': '`',
'"': '"',
'<': '<',
'>': '>',
}[match]
});
}