Javascript 单击“上一步”按钮时是否存在跨浏览器加载事件?
对于所有主要浏览器(IE除外),当页面由于后退按钮操作而加载时,JavaScriptJavascript 单击“上一步”按钮时是否存在跨浏览器加载事件?,javascript,pageload,Javascript,Pageload,对于所有主要浏览器(IE除外),当页面由于后退按钮操作而加载时,JavaScriptonload事件不会触发 — 它仅在第一次加载页面时激发 有人能告诉我一些解决这个问题的示例跨浏览器代码(Firefox、Opera、Safari、IE等)吗?我熟悉Firefox的pageshow事件,但不幸的是,Opera和Safari都没有实现这一点。事件就是为这类问题创建的。你可能想深入研究这个实现,看看到底发生了什么。比尔,我敢回答你的问题,但是我不能100%肯定我的猜测。我认为其他IE浏览器在将用户带
onload
事件不会触发 — 它仅在第一次加载页面时激发
有人能告诉我一些解决这个问题的示例跨浏览器代码(Firefox、Opera、Safari、IE等)吗?我熟悉Firefox的
pageshow
事件,但不幸的是,Opera和Safari都没有实现这一点。事件就是为这类问题创建的。你可能想深入研究这个实现,看看到底发生了什么。比尔,我敢回答你的问题,但是我不能100%肯定我的猜测。我认为其他IE浏览器在将用户带到历史记录中的页面时,不仅会从缓存中加载页面及其资源,还会恢复页面的整个DOM(读取会话)状态。IE没有进行DOM恢复(或者至少没有),因此onload事件对于正确的页面重新初始化似乎是必要的。我可以确认ckramer,jQuery的ready事件在IE和FireFox中工作。以下是一个示例:
<html>
<head>
<title>Test Page</title>
<script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
var d = new Date();
$('#test').html( "Hi at " + d.toString() );
});
</script>
</head>
<body>
<div id="test"></div>
<div>
<a href="http://www.google.com">Go!</a>
</div>
</body>
</html>
测试页
$(文档).ready(函数(){
var d=新日期();
$('#test').html(“Hi at”+d.toString());
});
好的,我试过了,它在Firefox 3、Safari 3.1.1和IE7中都能正常工作,但在Opera 9.52中却不能正常工作。如果使用下面所示的示例(基于palehorse的示例),则在页面首次加载时会弹出一个警报框。但是,如果您转到另一个URL,然后点击“上一步”按钮返回此页面,则在Opera中不会弹出警告框(但在其他浏览器中会弹出警告框) 不管怎么说,我认为现在已经足够接近了。谢谢大家
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Untitled Document</title>
<meta http-equiv="expires" content="0">
<script src="jquery.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(
function(){
alert('test');
}
);
</script>
</head>
<body>
<h1>Test of the page load event and the Back button using jQuery</h1>
</body>
</html>
无标题文件
$(文件)。就绪(
函数(){
警报(“测试”);
}
);
使用jQuery测试页面加载事件和后退按钮
好的,这是一个最终解决方案,它基于ckramer的初始解决方案和Palehouse的示例,适用于所有浏览器,包括Opera。如果将history.navigationMode设置为“compatible”,那么jQuery的ready函数将在Opera以及其他主要浏览器中的后退按钮操作中启动
本页已完成
例如:
history.navigationMode = 'compatible';
$(document).ready(function(){
alert('test');
});
我在Opera 9.5、IE7、FF3和Safari中测试了这一点,它在所有这些系统中都能正常工作。伙计们,我发现JQuery只有一个效果:当按下后退按钮时,页面会重新加载。这与“准备就绪”无关 这是怎么回事?好的,JQuery添加了一个onunload事件侦听器
// http://code.jquery.com/jquery-latest.js
jQuery(window).bind("unload", function() { // ...
默认情况下,它什么也不做。但不知何故,这似乎触发了Safari、Opera和Mozilla中的重新加载——不管事件处理程序包含什么
<编辑>(NICOLAY):这就是为什么它是这样工作的:请阅读这些文章(或者我在下面单独的答案中总结),并考虑你是否真的需要这么做,让你的页面加载速度慢一些。
真不敢相信?试试这个:
<body onunload=""><!-- This does the trick -->
<script type="text/javascript">
alert('first load / reload');
window.onload = function(){alert('onload')};
</script>
<a href="http://stackoverflow.com">click me, then press the back button</a>
</body>
警报(“首次加载/重新加载”);
window.onload=函数(){alert('onload')};
使用JQuery时,您将看到类似的结果
您可能希望在不使用onload的情况下与此进行比较
<body><!-- Will not reload on back button -->
<script type="text/javascript">
alert('first load / reload');
window.onload = function(){alert('onload')};
</script>
<a href="http://stackoverflow.com">click me, then press the back button</a>
</body>
警报(“首次加载/重新加载”);
window.onload=函数(){alert('onload')};
如果我没记错的话,那么添加unload()事件意味着页面不能被缓存(在向前/向后缓存中),因为当用户离开时,页面的状态会改变。因此-通过浏览历史对象返回页面时,恢复页面的最后一秒状态是不安全的。一些现代浏览器(Firefox、Safari和Opera,但不是Chrome)支持特殊的“后退/前进”缓存(我称之为bfcache,这是Mozilla发明的一个术语),当用户返回时会涉及到这种缓存。与常规(HTTP)缓存不同,它捕获页面的完整状态(包括JS、DOM的状态)。这允许它在用户离开页面时更快、准确地重新加载页面
从该缓存加载页面时,不应触发load
事件。例如,如果您在“load”处理程序中创建了UI,并且在初始加载时触发了一次“load”事件,第二次从bfcache重新加载页面时,页面将以重复的UI元素结束
这也是为什么添加“卸载”处理程序会阻止页面存储在bfcache中(从而使其返回速度变慢)——卸载处理程序可以执行清理任务,这可能会使页面处于无法工作的状态
对于需要知道何时离开/返回的页面,Firefox 1.5+和Safari版本提供了“pageshow”和“pagehide”特殊事件支持修复程序
参考资料:
- 网络工具包:
- 火狐:
- 铬:
| | element.readyState=='complete'
添加到我的条件语句中解决了我的问题
我只是想分享我的发现,希望它们能帮助其他人
编辑完整性
我的代码如下所示:
script.onreadystatechange(function(){
if(script.readyState == 'loaded' || script.readyState == 'complete') {
// call code to execute here.
}
});
在上面的代码示例中,脚本变量是一个新创建的脚本元素,它已添加到DOM中 我使用$(document)尝试了Bill的解决方案
$(window).unload(function(){ alert('do unload stuff here'); });
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
jQuery(window).bind("load", function() {
$("[name=customerName]").val('');
});
</script>
</head>
<body>
<h1>body.jsp</h1>
<form action="success.jsp">
<div id="myDiv">
Your Full Name: <input name="yourName" id="fullName"
value="Your Full Name" /><br> <br> <input type="submit"><br>
</div>
</form>
</body>
</html>
<input type='hidden' id='dirty'>
<script>
$(document).ready(function() {
if ($('#dirty').val()) {
// ... reload the page or specific divs only
}
// when something modifies a div that needs to be refreshed, set dirty=1
$('#dirty').val('1');
});
</script>
jQuery(document).ready(function($) {
$(window).on('load', function() {
//...
});
});
jQuery(document).ready(function($) {
//...
});
//Window Load Start
window.addEventListener('load', function() {
jQuery(document).ready(function($) {
//...
});
});