怎么使用Mobile控制页面返回时get请求

这次给大家带来怎么使用Mobile控制页面返回时get请求,使用Mobile控制页面返回时get请求的注意事项有哪些,下面就是实战案例,一起来看一下。

问题描述

假设在项目中,有三个页面,分别是main.html、test1.html、test2.html(后面分别简称main、test1、test2),其中main页面是包含一个转向到test1页面的链接(即a标签),test1中有一个属性为data-rel=”back”的链接和一个转向到test2的链接,test2只有一个属性为data-rel=”back”的链接。main转向到test1后,点击back链接返回main(相当于点击浏览器的返回按钮),无需重新发送get请求;但是当test1转向到test2,在test2页面点击back链接想返回test1时,会重新发送一个get请求。这样导致的问题就是:test1做的所有操作,在test2返回后,都会失效。比如A是一个分页的列表页面,翻到第二页后转向到B,那么当返回A后,就无法地位到第二页。

原因分析

我首先用firebug看了一下html的结构,发现jQuery Mobile会把main和test1加入到页面结构中去,当从test1转向到test2后,test1会被自动删除,这样dom树中,只包含了main和test2,所以在test2返回test1就会在发送一个get请求。那么是不是意味着,只要能把历史页面缓存到dom中(就像main和test1一样),就可以解决这个问题。

解决问题

经过一番查找,在jQuery Mobile官网看到一段《Caching pages in the DOM》的描述:

Caching pages in the DOM To keep all previously-visited pages in the DOM, set the domCache option on the page plugin to true, like this:$.mobile.page.prototype.options.domCache = true;Alternatively, to cache just a particular page, you can add the data-dom-cache="true" attribute to the page's container: 

You can also cache a page programmatically like this: pageContainerElement.page({ domCache: true });The drawback of DOM caching is that the DOM can get very large, resulting in slowdowns and memory issues on some devices. If you enable DOM caching, take care to manage the DOM yourself and test thoroughly on a range of devices.

登录后复制

从这段引文中应该可以看到,这三种方法都可以缓存页面到dom中,于是我就使用了第二种方法,即在page的p上增加了data-dom-cache=”true”属性,但是却出现了以下两个问题:

1、如下图所示,当我的访问路径是main->test1->test2->test1(test2是history.back()返回的)时,用firebug可以看到,test2仍然存在于dom中,这样的结果就如红色部分描述的:DOM会变得很大,结果会使页面变慢和一些设备上的内存错误。

怎么使用Mobile控制页面返回时get请求

2、当我存在这样一个页面,它通过不同的参数显示不同的内容,并且页面上,有一段js脚本,会对页面上的元素做些处理,而我们常用的方式就是用id来获得目标元素,由于我们是用了cache缓存page,就会导致js事件或者操作混乱。比如在这里我增加了一个test1_1页面,它的内容几乎和test1一样,他们都有相同id的p和相同事件处理的button,这个事件做的事情就是往这个p中增加内容,当访问路径为main->test1->test1_1,在test1_1上点击按钮,会发现好像没有触发这个事件,其实它已经触发了,只是内容增加到test1中的p中了,分别入下图

怎么使用Mobile控制页面返回时get请求

怎么使用Mobile控制页面返回时get请求

所以对于目前大多数应用,这个方案是不可取的,除非自己管理dom中页面的生命周期。

优化方案

通过上面的实验,我也知道了需要满足我的需求,就只能自己管理dom中页面的生命周期了。那么就涉及到一个问题:页面什么时候过期(即从dom中删除)呢?根据我的需求,当从test2返回到test1时,就应该从dom中删除test2,同理从test1返回main时,从dom中删除test1。如果再次从main导航到test1,就得发起一个get请求,我认为这是合理的,因为用户不会认为点击链接到新页面还需要缓存。所以我应该在页面显示前或者显示后,删除它之后的history,于是我就在pagebeforeshow、pageshow的时候做了删除操作,即如下脚本(插件形式):

(function($, undefined) {$.fn.subpage = function(options) {$(document).bind("pagebeforeshow",function() {var forword = $.mobile.urlHistory.getNext();if (forword) {var dataUrl = forword.url;var forwordPage=$.mobile.pageContainer.children(":jqmData(url='" + dataUrl + "')");if(forwordPage){forwordPage.remove();}}$.mobile.urlHistory.clearForward();});};$(document).bind("pagecreate create", function(e) {$(":jqmData(role='page')", e.target).subpage();});})(jQuery);

登录后复制

结果事与愿违,在页面返回时,出现了js脚本错误,如下图:

怎么使用Mobile控制页面返回时get请求

那么是什么原因呢?不在这个事件里做处理,那在哪里处理呢?于是我仔细研读了一下jQuery Mobile源码,发现了下面一段:

