我如何使用可能对当前页面产生一些影响的JavaScript操作,但也会更改浏览器中的URL,以便在用户点击重新加载或书签时使用新URL?
如果后退按钮会重新加载原始URL也会很好.
我试图在URL中记录JavaScript状态.
如果你想让它在不支持的浏览器工作history.pushState
和history.popState
呢,"老字号"的方法是设置片段标识符,这将不会导致页面重新加载.
基本思想是将window.location.hash
属性设置为包含所需状态信息的值,然后使用window.onhashchange事件,或者对于不支持的旧浏览器onhashchange
(IE <8,Firefox <3.6),定期检查查看散列是否已更改(setInterval
例如使用)并更新页面.您还需要检查页面加载时的哈希值以设置初始内容.
如果您正在使用jQuery,那么将使用一个hashchange插件,该插件将使用浏览器支持的任何方法.我确信其他库也有插件.
需要注意的一件事是在页面上与id冲突,因为浏览器将滚动到具有匹配id的任何元素.
使用HTML 5,使用该history.pushState
功能.举个例子:
和一个href:
Click to change url to bar.html
如果要在不向后退按钮列表中添加条目的情况下更改URL,请history.replaceState
改用.
window.location.href包含当前URL.你可以从它读取,你可以附加它,你可以替换它,这可能会导致页面重新加载.
如果,听起来像,你想在URL中记录javascript状态,以便它可以被加入书签,而不重新加载页面,在#之后将它附加到当前URL并且有onload事件触发的一段javascript解析当前用于查看其是否包含已保存状态的URL.
如果你使用?而不是#,你将强制重新加载页面,但由于你将在加载时解析保存的状态,这实际上可能不是一个问题; 这将使前进和后退按钮也正常工作.
我强烈怀疑这是不可能的,因为如果它是一个令人难以置信的安全问题.例如,我可以创建一个看起来像银行登录页面的页面,并使地址栏中的URL看起来就像真正的银行!
也许如果你解释为什么要这样做,人们可能会建议替代方法......
[编辑于2011年:自从我在2008年撰写此答案以来,有关HTML5技术的更多信息已经曝光,只要它来自同一个来源,就可以修改URL]
浏览器安全设置可防止用户直接修改显示的URL.您可以想象可能导致的网络钓鱼漏洞.
只有在不更改页面的情况下更改URL的可靠方法是使用内部链接或散列.例如:http://site.com/page.html成为http://site.com/page.html#item1.这种技术通常用于hijax(AJAX +保存历史).
执行此操作时,我通常只使用带有散列的操作的链接作为href,然后使用jquery添加单击事件,使用请求的散列来确定和委派操作.
我希望这会让你走上正确的道路.
jQuery有一个很棒的插件,用于更改浏览器的URL,称为jQuery-pusher.
JavaScript pushState
和jQuery可以一起使用,例如:
history.pushState(null, null, $(this).attr('href'));
例:
$('a').click(function (event) { // Prevent default click action event.preventDefault(); // Detect if pushState is available if(history.pushState) { history.pushState(null, null, $(this).attr('href')); } return false; });
仅使用 history.pushState()
更改引用者的JavaScript,在更改状态后创建的XMLHttpRequest对象的HTTP头中使用.
例:
window.history.pushState("object", "Your New Title", "/new-url");
pushState()方法:
pushState()
采用三个参数:状态对象,标题(当前被忽略)和(可选)URL.让我们更详细地研究这三个参数中的每一个:
state对象 - state对象是一个JavaScript对象,它与创建的新历史记录条目相关联pushState()
.每当用户导航到新状态时,都会触发popstate事件,并且事件的state属性包含历史记录条目的状态对象的副本.
状态对象可以是任何可以序列化的对象.因为Firefox将状态对象保存到用户的磁盘,因此可以在用户重新启动浏览器后恢复它们,因此我们在状态对象的序列化表示上强加了640k字符的大小限制.如果传递序列化表示形式大于此值的状态对象pushState()
,则该方法将引发异常.如果您需要更多空间,建议您使用sessionStorage和/或localStorage.
title - Firefox目前忽略了这个参数,虽然它可能在将来使用它.在此处传递空字符串应该可以安全地防止将来对方法进行更改.或者,您可以为您要移动的州通过一个简短的标题.
URL - 此历史记录条目的URL由此参数指定.请注意,浏览器在调用后不会尝试加载此URL pushState()
,但可能会稍后尝试加载URL,例如在用户重新启动浏览器之后.新URL不一定是绝对的; 如果是相对的,则相对于当前URL进行解析.新URL必须与当前URL的源相同; 否则,pushState()
将抛出异常.此参数是可选的; 如果未指定,则将其设置为文档的当前URL.