你的位置:首页 > Java教程

[Java教程]pjax


pjax是history.pustState与ajax的结合,用于实现当点击链接后,页面局部刷新,url改变,历史后退可以回退到之前页面。
pjax项目地址在 https://github.com/defunkt/jquery-pjax 
实际的效果见 http://pjax.heroku.com/
原理:
1.$(document).pjax('ul a', '#main')监听a标签事件,局部刷新id为mian的元素内容
2.当用户点击a链接后,缓存当前页面container内容,

var context = options.context = findContainerFor(options.container)

通过ajax请求,请求头信息添加

xhr.setRequestHeader('X-PJAX', 'true');

 

3.后台代码判断请求头是否包含“X-PJAX”,如果为true则返回局部页;如果为false,则返回newurl,通过 location.replace(newurl)实现跳转;
4.dom操作替换container内容,同时使用history.replaceState(object,title,url)替换当前url并产生历史;
object包含请求新页面的标题/url等信息

pjax.state = {   id: options.id || uniqueId(),   url: container.url,   title: container.title,   container: context.selector,   fragment: options.fragment,   timeout: options.timeout  }  if (options.push || options.replace) {   window.history.replaceState(pjax.state, container.title, container.url)  }

 

4.当点击后退触发onpopstate事件,执行container.html(contents)显示历史页面信息

 1 var cache = cacheMapping[state.id] || [] 2 var container = $(cache[0] || state.container), contents = cache[1] 3  4 if (contents) { 5     container.trigger('pjax:start', [null, options]) 6  7     pjax.state = state 8     if (state.title) document.title = state.title 9     var beforeReplaceEvent = $.Event('pjax:beforeReplace', {10      state: state,11      previousState: previousState12     })13     container.trigger(beforeReplaceEvent, [contents, options])14     container.html(contents)15 16     container.trigger('pjax:end', [null, options])17    } else {18     pjax(options)19    }