今天在做项目的时候,组长让我用iPad测试一下前面写的离线缓存,后退不刷新页面,发现在iPad上onbeforeunload函数在iPad上一带而过,不运行???

无奈之下,发现原来在IOS上,有自己的onshow和onhide方法  //搜索来自:http://www.cnblogs.com/vaal-water/archive/2012/09/25/2701769.html

原文如下:

  1. window.addEventListener("pageshow", myLoadHandler, false);
  2. window.addEventListener("pagehide", myUnloadHandler, false);
  3.  
  1. function myLoadHandler(evt)
  2. {
  3. if (evt.persisted) {
  4. // This is actually a pageshow event and the page is coming out of the Page Cache.
  5. // Make sure to not perform the "one-time work" that we'd normally do in the onload handler.
  6. ...
  7.  
  8. return;
  9. }
  10.  
  11. // This is either a load event for older browsers,
  12. // or a pageshow event for the initial load in supported browsers.
  13. // It's safe to do everything my old load event handler did here.
  14. ...
  15. }
  16.  
  17. function myUnloadHandler(evt)
  18. {
  19. if (evt.persisted) {
  20. // This is actually a pagehide event and the page is going into the Page Cache.
  21. // Make sure that we don't do any destructive work, or work that shouldn't be duplicated.
  22. ...
  23.  
  24. return;
  25. }
  26.  
  27. // This is either an unload event for older browsers,
  28. // or a pagehide event for page tear-down in supported browsers.
  29. // It's safe to do everything my old unload event handler did here.
  30. ...
  31. }
  32.  
  33. if ("onpagehide" in window) {
  34. window.addEventListener("pageshow", myLoadHandler, false);
  35. window.addEventListener("pagehide", myUnloadHandler, false);
  36. } else {
  37. window.addEventListener("load", myLoadHandler, false);
  38. window.addEventListener("unload", myUnloadHandler, false);
  39. }
  40. 原文 http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/
  41.  
  42. 我自己的程序如下:
    先写了一个判断是不是IOS系统的方法:
    function isIOS() {
        var userAgentInfo = navigator.userAgent;
        var Agents = [ "iPhone","iPad"];
        var flag = false;
        for (var v = 0; v < Agents.length; v++) {
            if (userAgentInfo.indexOf(Agents[v]) > 0) {
                flag = true;
                break;
            }
        }
        return flag;
    }
    等于这个:
    var nav = window.navigator.userAgent.toLowerCase();
    var ipad = nav.indexOf("ipad");
  43.  
  44. 我的理解是:
    当页面加载完的时候给window加载监听器
     window.addEventListener("pagehide", myUnloadHandler, false);
     window.addEventListener("pageshow", myLoadHandler, false);
  45.  
  46. 系统自动识别是不是IOS系统,然后做出处理
    if(!parent.isIOS()){} //或者是if(ipad != -1){}
  47.  
  48. IOS系统加载的时候,执行myloadHandler函数(相当于jsonload函数),当离开页面的时候执行myUnloadHandler函数(相当于jsonbeforeunload函数),
    然后在myloadHandler函数中做出你要执行的加载页面时触发的事件,在myUnloadHandler函数中做出你要离开页面时触发的事件
  49.  
  50. 全部代码以及冗余代码如下:没有删减
    var nav = window.navigator.userAgent.toLowerCase();
    alert(nav);
    var ipad = nav.indexOf("ipad");
    alert(parent.isIOS());
    if(!parent.isIOS()){
        alert("ipad");
        alert("SUCCESS");
     window.addEventListener("pagehide", myUnloadHandler, false);
     /* window.addEventListener("pageshow", myLoadHandler, false);
        function myLoadHandler(evt)
        {
            alert("myLoadHandler");
            start = parseInt(sessionStorage.getItem("start"+token));
            paramFlag = sessionStorage.getItem("paramFlag"+token);
            tokenDiv = sessionStorage.getItem("tokenDiv"+token);
            //$("#tokenDiv").html(tokenDiv);   由于放在sessionstorage中的div的id都一样,故吧时间戳作为唯一标识ID
            $("#tokenDiv").html(tokenDiv);
        } */
  51.  
  52.     function myUnloadHandler(evt)
        {
            alert("myUnloadHandler");
            alert("离开页面了");
        var tokenDiv = $("#tokenDiv").html();
        sessionStorage.setItem("tokenDiv"+token,tokenDiv);
        sessionStorage.setItem("start"+token,start);
        sessionStorage.setItem("paramFlag"+token,paramFlag);
        }
    }
    window.onbeforeunload = function(){
        
        alert("离开页面了");
        var tokenDiv = $("#tokenDiv").html();
        sessionStorage.setItem("tokenDiv"+token,tokenDiv);
        sessionStorage.setItem("start"+token,start);
        sessionStorage.setItem("paramFlag"+token,paramFlag);
       /*  if ("onpagehide" in window) {
            alert("one");
            window.addEventListener("pageshow", myLoadHandler, false);
            window.addEventListener("pagehide", myUnloadHandler, false);
        } else {
            alert("two");
            window.addEventListener("load", myLoadHandler, false);
            window.addEventListener("unload", myUnloadHandler, false);
        } */
        }

