History对象

概述

浏览器窗口有一个history对象,用来保存浏览历史。history对象提供了一些列的方法和属性,允许在浏览器之间移动。

注意点

HTML5中history的新方法

所有主流浏览器都支持这两种方法(包括IE10)。

可以使用一下代码来检查当前浏览器是否支持History API

if (!!(window.history && history.pushState)){
// 支持History API
} else {
// 不支持
}

history.pushState()

window.onpopstate

window.onpopstate是popstate事件在window对象上的事件句柄。当前活动历史项改变会触发popstate事件。调用history.pushState()创建新历史项,或调用history.replaceState()替换新的历史项,那么popstate事件的state属性会包含历史项状态对象(state)的拷贝。

window.onpopstate = function(event) {
   alert("location: " + document.location + ", state: " +   JSON.stringify(event.state));
};
history.pushState({page: 1}, "title 1", "?page=1");
history.pushState({page: 2}, "title 2", "?page=2");
history.pushState({page: 3}, "title 3", "?page=3");
history.replaceState({page: 4}, "title 3", "?page=4");
history.back();
history.back(); 

history.replaceState()

history.state属性

备注

window.onpopstate = function(event) {
  console.log("location: " + document.location);
  console.log("state: " + JSON.stringify(event.state));
};
// 或者
window.addEventListener('popstate', function(event) {  
  console.log("location: " + document.location);
  console.log("state: " + JSON.stringify(event.state));  
});

URLSearchParams API

URLSearchParams API用于处理URL之中的查询字符串,即问号之后的部分。

用来操作某个参数的方法

var paramsString = "q=URLUtils.searchParams&topic=api"
var searchParams = new URLSearchParams(paramsString);
console.log(searchParams.has('topic')); // true
console.log(searchParams.get('topic')); // "api"
console.log(searchParams.getAll('topic')); // ["api"]
console.log(searchParams.get('foo'));  // null
searchParams.set('foo', 2);
console.log(searchParams.get('foo')); // 2
searchParams.append('topic', 'webdev');
console.log(searchParams.toString()); //"q=URLUtils.searchParams&topic=api&foo=2&topic=webdev"
searchParams.append('foo', 3);
console.log(searchParams.getAll('foo')); // [2, 3]
searchParams.delete('topic');
console.log(searchParams.toString()); // "q=URLUtils.searchParams&foo=2&foo=3"

用来遍历所有参数的方法

以下三个函数,返回的都是Iterator对象

for(var key of searchParams.keys()) {
  console.log(key);   // q; foo; foo
}
for(var value of searchParams.values()) {
  console.log(value);  // URLUtils.searchParams;  2;  3
}
for(var pair of searchParams.entries()) {
  console.log(pair[0]+ ', '+ pair[1]);  // q, URLUtils.searchParams; foo, 2; foo, 2
}
// URLSearchParams实例本身就是Iterator对象
for (var p of searchParams) {
  console.log(p);
}

实例

pjax(pushState + ajax)

参考文献