我发现的问题与这个问题非常相似,只是台式机上的Safari似乎已经解决了这个问题.基本上,问题是:当客户端浏览移动版Safari并且页面在pagea.html上执行javascript函数时,然后导航到pageb.html,然后按后退按钮返回pagea.html,javascript函数当客户端按下后退按钮返回pagea.html时,将不会运行.它将跳过javascript调用.
我已经尝试过上面链接中提到的解决方案,但似乎没有什么适用于移动Safari.还有其他人遇到过这个bug吗?你是怎么处理的呢?
截至最近的safari 5已经发布,结果导致我的网站出现了一些问题.我有一个运行经典ASP的动态网站(虽然这应该不重要),并且该网站对历史堆栈有一些创造性的使用.例如,您可以在列出产品的页面上,然后转到有关产品的详细信息并更改产品(admin-view).单击产品上的"保存"时,信息将通过AJAX发送到服务器,并history.back()发出a.这适用于所有浏览器(包括safari <= 4),但是,在新发布的Safari 5中它停止工作.似乎当您在safari 5中单击它实际上并不刷新页面时,它只会从缓存中加载它,这意味着不会显示在详细信息视图中所做的更改.我怎样才能在safari 5中进行这项工作呢?这是我必须关闭缓存的当前代码(包含在每个页面的顶部):
Dim pStr
pStr = "private, no-cache, no-store, must-revalidate"
Response.AddHeader "pragma","no-cache" '?
Response.AddHeader "cache-control", pStr '? Er ikke sikker på om disse 3 siste er nødvendige.
Response.AddHeader "cache-control", "post-check=0, pre-check=0" '? Er ikke sikker på om disse 3 siste er nødvendige.
Response.AddHeader "Expires", "Mon, 26 Jul 1997 05:00:00 GMT" '?
Response.AddHeader "Last-Modified", Now()
Run Code Online (Sandbox Code Playgroud) 我使用.htaccess将我的所有流量路由到单个index.php文件.下面的代码用于指示流量,但由于某种原因,它不能与后退按钮一起使用.我不知道如何让后退按钮工作.我已经尝试了各种各样的东西,谷歌搜索了一点,没有一个有效,所以我希望有人在这里可以提供帮助!
<?php
if(isset($_GET['parameters'])) {
if($_GET['parameters'] == "repair")
include 'repair.html';
else if($_GET['parameters'] == "training")
include 'training.html';
else if($_GET['parameters'] == "products")
include 'products.html';
else if($_GET['parameters'] == "about")
include 'about.html';
else if($_GET['parameters'] == "employees")
include 'employees.html';
else if($_GET['parameters'] == "training")
include 'training.html';
else if($_GET['parameters'] == "newaccount")
include 'newaccount.html';
else if($_GET['parameters'] == "contact")
include 'contact.html';
else if($_GET['parameters'] == "recommended")
include 'recommended.html';
else if($_GET['parameters'] == "careers")
include 'careers.html';
else
include 'home.html';
}
else
include 'home.html';
?>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已尝试过但未能使用: window.onbeforeunload
body onunload=""
必须有办法onunload=location.reload()或某事!不知何故必须知道语法!!
componentDidMount()在Safari中返回时,即使从未卸载过组件,React 16触发器也是如此。如何知道何时安装?
class Foo extends React.Component {
state = {
loading: false
}
componentDidMount() {
// when going back in safari
// triggers in react 16, but not in 15.3 or preact
console.log('mounted');
}
componentWillUnmount() {
// will never trigger
console.log('will unmount');
}
leave() {
this.setState({
loading: true
});
setTimeout(() => {
window.location.href = 'https://github.com/';
}, 2000);
}
render() {
return this.state.loading ? <div>loading...</div> : <button onClick={this.leave.bind(this)}>leave</button>;
}
}
Run Code Online (Sandbox Code Playgroud)
Safari使用bfcache。如果返回,它将从缓存中获取最后一页。
当使用react 15.3或preact之类的库时,离开页面不会触发componentWillUnmount,返回页面也不会触发componentDidMount。
此行为会导致多个问题-例如,loading …
我注意到我的网络应用程序中浏览器后退按钮使用的一个常见错误,在登出后点击后退按钮加载用户出现登录的缓存页面(尽管它们实际上并非如此).
我找到了很多有用的问题和有用的答案,并使用了建议的修复人员,包括标题中建议的Cache-Control选项的每个组合:
('Cache-Control', 'no-cache, no-store, must-revalidate, max-age=0, max-stale=0')
Run Code Online (Sandbox Code Playgroud)
并且标题适用于大多数浏览器,即使只有no-cache和no-store,但没有标题选项可以在Safari上解决这个问题.
果然,我可以找到解决这个问题的最可靠的方法就是使用一些强制重新加载的javascript:
<script>
window.onpageshow = function(event) {
if (event.persisted) {
window.location.reload();
}
};
</script>
Run Code Online (Sandbox Code Playgroud)
上面的javascript块确实有效,但前提是用户不通过Safari - > Preferences - > Security禁用javascript,然后点击后退按钮.这是一个非常优秀的边缘案例,但我有点着迷,这样一个流行的浏览器制作这样一个微不足道的bug这个棘手!
如果有人找到了一种方法,让Safari在没有javascript的情况下玩得很好,我很想听听.提前谢谢!
我beforeunload 按照惯例在我的 JS/ReactJS 应用程序中添加了一个事件列表。该函数根据内部unSaved状态添加确认对话框。
在 Chrome 和 Firefox(macOS/桌面)上一切正常。
然而,在 Safari 上:
unSaved==true),它按预期工作正常,unSaved==true,Safari 根本不要求任何确认。更奇怪的是:我可以看到我添加的事件函数实际上每次在 safari 上都被调用,因为console.log每次确实都在打印测试。
我唯一可能的猜测是 Safari 以某种方式缓存了我对该选项卡的确认响应?(?)
关于如何解决这个问题的任何想法?
我的堆栈:
Safari: Version 10.0.1 (12602.2.14.0.7)
macOS: 10.12.1 (16B2657)
host: localhost
protocols: tested on both, http and https
更多信息:
pageshow的属性persisted始终设置为 false。因此,Safari 的页面缓存 (BFCache) 不应该是问题的原因。