Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 单击“上一步”按钮时是否存在跨浏览器加载事件?_Javascript_Pageload - Fatal编程技术网

Javascript 单击“上一步”按钮时是否存在跨浏览器加载事件?

Javascript 单击“上一步”按钮时是否存在跨浏览器加载事件?,javascript,pageload,Javascript,Pageload,对于所有主要浏览器(IE除外),当页面由于后退按钮操作而加载时,JavaScriptonload事件不会触发 — 它仅在第一次加载页面时激发 有人能告诉我一些解决这个问题的示例跨浏览器代码(Firefox、Opera、Safari、IE等)吗?我熟悉Firefox的pageshow事件,但不幸的是,Opera和Safari都没有实现这一点。事件就是为这类问题创建的。你可能想深入研究这个实现,看看到底发生了什么。比尔,我敢回答你的问题,但是我不能100%肯定我的猜测。我认为其他IE浏览器在将用户带

对于所有主要浏览器(IE除外),当页面由于后退按钮操作而加载时,JavaScript
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”特殊事件支持修复程序

参考资料:

  • 网络工具包:
  • 火狐:
  • 铬:

我遇到了一个问题,当用户单击后退或前进时,我的js没有执行。我首先开始阻止浏览器缓存,但这似乎不是问题所在。我的javascript设置为在加载所有库等后执行。我用readyStateChange事件检查了这些

经过一些测试,我发现在单击了back的页面中,元素的readyState不是“loaded”,而是“complete”。将
| | 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($) {
          //...
       });
   });