美文网首页
从IOS的back问题中说起 (关于pageshow、pageh

从IOS的back问题中说起 (关于pageshow、pageh

作者: 李霖弢 | 来源:发表于2020-01-19 11:09 被阅读0次

IOS中,网页的前进后退操作(包括history.go()history.back()等)是直接进入其离开时的快照,不会重新触发页面的load事件。此时js从上次离开时的状态继续往下执行。

解决方案

1.使用document.referrer代替history.back()进行返回
location.href = document.referrer;

document.referrer是一个字符串,内容为上一页面的URL

  • 以下情况document.referrer会为空字符串""
    1. 跨域
    2. http与https之间跳转
    3. 使用location.reload()location.hreflocation.replace()更新页面
    4. 从浏览器、书签等打开一个新页面
    5. a标签设置rel="noreferrer"
    6. iframe
浏览器支持情况
  • 缺点
    1. 存在以上限制
    2. 本质上是一次跳转而非返回,如 a-b-c-d ,d页面通过window.location.href=document.referrer返回到c页面,对于c页面来说b不是他的上一级页面了、上一级页面变成了d;
2. 使用pageshow、pagehide事件

不同浏览器对load/unload/pageshow/pagehide表现不同,使用前需多加测试

  • onpageshow 事件在用户浏览网页时触发(onload之后)。
    类似于 onload 事件,但onload只在页面第一次加载时触发, onpageshow 事件在每次加载页面时触发,即 onload 事件当页面从浏览器缓存中读取时不触发(如通过前进/后退进入页面时)。
  • onpagehide 事件在用户离开网页时触发(onunload之前)。

第一次进入时,触发pageshow,此时isPageHidefalse。离开页面时触发pagehideisPageHide变为true。第二次进入时再次触发pageshow,此时isPageHidetrue,成功触发页面刷新。

  $(function () {
    var isPageHide = false;
    window.addEventListener('pageshow', function () {
      if (isPageHide) {
        window.location.reload();
      }
    });
    window.addEventListener('pagehide', function () {
      isPageHide = true;
    });
  }) 

visibilitychange

pageshow/pagehide会在页面跳转前后触发,而visibilitychange会在页面被隐藏或显示时(如浏览器tab切换、窗口被最小化等)触发,配合Document.hidden可以实现如"页面被切到后台时停止声音播放,切到前台时恢复播放"等功能。

    // 设置隐藏属性和改变可见属性的事件的名称
    var hidden, visibilityChange; 
    if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support 
      hidden = "hidden";
      visibilityChange = "visibilitychange";
    } else if (typeof document.msHidden !== "undefined") {
      hidden = "msHidden";
      visibilityChange = "msvisibilitychange";
    } else if (typeof document.webkitHidden !== "undefined") {
      hidden = "webkitHidden";
      visibilityChange = "webkitvisibilitychange";
    }

    var videoElement = document.getElementById("videoElement");

    // 如果页面是隐藏状态,则暂停视频
    // 如果页面是展示状态,则播放视频
    function handleVisibilityChange() {
      if (document[hidden]) {
        videoElement.pause();
      } else {
        videoElement.play();
      }
    }

    // 如果浏览器不支持addEventListener 或 Page Visibility API 给出警告
    if (typeof document.addEventListener === "undefined" || typeof document[hidden] === "undefined") {
      console.log("This demo requires a browser, such as Google Chrome or Firefox, that supports the Page Visibility API.");
    } else {
      
    // 处理页面可见属性的改变
    document.addEventListener(visibilityChange, handleVisibilityChange, false);
      
    // 当视频暂停,设置title
    // This shows the paused
    videoElement.addEventListener("pause", function(){
      document.title = 'Paused';
    }, false);
      
    // 当视频播放,设置title
    videoElement.addEventListener("play", function(){
      document.title = 'Playing'; 
    }, false);
  }

相关文章

  • 从IOS的back问题中说起 (关于pageshow、pageh

    IOS中,网页的前进后退操作(包括history.go()、history.back()等)是直接进入其离开时的快...

  • 从课题标题中的冒号说起

    2017.5.4,无锡市教育科研创新区建设启动暨精品课题建设品质提升活动在东亭实小举办,东亭实小省级十三五规划重点...

  • iOS 开发之动画篇 - 从 UIView 动画说起

    iOS 开发之动画篇 - 从 UIView 动画说起 iOS 开发之动画篇 - 从 UIView 动画说起

  • 关于SpringMVC+Spring+Mybatis+PageH

    这是mybatis的一个分页的框架,无需你编写分页代码,自动拦截帮你实现分页,你只需要配置即可。 我这里只介绍其中...

  • 超级简单的UIView动画

    感谢作者Sindri的小巢的文章iOS动画-从UIView动画说起,里面详细介绍关于UIView动画更多的基础知识...

  • iOS动画

    iOS动画-从UIView动画说起iOS动画-Transform和KeyFrame动画iOS动画-layout动画...

  • pageshow事件

    当一条会话历史记录被执行的时候将会触发页面显示 (pageshow) 事件。(这包括了后退/前进按钮操作,同时也会...

  • 【iOS 开发】从 setNeedsLayout 说起

    本文从 setNeedsLayout 这个方法说起,分享与其相关的 UIKit 视图交互、使用场景等内容。 U...

  • iOS开发——从UIWebView说起

    相比native开发,h5以其相对成熟、随时发布、开发成本低等特点,成为各大移动应用采取的通用web方案,在移动开...

  • 待解决

    1.iOS8 打印报错 initImageAppleJPEG:1325: falling back to libJPEG

网友评论

      本文标题:从IOS的back问题中说起 (关于pageshow、pageh

      本文链接:https://www.haomeiwen.com/subject/wwxrzctx.html