- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我想在不重新加载的情况下更改 html。我喜欢这样做:
$('#left_menu_item').click(function(e) {
if (!!(window.history && history.pushState)) {
e.preventDefault();
history.pushState(null, null, newUrl);
}
});
它工作正常。但是如果我想用“后退”按钮返回 - 浏览器更改以前的 url,但它不会重新加载页面。为什么?
最佳答案
此行为是预期的并且符合 specifications操纵历史堆栈。
这是一个解释起来比较复杂的问题。但简而言之,可以这样想:用户在历史堆栈上推送的任何历史条目(使用 pushState 等)在您从它移动时都不值得页面加载,因为它被认为是伪造的(用户生成的)历史条目。
为什么?这种行为是一件好事,并且符合让开发人员更好地控制页面而不必被迫重新加载它的意图(把它想象成 ajax:你可以做以前只能通过页面重新加载才能实现的事情,比如获取数据,但是现在您可以使用 XMLHttpRequest 对象在不重新加载页面的情况下执行此操作)。如果您想模仿单击后退按钮时重新加载页面的行为。您可以简单地调用 location.reload()
当你处理 window.onpopstate
事件时
如何?这可能超出了您的问题范围,但我只是想把它放在那里来描述我们正在谈论的内容
让我用一个现有的例子来解释here (摘录的文字将斜体):
假设 http://mozilla.org/foo.html执行以下 JavaScript:
var stateObj = { foo: "bar" };
history.pushState(stateObj, "page 2", "bar.html");
这将导致 URL 栏显示 http://mozilla.org/bar.html ,但不会导致浏览器加载 bar.html,甚至不会检查 bar.html 是否存在。
将其视为您在历史堆栈中创建一个与实际页面加载无关的条目.. 而不是“假”页面加载(即您只是使用 javascript 来操作 dom 并插入 html) ..
现在假设用户现在导航到 http://google.com ,然后点击返回。此时地址栏会显示http://mozilla.org/bar.html , 并且该页面将获得一个 popstate 事件,其状态对象包含一个 stateObj 的副本。该页面本身看起来像 foo.html,尽管该页面可能会在 popstate 事件期间修改其内容。
这里的要点是 bar.html 是位于原始 http://mozilla.org/foo.html 之上的虚假历史记录条目.. 所以你会在 url 上看到 http://mozilla.org/bar.html但内容将属于 foo(在本例中,请注意,当我们推送 bar.html 时,我们没有操纵 dom 的内容。如果我们在您的示例中这样做了……那么该内容也会显示出来)。这里的关键是页面重新加载!.. 因为我们提供的页面在历史堆栈上有一个 genuin 条目(即使在 url.. 我们正在显示一个关联的 url在历史堆栈上有一个虚假的条目)。
还将此讨论与手动处理 popstate 事件的页面分开。那是另一回事,只会使事情复杂化。
如果我们再次点击返回,URL 将变为 http://mozilla.org/foo.html ,文档将获得另一个 popstate 事件,这次带有一个空状态对象。在这里,返回也不会更改文档的内容与上一步中的内容相同,尽管文档可能会在收到 popstate 事件后手动更新其内容。
这里..页面不会加载!..那是因为我们正在从一个虚假的历史堆栈条目转移到真实的(真实的已经在上一步中加载了) .. 所以页面重新加载就是这样)。
例子就是这样。这个概念有点难以解释,我鼓励您通过点击真实和虚假页面的组合来测试您的代码,您将看到页面何时实际加载和何时不加载的模式。
关于javascript - history.pushState - 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14824766/
所以基本上我正在开发一个 Ionic/React Typescript 应用程序,当我导航到应用程序时,这个奇怪的页面转换发生了两次(见下面的 gif) 我检查了一下,不是渲染调用了两次,因为 com
我正在开发一个 ember 应用程序(使用 ember-1.0.pre.js)。我正在尝试在 IE8 上提供跨浏览器兼容性。 问题在于每次转换后都会生成 url,这对用户来说似乎不正确/错误。假设我点
使用 pry 插件:pry-clipboard 当我输入“copy-history”来复制我历史的最后一行时,它实际上是在复制“copy-history”并粘贴“copy-history”。 我是不是
我正在开发一个我想使用的 React 应用程序 @types/history模块.. 已安装 npm install --save @types/history 在我的组件文件中尝试导入 import
我刚刚在 Google Chrome 中打开了一个带有少量基本标签(如 html、body、head 等)的空白 HTML 页面,并尝试在控制台中执行以下命令: history.pushState(n
我在我的网络浏览器中调用了一些 javascript。目的是获取 history.length,如果长度 == 0,则在按下后退键时退出应用程序。 所以我使用了 window.external.not
具体来说,调用下面的代码片段: history.replaceState(undefined, undefined, "#" + value) 不会正确地影响当前页面的后退按钮行为,但会向“浏览历史”
为什么我要使用 react-router-dom 中的路由器历史记录而不是 window.history.back()? 有没有一种方法可以检测用户是否来 self 的应用程序中的某个页面或来自特定外
我为 angular.js 中内置的 phonegap 应用程序设置了一些后退/下一步按钮。 我正在为页面使用 Angular 部分,并使用 window.history 作为一些简单的后退/下一步按
我正在通过 Ajax 加载页面。当用户单击链接时,页面已成功加载 AJAX,但当用户单击后退按钮时,页面会重新加载初始页面。所以场景是这样的。 载入初始页面(index.php) 用户点击链接 页面加
这个问题在这里已经有了答案: How to get notified about changes of the history via history.pushState? (16 个答案) 关闭
History API使得在浏览器历史记录中存储状态对象成为可能。现在试试 this demo (但它与其他任何行为相同,请选择您最喜欢的 :)): 点击一些链接建立一些历史 清除您的浏览器历史记录(
我正在开发一个网站,我需要返回到我访问过的页面。我正在使用parent.history.back。我的一位 friend 建议使用 window.history.back 而不是 Parent.his
几年前,我的一个 Perforce depot 中的一个子文件夹(例如 //FirstDepot/LargeSubfolder/...)变得太大而无法维护,所以我将它“迁移”到一个它自己的仓库(例如
到目前为止,我已经阅读了很多有关 React-router v4 和 npm 历史库的内容,但似乎没有一个对我有帮助。 我的代码按预期运行,当使用 History.push() 方法更改 url 时,
我正在通过phonegap做移动html页面我想将用户重定向到首页。所以我无法给出直接链接,例如指向index.html的href 当用户单击 Logo 时,我想计算他访问的页面长度并使用 histo
使用 django-simple-history ,如何从我的模型中获取最后更改的对象? 我尝试了 MyModel.history.most_recent(),它需要一个模型实例,因此可能会返回所选实
过去,如果我不确定某些内容是否受支持, 我将在 Javascript 中输入 If(something){ ... }。 最近我发现Modernizr也很容易检测浏览器的支持。 它将向 HTML 添加
我尝试在应用程序中使用 history.replace('/user') 重定向用户,但是当我这样做时,它什么也没做。我正在使用 Auth0 并遵循他们的指南: https://auth0.com/d
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(), metrics=['accuracy
我是一名优秀的程序员,十分优秀!