我们的调查向我们表明,并非所有浏览器都以统一的方式尊重http缓存指令.
出于安全原因,我们不希望在我们的应用程序某些网页缓存,有史以来,通过Web浏览器.这必须至少适用于以下浏览器:
我们的要求来自安全测试.从我们的网站注销后,您可以按后退按钮查看缓存页面.
有人可以分享经验/代码我们如何检测浏览器后退按钮点击(对于任何类型的浏览器)?
我们需要满足所有不支持HTML5的浏览器
我发现的问题与这个问题非常相似,只是台式机上的Safari似乎已经解决了这个问题.基本上,问题是:当客户端浏览移动版Safari并且页面在pagea.html上执行javascript函数时,然后导航到pageb.html,然后按后退按钮返回pagea.html,javascript函数当客户端按下后退按钮返回pagea.html时,将不会运行.它将跳过javascript调用.
我已经尝试过上面链接中提到的解决方案,但似乎没有什么适用于移动Safari.还有其他人遇到过这个bug吗?你是怎么处理的呢?
问题:我有一个包含动态内容的网站,每次用户看到它时都需要重新加载.这包括用户点击另一个站点上的后退按钮并进入需要重新加载的站点时的用例.此事件后,大多数(全部?)浏览器不刷新站点.
我的解决方案(不太合适):http: //www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
window.onbeforeunload = function () {
// This function does nothing. It won't spawn a confirmation dialog
// But it will ensure that the page is not cached by the browser.
}
Run Code Online (Sandbox Code Playgroud)
但它仍然不刷新页面.
什么可以影响/阻止所需行为的想法?对于这个问题,分别有其他解决方案的建议吗?
编辑:
设置如下:
Cache-Control private, must-revalidate, max-age=0
Expires Sat, 26 Jul 1997 05:00:00 GMT
Pragma no-cache
Run Code Online (Sandbox Code Playgroud)
和:
<meta name="cache-control" content="no-cache" />
<meta name="expires" content="0" />
<meta name="pragma" content="no-cache" />
Run Code Online (Sandbox Code Playgroud)
仍然没有成功.
我有一个$(document).ready()用于构建界面的网页.然后用户可以转到子页面,并返回到原始页面,他可以按下浏览器的"上一个"按钮或页面中的"返回"按钮,触发一个history.back();.返回原始页面,$(document).ready()未触发,因此页面缺少信息.
有没有办法自动触发它,就好像它是一个"真正的负载"?
谢谢!
编辑
在其中发出警报,警报已加速,但我的界面中缺少东西,就好像缺少一些准备事件的部分一样.调查...
编辑2
hahahahaha in document.ready我click有些复选框应该是未经检查的.当我在这个页面上"退回"时,它们会被检查,因此我们会对它们进行检查click.
对不起,这完全是我的坏事:(
tl; dr - iOS 5上的Safari缓存非常困难,它打破了我的网站.
我正在努力解决iOS 5中的Safari浏览器处理后向缓存的问题,他们称之为"页面缓存".这里描述的方式非常好地解释了这种行为.
很简单,页面缓存使得当你离开页面时我们"暂停"它,当你回来时我们按下"播放".
这会导致整个网站出现问题.使用后退按钮时,大多数其他浏览器会以加载状态显示页面.不是iOS 5上的Safari,它会显示您上次离开时的页面.一个简单的例子是禁用提交按钮.如果我使用Javascript来禁用提交按钮,然后提交表单,当您单击后面的提交按钮仍将被禁用.这在其他浏览器中是一个问题,包括Safari的桌面版本,但是通过将onload事件处理程序设置为空函数来解决它.我相信这告诉浏览器使缓存无效,因为在该函数中可能发生了一些重要的事情.这个hack似乎不适用于iOS 5上的Safari.
以下是问题归结为最基本的问题.加载test.html时,您将看到文本"原始文本".当您单击该链接时,该文本将更改为"更改文本 - 转发到下一页",然后在3秒内您将转发到test2.html.在所有浏览器中,一切都很好.在所有其他浏览器中,当您单击后退按钮时,您将看到的文本是"原始文本",但在Safari for iOS 5上,您将看到"更改文本 - 转发到下一页".
有关如何处理这个的任何建议?
这是一个简单的例子
的test.html
<script>
function changeText() {
el = document.getElementById("text");
el.innerHTML = "Changed text - forwarding to next page";
setTimeout("forward()",3000);
}
function forward() {
document.location.href = "test2.html";
}
</script>
<div id="text">Original Text</div>
<a href="Javascript:changeText()">Click Here</a>
<script>
window.onunload = function(){};
</script>
Run Code Online (Sandbox Code Playgroud)
test2.html
<div>Click back button</div>
Run Code Online (Sandbox Code Playgroud)
这是使用表单的第二个示例.这是我的应用程序如何工作的一个简单示例.当您导航回formtest2.asp时,您应该看到已发布的表单值,div文本应该是原始的.
formtest.asp
<form method="post" action="formtest2.asp">
Test: <input type="text" name="test"/>
<input type="submit" value="Submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)
formtest2.asp
<script> …Run Code Online (Sandbox Code Playgroud) 我有一个包含文本字段数组的表单.用户(通过javascript)可以向表单添加任意数量的文本字段.提交表单并按下后退按钮后,表单仅显示首次呈现时原始表单上的字段(任何添加的文本字段都将丢失).在用户提交表单时,允许后退按钮呈现状态的最佳方法是什么?欢迎任何想法,我尝试过的一些事情是:
谢谢您的帮助.我在我的网站http://fishtale.org/formtest/f1.php上发布了一个测试表格.这里还有一个简单的表格,展示了我提到的行为:
<form action="f2.php" method="post">
<input type="text" name="text[]" id="text1"/>
<input type="submit" name="saveaction" value="submit form" />
</form>
<a href="f2.php" id="add_element">Add Form Element</a>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js" ></script>
<script type="text/javascript" >
$('#add_element').click(function (event) {
event.preventDefault();
$('#text1').after('<input type="text" name="text[]" />');
});
</script>
Run Code Online (Sandbox Code Playgroud)
这类似于我前一段时间发布的问题,返回按钮的最佳方式是保留表单数据,但是,此表单的元素由用户修改.
我的页面中有以下代码,以便在DOM准备就绪时自动在页面上提交表单:
$(function () {
$('form').submit();
});
Run Code Online (Sandbox Code Playgroud)
但是,在下一页上,如果用户点击back他们的浏览器,它将返回到此页面之前的页面,而不是打开此代码的页面(无论如何都使用Chrome/IE).即浏览器历史记录中缺少包含表单的页面.
这很棒,虽然我想知道现在所有现代浏览器都能做到这一点吗?我正在寻找一个答案,引用官方来源,如来自互联网标准文件或浏览器供应商,说明他们已实施的机制.
这似乎只有在我调用submit()DOM ready或Window load事件中的函数时才会发生.
例如,此代码将在单击页面(后退/前进)后显示浏览器历史记录中的表单页面: -
document.addEventListener('click', function () { document.forms[0].submit(); }, false);
Run Code Online (Sandbox Code Playgroud)
以下片段不会: -
document.addEventListener('DOMContentLoaded', function () { document.forms[0].submit(); }, false);
window.addEventListener('load', function() { document.forms[0].submit(); }, false);
window.onload = function () { document.forms[0].submit(); };
Run Code Online (Sandbox Code Playgroud) 我有以下处理程序:
$(window).bind('pageshow', function() { alert("back to page"); });
Run Code Online (Sandbox Code Playgroud)
当我离开页面(通过按下链接)并返回页面(通过按"后退"按钮)时,不会调用alert()(IPad 2,iOS 5.1).
我做错了什么?我需要绑定的任何其他事件?
PS:有趣的是,在离开页面时正确接收了Pagehide.
有一个特定的页面,我希望浏览器始终加载,特别是当用户按下浏览器后退按钮才能访问它.
所以我在这个页面的标题中使用了以下'Cache-Control'指令(直接从我的代码中获取PHP).
$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
Run Code Online (Sandbox Code Playgroud)
这适用于FF,IE和Chrome,但Safari(5.0.1)似乎忽略该指令并且无法重新加载页面(跨多个用户,因此它似乎不是特定于设置的问题).搜索没有发现任何已知的错误,所以我假设我的结果有些不对劲.
任何指针都将非常感激.
更新:刚刚在SO上找到了这个答案.
尚未尝试过,但看起来很有希望.很奇怪它是身体标签的补充,所以我持怀疑态度.
javascript ×8
jquery ×4
safari ×3
back-button ×2
forms ×2
html ×2
caching ×1
http ×1
http-headers ×1
https ×1
ios5 ×1
web ×1