如何对当前页面产生某些影响的JavaScript操作,但也会更改浏览器中的URL,以便在用户点击重新加载或书签时使用新的URL?
如果后退按钮会重新加载原始URL也会很好 .
我试图在URL中记录JavaScript状态 .
对我有用的是 - history.replaceState() 功能如下 -
history.replaceState()
history.replaceState(data,"Title of page"[,'url-of-the-page']);
这不会重新加载页面,你可以利用它与javascript事件
如果您希望它在不支持 history.pushState 和 history.popState 的浏览器中工作,则"old"方式是设置片段标识符,这不会导致页面重新加载 .
history.pushState
history.popState
基本思路是将 window.location.hash 属性设置为包含所需状态信息的值,然后使用window.onhashchange event,或者对于不支持 onhashchange (IE <8,Firefox <3.6)的旧浏览器,定期检查以查看如果哈希值已更改(例如使用 setInterval )并更新页面 . 您还需要检查页面加载时的哈希值以设置初始内容 .
window.location.hash
onhashchange
setInterval
如果're using jQuery there'是一个hashchange plugin,它将使用浏览器支持的任何方法 . 我确信其他库也有插件 .
需要注意的一件事是在页面上与id冲突,因为浏览器将滚动到具有匹配id的任何元素 .
使用HTML 5,使用history.pushState function . 举个例子:
<script type="text/javascript"> var stateObj = { foo: "bar" }; function change_my_url() { history.pushState(stateObj, "page 2", "bar.html"); } var link = document.getElementById('click'); link.addEventListener('click', change_my_url, false); </script>
和一个href:
<a href="#" id='click'>Click to change url to bar.html</a>
如果要在不向后退按钮列表中添加条目的情况下更改URL,请改用 history.replaceState .
history.replaceState
window.location.href包含当前URL . 你可以从它读取,你可以附加它,你可以替换它,这可能会导致页面重新加载 .
如果,听起来像,你想在URL中记录javascript状态,以便它可以被加入书签,而不重新加载页面,在#之后将它附加到当前URL并且有onload事件触发的一段javascript解析当前用于查看其是否包含已保存状态的URL .
如果你使用?而不是#,你将强制重新加载页面,但由于你将在加载时解析保存的状态,这实际上可能不是一个问题;这将使前进和后退按钮也正常工作 .
我强烈怀疑这是不可能的,因为如果它是一个令人难以置信的安全问题 . 例如,我可以创建一个看起来像银行登录页面的页面,并使地址栏中的URL看起来就像真正的银行!
也许如果你解释为什么要这样做,人们可能会建议替代方法......
[编辑于2011年:自从我在2008年撰写此答案以来,有关HTML5 technique的更多信息已经曝光,只要它来自同一个来源,就可以修改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可以一起使用,例如:
pushState
history.pushState(null, null, $(this).attr('href'));
Example:
$('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; });
仅使用更改引用者的JavaScript history.pushState() ,在更改状态后创建的XMLHttpRequest对象的HTTP头中使用 .
history.pushState()
window.history.pushState("object", "Your New Title", "/new-url");
The pushState() method:
pushState() 有三个参数:状态对象, Headers (当前被忽略)和(可选)URL . 让我们更详细地研究这三个参数中的每一个:
pushState()
状态对象可以是任何可以序列化的对象 . 因为Firefox将状态对象保存到用户的磁盘,因此可以在用户重新启动浏览器后恢复它们,因此我们在状态对象的序列化表示上强加了640k字符的大小限制 . 如果传递序列化表示形式大于此值的状态对象 pushState() ,该方法将抛出异常 . 如果您需要更多空间,建议您使用sessionStorage和/或localStorage .
title - Firefox目前忽略此参数,尽管它将来可能会使用它 . 在此处传递空字符串应该可以安全地防止将来对方法进行更改 . 或者,您可以为您要移动的州通过一个简短的 Headers .
URL - 新历史记录条目's URL is given by this parameter. Note that the browser won' t尝试在调用 pushState() 之后加载此URL,但稍后可能会尝试加载URL,例如在用户重新启动浏览器之后 . 新URL不一定是绝对的;如果它's relative, it' s相对于当前URL解析 . 新URL必须与当前URL的源相同;否则, pushState() 将抛出异常 . 此参数是可选的;如果它不是't specified, it'设置为文档的当前URL .
有一个Yahoo YUI组件(浏览器历史记录管理器)可以处理这个:http://developer.yahoo.com/yui/history/
Facebook的照片库使用URL中的#hash来完成此操作 . 以下是一些示例网址:
在点击“下一步”之前:
/photo.php?fbid=496429237507&set=a.218088072507.133423.681812507&pid=5887027&id=681812507
点击“下一步”后:
/photo.php?fbid=496429237507&set=a.218088072507.133423.681812507&pid=5887027&id=681812507#!/photo.php?fbid=496435457507&set=a.218088072507.133423.681812507&pid=5887085&id=681812507
请注意hash-bang(#!)后面紧跟新URL .
有一个jquery插件http://www.asual.com/jquery/address/
我想这就是你需要的 .
我的代码是:
//change address bar function setLocation(curLoc){ try { history.pushState(null, null, curLoc); return false; } catch(e) {} location.hash = '#' + curLoc; }
和行动:
setLocation('http://example.com/your-url-here');
和例子
$(document).ready(function(){ $('nav li a').on('click', function(){ if($(this).hasClass('active')) { } else { setLocation($(this).attr('href')); } return false; }); });
就这样 :)
我想知道只要页面中的父路径相同,它是否可行,只会附加一些新的东西 .
所以就像让我们说用户在页面上一样: http://domain.com/site/page.html 然后浏览器可以让我做 location.append = new.html 并且页面变为: http://domain.com/site/page.htmlnew.html 并且浏览器不会更改它 .
http://domain.com/site/page.html
location.append = new.html
http://domain.com/site/page.htmlnew.html
或者只是允许此人更改get参数,所以让我们 location.get = me=1&page=1 .
location.get = me=1&page=1
因此原始页面变为 http://domain.com/site/page.html?me=1&page=1 并且它不刷新 .
http://domain.com/site/page.html?me=1&page=1
#的问题是当哈希值发生变化时,数据不会被缓存(至少我不这么认为) . 因此,就像每次加载新页面一样,而非页面中的后退和前进按钮能够缓存数据,而不会花时间重新加载数据 .
从我所看到的,雅虎历史事件已经一次加载所有数据 . 它似乎没有做任何Ajax请求 . 因此,当 div 用于处理超时的不同方法时,不会为每个历史状态存储该数据 .
div
我成功了:
location.hash="myValue";
它只是将 #myValue 添加到当前URL . 如果需要在页面Load上触发事件,则可以使用相同的 location.hash 来检查相关值 . 只需记住从 location.hash 返回的值中删除 # ,例如
#myValue
location.hash
#
var articleId = window.location.hash.replace("#","");
13 回答
对我有用的是 -
history.replaceState()
功能如下 -这不会重新加载页面,你可以利用它与javascript事件
如果您希望它在不支持
history.pushState
和history.popState
的浏览器中工作,则"old"方式是设置片段标识符,这不会导致页面重新加载 .基本思路是将
window.location.hash
属性设置为包含所需状态信息的值,然后使用window.onhashchange event,或者对于不支持onhashchange
(IE <8,Firefox <3.6)的旧浏览器,定期检查以查看如果哈希值已更改(例如使用setInterval
)并更新页面 . 您还需要检查页面加载时的哈希值以设置初始内容 .如果're using jQuery there'是一个hashchange plugin,它将使用浏览器支持的任何方法 . 我确信其他库也有插件 .
需要注意的一件事是在页面上与id冲突,因为浏览器将滚动到具有匹配id的任何元素 .
使用HTML 5,使用history.pushState function . 举个例子:
和一个href:
如果要在不向后退按钮列表中添加条目的情况下更改URL,请改用
history.replaceState
.window.location.href包含当前URL . 你可以从它读取,你可以附加它,你可以替换它,这可能会导致页面重新加载 .
如果,听起来像,你想在URL中记录javascript状态,以便它可以被加入书签,而不重新加载页面,在#之后将它附加到当前URL并且有onload事件触发的一段javascript解析当前用于查看其是否包含已保存状态的URL .
如果你使用?而不是#,你将强制重新加载页面,但由于你将在加载时解析保存的状态,这实际上可能不是一个问题;这将使前进和后退按钮也正常工作 .
我强烈怀疑这是不可能的,因为如果它是一个令人难以置信的安全问题 . 例如,我可以创建一个看起来像银行登录页面的页面,并使地址栏中的URL看起来就像真正的银行!
也许如果你解释为什么要这样做,人们可能会建议替代方法......
[编辑于2011年:自从我在2008年撰写此答案以来,有关HTML5 technique的更多信息已经曝光,只要它来自同一个来源,就可以修改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'));
Example:
仅使用更改引用者的JavaScript
history.pushState()
,在更改状态后创建的XMLHttpRequest对象的HTTP头中使用 .Example:
window.history.pushState("object", "Your New Title", "/new-url");
The pushState() method:
pushState()
有三个参数:状态对象, Headers (当前被忽略)和(可选)URL . 让我们更详细地研究这三个参数中的每一个:pushState()
创建的新历史记录条目相关联 . 每当用户导航到新状态时,都会触发popstate事件,并且事件的state属性包含历史记录条目的状态对象的副本 .状态对象可以是任何可以序列化的对象 . 因为Firefox将状态对象保存到用户的磁盘,因此可以在用户重新启动浏览器后恢复它们,因此我们在状态对象的序列化表示上强加了640k字符的大小限制 . 如果传递序列化表示形式大于此值的状态对象
pushState()
,该方法将抛出异常 . 如果您需要更多空间,建议您使用sessionStorage和/或localStorage .title - Firefox目前忽略此参数,尽管它将来可能会使用它 . 在此处传递空字符串应该可以安全地防止将来对方法进行更改 . 或者,您可以为您要移动的州通过一个简短的 Headers .
URL - 新历史记录条目's URL is given by this parameter. Note that the browser won' t尝试在调用
pushState()
之后加载此URL,但稍后可能会尝试加载URL,例如在用户重新启动浏览器之后 . 新URL不一定是绝对的;如果它's relative, it' s相对于当前URL解析 . 新URL必须与当前URL的源相同;否则,pushState()
将抛出异常 . 此参数是可选的;如果它不是't specified, it'设置为文档的当前URL .有一个Yahoo YUI组件(浏览器历史记录管理器)可以处理这个:http://developer.yahoo.com/yui/history/
Facebook的照片库使用URL中的#hash来完成此操作 . 以下是一些示例网址:
在点击“下一步”之前:
点击“下一步”后:
请注意hash-bang(#!)后面紧跟新URL .
有一个jquery插件http://www.asual.com/jquery/address/
我想这就是你需要的 .
我的代码是:
和行动:
和例子
就这样 :)
我想知道只要页面中的父路径相同,它是否可行,只会附加一些新的东西 .
所以就像让我们说用户在页面上一样:
http://domain.com/site/page.html
然后浏览器可以让我做location.append = new.html
并且页面变为:http://domain.com/site/page.htmlnew.html
并且浏览器不会更改它 .或者只是允许此人更改get参数,所以让我们
location.get = me=1&page=1
.因此原始页面变为
http://domain.com/site/page.html?me=1&page=1
并且它不刷新 .#的问题是当哈希值发生变化时,数据不会被缓存(至少我不这么认为) . 因此,就像每次加载新页面一样,而非页面中的后退和前进按钮能够缓存数据,而不会花时间重新加载数据 .
从我所看到的,雅虎历史事件已经一次加载所有数据 . 它似乎没有做任何Ajax请求 . 因此,当
div
用于处理超时的不同方法时,不会为每个历史状态存储该数据 .我成功了:
它只是将
#myValue
添加到当前URL . 如果需要在页面Load上触发事件,则可以使用相同的location.hash
来检查相关值 . 只需记住从location.hash
返回的值中删除#
,例如