如何在不刷新页面的情况下更改URI
How can I change the URI without refreshing the page?
我已经用CodeIginer建立了一个网站,我想在我的一个页面中实现AJAX和JQuery。问题是,当我加载内容时,URL不会更改。
假设我有这些URI:
http://www.example.com/controller/function/param
http://www.example.com/controller/function/param2
单击按钮时,如何从第一个更改为第二个?
在HTML5中,您可以更改URL:
window.history.pushState("object or string", "Title", "/new-url");
检查http://spoiledmilk.com/blog/html5-changing-the-browser-url-without-refreshing-page/
文档:https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#The_pushState().c2.a0方法
更新
概述哪些浏览器支持新的HTML5历史API:
http://caniuse.com/#search=pushState(caniuse.com值得收藏!)
已经有一些框架为您做了艰苦的工作,甚至可以优雅地回退到常见的哈希标签解决方案:
History.js
History.js优雅地支持HTML5历史/状态API(pushState、replaceState、onPopState)。包括…在内继续支持数据、标题、replaceState。支持jQuery,MooTools和原型。对于HTML5浏览器,这意味着您可以直接修改URL,无需再使用哈希。对于HTML4浏览器将恢复使用旧的onhashchange功能。
Backbone.js
Backbone通过为模型提供键值绑定和自定义事件、集合具有丰富的可枚举函数API,具有声明性事件的视图处理,并通过RESTful JSON接口。。。。pushState支持存在于Backbone中的纯选择加入基础上。不支持pushState的旧浏览器将继续使用基于哈希的URL片段,并且如果具有pushState功能的浏览器,它将透明地升级为真正的URL。
Mootools(通过插件)
MooTools是一个紧凑、模块化、面向对象的JavaScript框架,专为中级到高级JavaScript开发人员设计。[…]通过popstate或hashchange进行历史记录管理。在不重新加载的情况下替换页面的URL,并返回到旧版本上的Hashchange浏览器。
dojo工具包
Dojo使用web标准作为其平台。这是经验丰富的开发人员用来构建高层建筑的工具包高质量的桌面和移动web应用程序。[…]dojox.app管理导航通过HTML5 pushState标准的历史记录,并将其委托给启用浏览器历史管理。
仅举几个例子。
(!!)小心
使用pushState
时的一个重要副作用(引用自主干文档):
请注意,使用真实的URL需要您的web服务器能够正确呈现这些页面,因此需要对后端进行更改好例如,如果您的路由为/documents/100,则您的web如果浏览器访问该URL,服务器必须能够为该页面提供服务直接地对于完整的搜索引擎可爬网性,最好具有服务器为页面生成完整的HTML。。。但是如果是一个网络应用程序,只是呈现与根URL,并用主干视图和JavaScript填充其余部分工作良好。
可以使用哈希(#),然后放任何你喜欢的东西。
这是我用这个创建的一个网站,然后我让JavaScript读取哈希并调用适当的函数:
http://bannerhouse.com.au/#/popup=media&id=打开
旁注:
这对于flash网站或flash内容也很有用;您可以使用FlashVars将哈希值解析到SWF,并在此基础上加载适当的部分/屏幕。
通过Javascript使用哈希标记,因此在按钮的点击事件处理程序中:location.hash = "param2"
这将改变http://example.com/mypage/#whatever到http://example.com/mypage/#param2
当然,你也可以把你的"文件夹"放在散列之后,所以,用一个http://example.com/然后添加:location.hash = "/MyPage/MySubPage/MyInfo";
将其更改为http://example.com/#/MyPage/MySubPage/MyInfo
类似的线程推断出no,除非使用哈希标记。
有人提出了一个想法,但强烈反对使用204HTTP响应。
来自W3:
无响应204
服务器已收到请求,但没有要发送回的信息,客户应该保持原样文档视图。这主要是为了输入脚本而不更改文件。
以下是WHATWG的HTML生活标准(以前称为HTML5)的相关摘录,§7.10.2浏览上下文的会话历史:
会话历史记录中的几个连续条目可以共享同一文档。当通过正常导航到达初始条目,并通过
history.pushState()
添加以下条目时,可能会发生这种情况。或者它可以通过导航到片段来发生。
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 在不阻止默认行为的情况下检测IE10中的缩放
- 如何在不传递此信息的情况下查找被调用的元素
- 如何在不刷新页面的情况下更新显示框
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- JavaScript-在手机上不工作的情况下,在外部单击时隐藏元素
- 在我的情况下,如何进行http请求
- 在不知道深度或父属性的情况下从对象中删除属性
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- ROR:如何在不重新加载浏览器的情况下从控制器获取参数
- 如何在不影响其他元素的情况下扩展DIV
- 如何在内联依赖项并将图像转换为dataURI的情况下完全提取网页
- 在不移动内部文本的情况下缩放元素的效果
- 在不设置协议的情况下,使用javascript/jquery更改iframe-src
- 在不重新加载页面的情况下更改浏览器URI
- 如何在不刷新页面的情况下更改URI
- 如何在没有 FileReader 的情况下从 Blob 和 File 对象创建 ArrayBuffer 和数据 URI