transitionPages( toPage, fromPage, settings.transition, settings.reverse ).done(function() {removeActiveLinkClass();//if there's a duplicateCachedPage, remove it from the DOM now that it's hiddenif ( settings.duplicateCachedPage ) {settings.duplicateCachedPage.remove();}//remove initial build class (only present on first pageshow)$html.removeClass( "ui-mobile-rendering" );releasePageTransitionLock();// Let listeners know we're all done changing the current page.mpc.trigger( "pagechange", triggerData );});

登录后复制

页面在切换完后,会触发pagechange事件,于是我把pagebeforeshow改成了pagechange,一切都按预期运行,并且没有错误,终于大功告成了。

总结

在使用该插件时,请注意以下几点:

1、必须在引用该脚本之前,引用jquery和jquery mobile脚本文件;

2、必须在page上增加data-dom-cache=”true”。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

Mobile中button按钮组件使用详解

Mobile框架中怎样使用表单组件

以上就是怎么使用Mobile控制页面返回时get请求的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2767595.html

(0)
上一篇 2025年3月8日 11:44:20
下一篇 2025年3月6日 00:56:02

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Mobile实现导航栏与页脚(附代码)

    这次给大家带来Mobile实现导航栏与页脚(附代码),Mobile实现导航栏与页脚的注意事项有哪些,下面就是实战案例,一起来看一下。 导航栏由一组水平排列的链接构成,通常位于页眉或页脚内部。 默认地,导航栏中的链接会自动转换为按钮(无需 d…

    编程技术 2025年3月8日
    200
  • jQuery Mobile初始化事件使用(案例详解)

    这次给大家带来jQuery Mobile初始化事件使用(案例详解),jQuery Mobile初始化事件使用的注意事项有哪些,下面就是实战案例,一起来看一下。 jQuery Mobile 包括一个初始化事件,该事件甚至会先于 jQuery …

    编程技术 2025年3月8日
    200
  • 基于ID调用iframe页面(附代码)

    这次给大家带来基于ID调用iframe页面(附代码),基于ID调用iframe页面的注意事项有哪些,下面就是实战案例,一起来看一下。 $(window.parent.document).contents().find(“#iframeID”…

    编程技术 2025年3月8日
    200
  • 分享页面后跳转回首页

    这次给大家带来分享页面后跳转回首页,分享页面后跳转回首页的注意事项有哪些,下面就是实战案例,一起来看一下。 做小程序开发发现,页面分享出去后,用户通过分享进去的页面很难找到返首页的情况。(微信官方操作是点击右上角三个点,在手机下方显示返回首…

    2025年3月8日
    400
  • 怎么阻止vuex页面刷新后数据清除

    这次给大家带来怎么阻止vuex页面刷新后数据清除,阻止vuex页面刷新后数据清除的注意事项有哪些,下面就是实战案例,一起来看一下。 1.原因 2.解决方法 localStorage没有时间期限,除非将它移除,sessionStorage即会…

    2025年3月8日
    200
  • 不使用router-link实现页面跳转

    这次给大家带来不使用router-link实现页面跳转,不使用router-link实现页面跳转的注意事项有哪些,下面就是实战案例,一起来看一下。 1、给父页面跳转的地方设置事件 //原来的页面上展示的信息 编辑 //带参数进行编辑 删除 …

    2025年3月8日
    200
  • BubbleTransition如何实现页面切换功能

    这次给大家带来BubbleTransition如何实现页面切换功能,BubbleTransition实现页面切换功能的注意事项有哪些,下面就是实战案例,一起来看一下。   CodePen 地址 前端使用 SPA 之后,能获得更多的控制权,比…

    2025年3月8日
    200
  • nodejs通过响应回写渲染页面步骤详解

    这次给大家带来nodejs通过响应回写渲染页面步骤详解,nodejs通过响应回写渲染页面的注意事项有哪些,下面就是实战案例,一起来看一下。 我们一般通过node框架提供的api操作页面渲染,如何利用原始回写的方式来实现同样的功能呢 下面是通…

    编程技术 2025年3月8日
    200
  • JS有哪些属性可以判断页面是否存在滚动条

    这次给大家带来JS有哪些属性可以判断页面是否存在滚动条,JS判断页面是否存在滚动条的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 最近在写插件的过程中,需要使用 JS 判断是否有滚动条,搜了一下,大致方法都差不多,但都有些啰嗦,代…

    2025年3月8日
    200
  • 微信小程序分享页面后跳转回首页

    这次给大家带来微信小程序分享页面后跳转回首页,微信小程序分享页面后跳转回首页的注意事项有哪些,下面就是实战案例,一起来看一下。 今天我分享另外一种方法。请看下面.gif; 有没有发现,左上角有返回按钮了。原理简单,在你要分享的页面,分享配置…

    2025年3月8日
    200

发表回复

登录后才能评论