javascript的onbeforeunload函数在IOS上运行的更多相关文章

  1. ios那些事之如何在ios5上运行gdb

    为啥要在ios上运行gdb? 这个问题见仁见智喽.对于搞开发的同学们来所, 有了gdb更方便跟踪分析别人的程序,取长补短:)这里不是教大家crack:) 运行环境: Mac OS 10.7.4 Xco ...

  2. react native-调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错

    调用react-native-fs插件时,如果数据的接口是需要验证信息的,在android上运行报错,而在iOS上运行没问题.原因是因为接口是有验证信息的,而调用这个插件时没有传入,在iOS上会自动加 ...

  3. HTML5定稿了,终于有一种编程语言开发的程序可以在Android和IOS两种设备上运行了

    2007 年 W3C (万维网联盟)立项 HTML5,直至 2014 年 10 月底,这个长达八年的规范终于正式封稿. 过去这些年,HTML5 颠覆了 PC 互联网的格局,优化了移动互联网的体验,接下 ...

  4. 将 java 项目打包成可运行的 jar 包(main 函数带参数),并上传到 linux 服务器上运行

    一.概述 java项目有两种架构,一种是 B/S 架构的,一种是 C/S 架构的. 对于 B/S 架构来说,我们常见的 java ee 即是 B/S 架构,通常,开发人员会在本地进行开发,然后将项目打 ...

  5. ios:如何将自己编写的软件放到真正的iPhone上运行(转)

    想要将自己编写的软件放到真正的iPhone上去运行,首先你需要成为Apple Developer计划的成员.其次,你需要设置程序ID和认证书,在这之后你就可以在你指定的iPhone上运行你的程序了.下 ...

  6. win10 上运行 curl_init() 函数一直报错的解决办法

    [问题现象] 1.把 APACHE 的 ZIP 包解压到目录,比如 d:\apache24\ 2.把 PHP 的 ZIP 包解压到目录,比如:d:\php56\ apache 与 php 与 MySQ ...

  7. iOS开发手记 - iOS9.3 Xcode7打包ipa文件在其他越狱机器上运行的方法和一些问题

    现在Xcode7可以用一个appleid就可以往手机上部署测试app,不再需要$99,这也是方便.但是要把app发给别人的手机上运行还是不行,除非别人的手机在你身边可以直接通过Xcode安装 关于怎么 ...

  8. 微坑---微信小程序ios上时间字符串转换为时间戳时,在开发工具上和安卓手机上运行成功

    给定一个时间字符串  var time="2017-02-27 16:42:53" js有三种转换为时间戳的方法:1.var timestamp = Date.parse(time ...

  9. 微信小程序ios上时间字符串转换为时间戳时会报错,在开发工具上和安卓手机上运行成功

    给定一个时间字符串  var time="2017-02-27 16:42:53" js有三种转换为时间戳的方法: 1.var timestamp = Date.parse(tim ...

随机推荐

  1. codeforces 719A:Vitya in the Countryside

    Description Every summer Vitya comes to visit his grandmother in the countryside. This summer, he go ...

  2. WPF中嵌入Office编辑器(支持Word、Excel、PPT、Visio等)

    现在有一个项目,需要使用wpf做一个简单的客户端,用来生成word.excel.ppt.visio等文档,这就需要能够在wpf中嵌入office的编辑器,并对office文档进行编辑. 在网上搜索了一 ...

  3. 转 vagrant package[打包命令]详解

    转 vagrant package[打包命令]详解   vagrant的一个非常重要的功能就是在你的同事之间分享你的box从而使大家的开发环境保持同步,打包[package]正是实现这一功能的关键所在 ...

  4. C++构造函数详解及显式调用构造函数

    来源:http://www.cnblogs.com/xkfz007/archive/2012/05/11/2496447.html       c++类的构造函数详解                  ...

  5. C++中map的基本操作和使用;

    注:本文来自sina live 的博文 Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!1. map最基本 ...

  6. ctags 的最简单使用

    vim插件ctags的安装和使用 2013-11-19 20:47 17109人阅读 评论(0) 收藏 举报  分类: 开发工具(3)  linux编程(9)  c/c++编程(11)  版权声明:本 ...

  7. Mac OS X中打zip包时去除.DS_Store等指定文件

    在Finder中的Compress “…”很好用,但是也有烦恼的时候,经常打包会包含进来一些.DS_Store文件,.DS_Store是苹果系统中保存当前目录基本信息的文件,包括图标的位置,显示方式等 ...

  8. apue第七章学习总结

    apue第七章学习总结 1.main函数 程序是如何执行有关的c程序的? C程序总是从main函数开始执行.main函数的原型是 int main(int argc,char *argv[]); 其中 ...

  9. 计蒜客 X的平方根

    X的平方根 设计函数int sqrt(int x),计算x的平方根. 格式: 输入一个数x,输出它的平方根.直到碰到结束符号为止. 千万注意:是int类型哦- 输入可以如下操作: while(cin& ...

  10. 取出type="button" 和type="text" 里面的值显示在页面

    <script  type="text/JavaScript> function changeLink() { document.getElementById("nod ...