如果你玩过Google+,看到过YouTube的新界面,便会体验到这个HTML5的新功能。使用pushState + Ajax(pjax),可以实现网页的ajax加载,同时又能完成URL的改变而没有网页跳转刷新的迹象,就像是改变了网页的hash(#)一样。
旧的解决方案
曾说SEO和ajax是天敌。此前从Twitter开始流行Ajax+hash的方式调用内容,Google给出的解决方案是“#!~string”自动转换为“?_excaped_fragment_=~string”来抓取动态内容。但这无疑会非常麻烦:首先你需要对网站进行“?_excaped_fragment_=~string”的处理配置,而且,如果用户把网址“http://example.com/#!/~string”直接复制并分享的话,意味着网页还必须监听hashchange。不过如果你觉得这个#!很好看就没关系了。
新的解决方案: pushState
然而HTML5的新接口pushState / replaceState就可以比较完美的解决问题,它避免了改变hash的问题,避免了用户不理解URL的形式感到疑惑,同时还有onpopstate提供监听,良好响应后退前进。而且它不需要这个URL真实存在。
HTML5 的 pushState+Ajax
HTML5提供history接口,把URL以state的形式添加或者替换到浏览器中,其实现函数正是 pushState 和 replaceState。
pushState 例子
pushState() 的基本参数是:
window.history.pushState(state, title, url);
其中state和title都可以为空,但是推荐不为空,应当创建state来配合popstate监听。
例如,我们通过pushState现改变URL而不刷新页面。
var state = ( { url: ~href, title: ~title, ~additionalKEY: ~additionalVALUE } ); window.history.pushState(state, ~title, ~href);
其中带有“~”符号的是自定义内容。就可以把这个~href(URL)推送到浏览器的历史里。如果想要改变网页的标题,应该:
document.title= ~newTitle;
注意只是pushState是不能改变网页标题的哦。
replaceState 同理
window.history.replaceState( state, ~title, ~href);
pushState、replaceState 的区别
pushState()可以创建历史,可以配合popstate事件,而replaceState()则是替换掉当前的URL,不会产生历史。
限制因素
只能用同域的URL替换,例如你不能用http://baidu.com去替换http://google.com。而且state对象不存储不可序列化的对象如DOM。
Ajax 配合 pushState 例子
现在用Ajax + pushState来提供全新的ajax调用风格。以jQuery为例,为了SEO需要,应该为a标签的onclick添加方法。
$("~target a").click(function(evt){ evt.preventDefault(); // 阻止默认的跳转操作 var uri=$(this).attr('href'); var newTitle=ajax_Load(uri); // 你自定义的Ajax加载函数,例如它会返回newTitle document.title=newTitle; // 分配新的页面标题 if(history.pushState){ var state=({ url: uri, title: newTitle }); window.history.pushState(state, newTitle, uri); }else{ window.location.href="#!"+~fakeURI; } // 如果不支持,使用旧的解决方案 return false; }); function ajax_Load(uri){ ... return newTitle; } // 你自定义的ajax函数,例如它会返回newTitle
即可完成pushState。至于新标题newTitle的获取就是另外的问题了,例如你可以为a标签分配data-newtitle=~title属性并届时读取,或者如果你用的$.ajax()函数,可以用$(result).filter("title").text()来获取。
另外如果需要对新加载的页面的连接同样使用这个ajax,则需要对新内容的a标签重新部署,例如
$("~newContentTarget a").click(function(evt){ ... });
pushState 配合 popstate 监听
想要良好的支持浏览器的历史前进后退操作,应当部署popstate监听:
window.addEventListener('popstate', function(evt){ var state = evt.state; var newTitle = ajax_Load(state.url); //你自定义的ajax加载函数,例如它会返回newTitle document.title=newTitle; }, false);
提醒,你可以通过setRequestHeader()来让服务器端配合你的ajax请求输出专门的内容。
流程图示意
这个例子的大致过程如下图所示
jQuery + PJAX 插件
已经在github上发布,有人把PJAX做成了jQuery插件,方便调用,节省大量代码:
if ($.support.pjax) { $(document).on('click', 'a[data-pjax]', function(event) { var container = $(this).closest('[data-pjax-container]') $.pjax.click(event, {container: container}) });}
谢谢收看,如有不正请指出。
原文:http://blog.netsh.org/posts/pushstate-ajax_1339.netsh.html
相关推荐
Pjax的核心在于history.pushState,这是一个HTML5的新特性,它允许我们在不重新加载页面的情况下改变URL,使得浏览器的历史记录能够跟踪用户的操作。通过这种方式,Pjax可以提供类似单页应用(SPA)的用户体验,提高...
* pjax技术:基于ajax+history.pushState的新技术,可以无刷新改变页面的内容,并且可以改变页面的URL。 五、浏览器兼容性 | Feature | Chrome | Firefox(Gecko) | Internet Explorer | Opera | Safari | | --- | ...
本篇文章介绍的是利用AJAX技术和HTML5中新增的History API中的history.pushState和history.replaceState方法,实现在不刷新页面的情况下改变浏览器的URL地址。下面将详细介绍这些技术的具体用法和应用场景。 ### ...
pushState()有三个参数:一个状态对象、一个标题(现在会被忽略),一个可选的URL地址。 state:与要跳转到的URL对应的状态信息。 title:空字符串(以后可能有用)。 url:要跳转到的URL地址,不能跨域。 作用:...
Pjax的核心思想是,当用户点击链接时,使用Ajax加载新内容,同时通过`pushState()`更新浏览器的URL,从而在不刷新整个页面的情况下提供完整的浏览历史记录。 **Pjax的工作流程**: 1. 用户点击一个链接。 2. Pjax...
调用`pushState()`可以在浏览器的历史记录中添加一个新条目,改变浏览器的URL,但不会立即加载新页面。只有当用户点击浏览器的前进/后退按钮或者通过JavaScript执行`popstate`事件时,才会加载对应URL的内容。 **...
**jQuery Pjax 插件详解:利用Ajax与PushState实现无刷新加载** jQuery Pjax 是一个流行的JavaScript插件,它允许网页在不进行完全刷新的情况下更新内容,从而提供更快的用户体验。Pjax(PushState + Ajax)这个...
原pushstate的ajax 使用pushstate和replacestate,popstate存储url状态 使用ajax交换数据 pushstate + ajax技术适用于某些我们不希望刷新页面的页面,但坏处对seo不利
PushState 是 HTML5 History API 的一部分,允许开发者在不重新加载整个页面的情况下改变浏览器的URL,提供更好的用户体验。 **描述分析:** 描述中提到了这个插件的路线图,这通常是指开发计划或更新历程。路线图...
HTML5里引用了新的API,就是history.pushState和history.replaceState,就是通过这个接口做到无刷新改变页面URL的。 与传统的AJAX的区别 传统的ajax有如下的问题: 虽然ajax可以无刷新改变页面内容,但无法改变页面...
当用户点击链接时,PJAX通过AJAX请求新的内容,然后使用`pushState()`改变浏览器的历史记录和URL,而不会重新加载整个页面。这样,用户可以享受到快速的页面导航体验,同时服务器负担减轻,因为只传输必要的内容。...
2. **平滑导航**:在页面内部切换时,插件可能会使用pushState来改变URL,同时通过AJAX请求加载新内容,实现平滑无刷新的过渡效果。 3. **回退处理**:当用户点击浏览器的后退按钮时,插件会监听popstate事件,恢复...
使用pushState和replaceState方法时,浏览器并不会立即加载对应的URL,而是更新地址栏中的URL,这意味着开发者可以使用这些方法来创建一种伪URL,从而不触发页面加载。在单页面应用中,这可以用来模拟页面的导航。 ...
- **Ajaxify网站**:通过 PJAX(Push State + AJAX)技术,实现页面导航的平滑过渡。 - **WebSockets**:对于需要双向实时通信的应用,可以考虑使用WebSockets替换AJAX。 总结,AJAX是现代Web开发中的重要技术,它...
可以通过服务器端渲染或使用History API和PushState来解决这个问题。 - **兼容性检查**:确保代码兼容各种浏览器,包括那些不支持Ajax的旧版浏览器。 总的来说,Ajax局部刷新分页通过异步通信实现了页面的高效、...