在浏览器中更改 URL 而不使用 JavaScript 加载新页面

IT技术 javascript url html5-history fragment-identifier hashchange
2021-01-27 15:46:23

我怎么会有一个JavaScript动作,它可能会对当前页面产生一些影响,但也会改变浏览器中的 URL,所以如果用户点击重新加载或书签,然后使用新的 URL?

如果后退按钮重新加载原始 URL,那也很好。

我正在尝试在 URL 中记录 JavaScript 状态。

6个回答

如果你想让它在不支持的浏览器的工作history.pushStatehistory.popState还没有,“老字号”的方法是设置片段标识符,这将不会导致页面重新加载。

基本思想是将window.location.hash属性设置为包含您需要的任何状态信息的值,然后使用window.onhashchange 事件,或者对于不支持的旧浏览器onhashchange(IE < 8,Firefox < 3.6),定期检查以查看哈希是否已更改(setInterval例如使用)并更新页面。您还需要检查页面加载时的哈希值以设置初始内容。

如果您使用 jQuery,则有一个hashchange 插件可以使用浏览器支持的任何方法。我确定其他库也有插件。

需要注意的一件事是与页面上的 id 冲突,因为浏览器会滚动到任何具有匹配 id 的元素。

现在有一个让搜索引擎看到哈希值的提议:googlewebmastercentral.blogspot.com/2009/10/...
2021-03-12 15:46:23
搜索引擎不会忽略这些内部链接(哈希)吗?在我的场景中,我希望蜘蛛也能获取这些链接。
2021-03-13 15:46:23
@gabeDel 是的,虽然我认为 Analytics 不会记录散列,但它会有相同的 URL。更好的方法是_trackPageview使用新页面的“真实”URL手动调用
2021-03-15 15:46:23
而不是使用setInterval来检查document.location.hash一个可以使用hashchange事件,因为它被更多地采用。在此处查看支持每种标准的浏览器我目前的方法是在支持它的浏览器上使用 push/popState。在其他方面,我设置了哈希值,仅hashchange在支持的浏览器中观看这使得 IE<=7 没有历史支持,但有有用的永久链接。但是谁在乎 IE<=7 的历史呢?
2021-03-21 15:46:23
@Drew,据我所知,搜索引擎无法将页面的一部分视为单独的结果。
2021-03-23 15:46:23

对于 HTML 5,使用history.pushState函数. 举个例子:

<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改用。

发布此评论后,它适用于 Firefox chrome 和 safari。不过,ipad 或 iphone 上的移动 safari 不走运:(
2021-03-16 15:46:23
你说得对,我上次尝试 Chrome 时。我刚刚在我的 Ubuntu 上尝试使用 Firefox 3.6,它没有用。我想我们必须等到 FF 完全支持 HTML5
2021-03-20 15:46:23
示例代码是从developer.mozilla.org/en/DOM/Manipulating_the_browser_history剪切和粘贴的在这种情况下,这实际上很难解释 foo 和 bar 的含义。
2021-03-21 15:46:23
@Paul:是的,上面的文章提供了这些信息。
2021-03-26 15:46:23
foo 和 bar 没有任何意义,它是一个任意定义的状态对象,您可以稍后返回。
2021-04-07 15:46:23

window.location.href 包含当前 URL。你可以读取它,你可以附加到它,你可以替换它,这可能会导致页面重新加载。

如果,听起来像,您想在 URL 中记录 javascript 状态以便可以将其添加为书签,而无需重新加载页面,请将其附加到 # 后的当前 URL 并让一段由 onload 事件触发的 javascript 解析当前用于查看它是否包含已保存状态的 URL。

如果您使用 ? 代替#,您将强制重新加载页面,但由于您将在加载时解析保存的状态,这实际上可能不是问题;这将使前进和后退按钮也能正常工作。

在 URL 中记录 javascript 状态正是我想要做的
2021-03-20 15:46:23

我强烈怀疑这是不可能的,因为如果是这样,那将是一个令人难以置信的安全问题。例如,我可以制作一个看起来像银行登录页面的页面,并使地址栏中的 URL 看起来像真正的银行

也许如果您解释为什么要这样做,人们可能会建议替代方法......

[2011 年编辑:自从我在 2008 年写下这个答案以来,关于HTML5 技术的更多信息已经曝光,该技术允许修改 URL,只要它来自同一来源]

您只能更改 location.hash(# 之后的所有内容),正如 Matthew Chumley 在接受的答案中指出的那样。
2021-03-23 15:46:23
如果非重新加载更改仅限于路径、查询字符串和片段,即不是权限(域等),则问题不大。
2021-03-29 15:46:23
你用脸书吗?Facebook无需重新加载即可更改 URL ,使用history.pushState().
2021-03-29 15:46:23
Paul Dixon,你应该注意到facebook的收件箱,当你点击左边的名字时,只是改变了URL并且在聊天框中加载了新的聊天,页面没有刷新。WebGL 上还有更多网站,他们也做同样的事情
2021-04-01 15:46:23
youtube.com/user/SilkyDKwan#p/u/2/gTfqaGYVfMg是一个可能的例子,尝试切换视频:)
2021-04-09 15:46:23

jQuery有一个很棒的插件来改变浏览器的 URL,叫做jQuery-pusher

JavaScriptpushState和 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;
});

仅使用JavaScript history.pushState(),它更改引用者,在更改状态后创建的 XMLHttpRequest 对象的 HTTP 标头中使用该引用者。

例子:

window.history.pushState("object", "Your New Title", "/new-url");

pushState() 方法:

pushState()接受三个参数:一个状态对象、一个标题(当前被忽略)和(可选)一个 URL。让我们更详细地检查这三个参数中的每一个:

  1. 状态对象— 状态对象是一个 JavaScript 对象,它与由 创建的新历史条目相关联pushState()每当用户导航到新状态时,都会触发 popstate 事件,并且该事件的 state 属性包含历史条目状态对象的副本。

    状态对象可以是任何可以序列化的对象。因为 Firefox 将状态对象保存到用户的磁盘,以便在用户重新启动浏览器后可以恢复它们,所以我们对状态对象的序列化表示施加了 640k 个字符的大小限制。如果将序列化表示大于 this 的状态对象传递给pushState(),则该方法将引发异常。如果您需要更多空间,我们鼓励您使用 sessionStorage 和/或 localStorage。

  2. title — Firefox 当前忽略此参数,但将来可能会使用它。在这里传递空字符串应该是安全的,以防将来对方法进行更改。或者,您可以为要移动的州传递一个简短的标题。

  3. URL — 新历史条目的 URL 由该参数给出。请注意,浏览器不会在调用 后尝试加载此 URL pushState(),但它可能会稍后尝试加载该 URL,例如在用户重新启动浏览器后。新的 URL 不需要是绝对的;如果是相对的,则相对于当前 URL 进行解析。新 URL 必须与当前 URL 同源;否则,pushState()将抛出异常。该参数是可选的;如果未指定,则将其设置为文档的当前 URL。