ajax能够实现页面的无刷新操做,可是没法前进与后退,淡出使用Ajax不利于SEO。现在,HTML5让事情变得简单。当执行ajax操做时,往浏览器history中塞入一个地址(使用pushState)(这是无刷新的),因而返回的试后,经过URL或其余传参咱们就能够还原到ajax以前的模样。javascript
属性php
1. history.pushState(data, title [, url]):往历史记录堆栈顶部添加一条记录;data会在onpopstate事件触发时做为参数传递过去;title为页面标题,当前全部浏览器都会 忽略此参数;url为页面地址,可选,缺省为当前页地址。html
2. history.replaceState(data, title [, url]) :更改当前的历史记录,参数同上。 html5
3. history.state:用于存储以上方法的data数据,不一样浏览器的读写权限不同。java
4. popstate事件:当用户单击浏览器的后退或者前进按钮时触发该事件。在事件处理函数中读取触发事件的事件对象的state属性值,该属性值即为执行pushState方法时所使用的第一个参数值,其中保存了在向浏览器历史记录中添加记录同步保存的对象。ajax
<div class="container"> <ul class="list"> <li> <a href="http://localhost/demo/html5/index.php">测试1</a> </li> <li> <a href="http://localhost/demo/html5/index2.php">测试2</a> </li> <li> <a href="http://localhost/demo/html5/index3.php">测试3</a> </li> </ul> <div class="all-content"> <ul class="content"> <li>111</li> <li>222</li> <li>333</li> </ul> </div> </div>
index.php,就是输出一个JSON格式json
<?php $data = json_decode(file_get_contents("php://input")); header("Content-Type: application/json; charset=utf-8"); echo ("[{"age" : 24, "sex" : "boy", "name" : "huangxueming"},{"age" : 26, "sex" : "boy", "name" : "huangxueming2"}]"); ?>
index2.php浏览器
<?php $data = json_decode(file_get_contents("php://input")); header("Content-Type: application/json; charset=utf-8"); echo ("[{"age" : 65, "sex" : "boy2", "name" : "huangxueming2"},{"age" : 26, "sex" : "boy", "name" : "huangxueming2"}]"); ?>
index3.phpapp
<?php $data = json_decode(file_get_contents("php://input")); header("Content-Type: application/json; charset=utf-8"); echo ("[{"age" : 244, "sex" : "boy4", "name" : "huangxueming4"},{"age" : 264, "sex" : "boy4", "name" : "huangxueming4"}]"); ?>
JS函数
$(function(){ var ajax, currentState; $(".container li").unbind().bind("click",function(e){ e.preventDefault(); var target = e.target, url = $(target).attr("href"); !$(this).hasClass("current") && $(this).addClass("current").siblings().removeClass("current"); if(ajax == undefined) { currentState = { url: document.location.href, title: document.title, html: $(".content").html() }; } ajax = $.ajax({ type:"POST", url: url, dataType:"json", success: function(data){ var html = ""; if(data.length > 0) { for(var i = 0, ilist = data.length; i < ilist; i++) { html += "<li>" +data[i].age+ "</li>" + "<li>" +data[i].name+ "</li>" + "<li>" +data[i].sex+ "</li>"; } $(".content").html(html); } var state = { url: url, title: document.title, html: $(".content").html() }; history.pushState(state,null,url); } }); }); window.addEventListener("popstate",function(event){ if(ajax == null){ return; }else if(event && event.state){ document.title = event.state.title; $(".content").html(event.state.html); }else{ document.title = currentState.title; $(".content").html(currentState.html); } }); });