Url 有没有办法更改浏览器';是否在不刷新页面的情况下创建地址栏?

Url 有没有办法更改浏览器';是否在不刷新页面的情况下创建地址栏?,url,address-bar,Url,Address Bar,我正在开发一个网络应用程序。在其中,我有一个名为categories的部分,每当用户单击其中一个类别时,更新面板就会加载相应的内容 用户单击类别后,我想更改浏览器的地址栏url www.mysite.com/products 差不多 www.mysite.com/products/{selectedCat} 不刷新页面。 是否有某种JavaScript API可用于实现此目的?我认为这是不可能的(至少更改为完全不同的地址),因为这将是对地址栏的非直观滥用,并且可能会促进网络钓鱼攻击。我认

我正在开发一个网络应用程序。在其中,我有一个名为categories的部分,每当用户单击其中一个类别时,更新面板就会加载相应的内容

用户单击类别后,我想更改浏览器的地址栏url

www.mysite.com/products 
差不多

www.mysite.com/products/{selectedCat} 
不刷新页面。

是否有某种JavaScript API可用于实现此目的?

我认为这是不可能的(至少更改为完全不同的地址),因为这将是对地址栏的非直观滥用,并且可能会促进网络钓鱼攻击。

我认为,出于安全原因,如果您对地址栏的使用感到满意,那么不允许直接将地址栏操纵到完全不同的url而不移动到该url

www.mysite.com/products/#{selectedCat}

i、 e.在同一页面中创建一个锚样式链接,然后查看大多数javascript库中存在的各种历史记录/返回按钮脚本


提到update panel,我猜想您正在使用asp.net,在这种情况下,asp.net ajax历史记录控件是一个很好的起点

这不能像您所说的那样完成。somej.net建议的方法是您能得到的最接近的方法。这实际上是AJAX时代非常普遍的做法。即使是Gmail也会使用这个功能。

来添加那些家伙已经说过的内容,编辑window.location.hash属性,以匹配onclick函数中需要的URL

window.location.hash = 'category-name'; // address bar would become http://example.com/#category-name
“window.location.hash”


正如sanchothefat所建议的,这应该是唯一的方法。因为我看到的所有地方都有这个功能,它总是在#in URL之后。

使用HTML5,您可以修改URL而无需重新加载:

如果您想在浏览器历史记录中创建新帖子(即“后退”按钮将起作用)

如果您只想更改url而无法返回

window.history.replaceState('Object', 'Title', '/another-new-url');
该对象可用于ajax导航:

window.history.pushState({ id: 35 }, 'Viewing item #35', '/item/35');

window.onpopstate = function (e) {
  var id = e.state.id;
  load_item(id);
};
请在此处阅读更多信息:


回退解决方案:

我认为您不应该不直观,而应该能够做到这一点,因为它可能被误用为网络钓鱼攻击。总之,那是+1。是的,我刚刚想到了。这不是个好主意。谢谢主持人。我认为这是可能的。。。查看维基地图。。。当你拖动地图时,URL会改变…@Shivasubramanian-a:我查看了Wikimapia,事实上,他们只是使用了somej建议和Sanchooffat描述的技术:只是改变锚名称。这是对网络钓鱼安全…+1也注意;这些更改URL中的
路径
和/或
查询字符串
;他们不能更改协议、域或端口(正如其他人指出的那样,这将是一个安全问题)。上面的
hash
函数可以更改锚点(或片段id),只是说,在您的示例'/item/35'}中,有一个额外的}addedJust作为附带问题,有没有一种方法可以让这些url在Google中被索引?一个更好的库似乎是它被积极维护和广泛使用,而fortes-history.js闲置了3年。请注意firefox不支持标题,所以请使用document.title=“new title”。有没有办法在url中不使用“#”符号来更改url?
window.history.pushState({ id: 35 }, 'Viewing item #35', '/item/35');

window.onpopstate = function (e) {
  var id = e.state.id;
  load_item(id);
};