我怎么会有一个JavaScript的行动,可能在当前页面上有一定的影响,但也将改变URL在浏览器中,所以如果用户点击刷新或书签的新页面新的网址被使用?更改浏览器的URL,而无需加载使用JavaScript
如果后退按钮将重新加载原始URL,这也会很好。
我想在URL中记录JavaScript状态。
我怎么会有一个JavaScript的行动,可能在当前页面上有一定的影响,但也将改变URL在浏览器中,所以如果用户点击刷新或书签的新页面新的网址被使用?更改浏览器的URL,而无需加载使用JavaScript
如果后退按钮将重新加载原始URL,这也会很好。
我想在URL中记录JavaScript状态。
如果你想让它在不支持history.pushState
和history.popState
但浏览器,“旧”的方法是修改设置片段标识符,这不会导致页面重新加载。
的基本思想是将window.location.hash
属性设置为包含任何你需要的状态信息,然后可以使用window.onhashchange event,或不支持onhashchange
旧的浏览器(IE < 8,火狐3.6 <)的值,定期检查哈希是否已更改(例如使用setInterval
)并更新页面。您还需要在页面加载时检查散列值以设置初始内容。
如果你正在使用jQuery有一个hashchange plugin将使用哪种方法浏览器支持。我相信也有其他库的插件。
有一两件事要小心与网页上的IDS碰撞,因为浏览器将滚动具有匹配ID的任何元素。
我强烈怀疑这是不可能的,因为如果是这样的话,那将是一个难以置信的安全问题。例如,我可以创建一个看起来像银行登录页面的页面,并使地址栏中的URL看起来像,就像真正的银行一样!
或许,如果你解释为什么你想这样做,人们也许能够提出备选方法...
[编辑2011年:因为我在2008年写了这个答案,更多信息已经到了光对于一个HTML5 technique允许的URL,只要它是来自同一产地】
如果非重载更改仅限于路径,查询字符串和片段,那么问题不大。不是权威(域名等)。 – 2010-06-16 14:16:42
http://www.youtube.com/user/SilkyDKwan#p/u/2/gTfqaGYVfMg是一个可能的例子,请尝试切换视频:) – Spidfire 2010-08-19 20:54:40
浏览器安全设置可以防止用户直接修改显示的网址。您可以想象会导致的网络钓鱼漏洞。
只有在不更改页面的情况下更改url才是可靠的方法,那就是使用内部链接或散列。例如:http://site.com/page.html变为http://site.com/page.html#item1。这种技术通常用于hijax(AJAX +保留历史记录)。
做这件事时,我会往往只是用来与哈希作为HREF的动作链接,然后点击添加与使用所请求的散列值来确定,并委托行动jQuery的事件。
我希望能让你走上正确的道路。
window.location.href包含当前的URL。您可以从中读取,您可以附加到它,并且可以替换它,这可能会导致页面重新加载。
如果听起来像是想要在URL中记录JavaScript状态,以便可以将其加入书签,而无需重新加载页面,可以在#之后将它追加到当前URL并且具有一段由onload触发的JavaScript事件解析当前URL以查看它是否包含保存的状态。
如果您使用?而不是#,你会强制重新加载页面,但由于你将解析加载时保存的状态,这可能实际上不成问题;这会使前进和后退按钮正常工作。
有一个雅虎的YUI组件(浏览器历史记录管理器),它可以处理这个问题:http://developer.yahoo.com/yui/history/
我想知道它是否会只要更多钞票作为页面的父路径是一样的,只是新的东西附加到它。
所以像我们说的用户在页面:http://domain.com/site/page.html
然后,浏览器可以让我做location.append = new.html
和页面变为:http://domain.com/site/page.htmlnew.html
和浏览器不改变它。
或者只是允许该人更改获取参数,所以让我们location.get = me=1&page=1
。
原来的页面变成了http://domain.com/site/page.html?me=1&page=1
,它不刷新。
#的问题是当散列被改变时数据没有被缓存(至少我不这么认为)。因此,每次加载新页面时都是如此,而非Ajax页面中的后退和前进按钮能够缓存数据,并且不会花费时间重新加载数据。
从我所看到的,雅虎的历史事物已经加载所有的数据一次。它似乎没有做任何Ajax请求。因此,当使用div
来处理不同的超时方法时,不会为每个历史记录状态存储该数据。
对于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>
和A HREF:
<a href="#" id='click'>Click to change url to bar.html</a>
如果你想改变URL而不增加后退按钮列表中的条目,使用history.replaceState
代替。
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
注意哈希爆炸(#!)紧跟新URL。
哈希=“文本”有一个jQuery插件http://www.asual.com/jquery/address/
我觉得这是你所需要的。
的jQuery有改变浏览器的网址,称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;
});
仅使用的JavaScripthistory.pushState()
,它更改引用链接器,该引用链接器在更改状态后创建的XMLHttpRequest对象的HTTP标头中使用。
实施例:
window.history.pushState("object", "Your New Title", "/new-url");
的pushState的()方法:
pushState()
三个参数:一个状态对象,一个标题(这是目前忽略),和(任选地)一个URL。让我们来看看这三种参数的详细信息:
状态对象 - 国家目标是将它与pushState()
创建新的历史条目相关的JavaScript对象。只要用户导航到新状态,就会触发popstate事件,并且事件的state属性包含历史记录条目状态对象的副本。
状态对象可以是任何可以序列化的对象。由于Firefox会将状态对象保存到用户的磁盘,以便在用户重新启动浏览器后可以恢复它们,所以我们在状态对象的序列化表示上强加了640k字符的大小限制。如果您将一个其序列化表示大于此值的状态对象传递给pushState()
,则该方法将引发异常。如果您需要更多空间,建议您使用sessionStorage和/或localStorage。
标题 - Firefox目前忽略此参数,虽然它可能在将来使用它。在这里传递空字符串应该对未来对该方法的更改是安全的。或者,您可以为您所移动的州份传递简短的标题。
URL - 新的历史记录条目的URL由此参数给出。请注意,浏览器在调用pushState()
后不会尝试加载此URL,但它可能会尝试稍后加载URL,例如在用户重新启动浏览器之后。新的URL不需要是绝对的;如果它是相对的,它将相对于当前的URL进行解析。新的URL必须与当前网址的来源相同;否则,pushState()
会抛出异常。该参数是可选的;如果未指定,则将其设置为文档的当前URL。
我的代码是:
//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;
});
});
这是所有:)
我已经受够了成功:
location.hash="myValue";
它只是增加#myValue
到当前的URL。如果您需要在页面加载中触发事件,则可以使用相同的location.hash
来检查相关的值。请记住从location.hash
返回的值中删除#
,例如
var articleId = window.location.hash.replace("#","");
这会很好。当然,它只限于同域修改。但是,对于许多应用程序来说,页面重新加载是一种“最后的手段”,因此对路径的某些客户端控制(而不仅仅是哈希)是合理的步骤。 – harpo 2010-03-26 17:25:50
对于(i = 1; i <50; i ++){var txt =“..................)”推送状态“ ................................ “TXT = txt.slice(0,I)+” HTML5" + TXT .slice(i,txt.length); history.pushState({},“html5”,txt);}` – 2012-03-07 03:34:38
这个效果的例子:http://www.dujour.com/ – Ben 2012-08-31 17:26:35