Cordova 自定义弹窗

一.前言

前阵子做公司的项目,是用混合开发cordova来开发APP,开发过程中,需要用到从底部向上的弹窗。之前用到的弹窗是使用jqm的,但是在开发过程中发现,如果jqmpopup外部的window也是可以滚动的话,popup会跟随着背后的window滚动,这个当然是不可取的,所以想自定义一个弹窗来满足需求。

二.制作思路

在自定这个弹窗的时候,有大概构思过步骤,就是要有一个遮罩层,一个显示内容。其中遮罩层需要覆盖这个mobile界面,当用户点击遮罩层的时候,可以关闭这个弹窗或者不关闭弹窗,可以自行设置;显示内容当然是可以滚动的,可以给显示内容设置一个max-height,这样,当内容少的时候就显示内容高度,当内容过多时候,高度就为max-height。弹窗是从下面向上升起,那么显示内容的position就可以设置为absolutebottom为0,只是在打开或者关闭的时候,改变遮罩层和显示内容的高度和显示的问题。

三.遇到的bug

在具体的开发中也是按照这样的步骤去做,但是其中遇到了一个比较大的坑,就是自定义的弹窗有滚动条,并且弹窗背后的整个页面也是可以滚定的话,当滚动弹窗里面的内容,背后的window也会跟着滚动。这样肯定是不可取的,在网上也找了很多解决方法,很多说在打开弹窗的时候,设置windowoverflowhidden就行,但是这样设置后,解决不了。后面在网上看到了张鑫旭的也遇到过类似的问题,所以就用了他的解决方法smartscroll
看了其中的源码,解决的核心问题就是弹窗滚动到上下边缘的滚定问题。

    // 上下边缘检测
    if (distanceY > 0 && scrollTop == 0) {
        // 往上滑,并且到头
        // 禁止滚动的默认行为
        event.preventDefault();
        return;
    }
    // 下边缘检测
    if (distanceY < 0 && (scrollTop + 1 >= data.maxscroll)) {
        // 往下滑,并且到头
        // 禁止滚动的默认行为
        event.preventDefault();
        return;
    }

运用到自己的项目里面,测试一遍后发现,iPhone运行没有问题,但是在Android上发现,当弹窗的内容接近上下边缘的时候,此时快速滚动弹窗,背后的window还是会跟着滚动,所以自己在其中改动了些代码,具体的方案是,当open弹窗的时候,记录下window当前的xy,然后绑定windowonscroll方法,在这个方法中call windowscrollTo方法,滚动的xy就是上面记录的xy值,需要注意的是,在close这个弹窗的时候,需要windowonscroll方法,方法里面do nothing,这样关闭弹窗后,才不会影响到window的滑动。
1) open弹窗时需要调用

//fiexd position for android
var x=window.scrollX;
var y=window.scrollY;
window.onscroll=function(){
   window.scrollTo(x, y);
};

2)close弹窗时需要调用

window.onscroll=function(){};

当然,在Android中不能做到跟iOS一样,弹窗的滑动完全不会影响到window,在Android中快速滑动弹窗,window会有稍微的移动吗,但是会马上回弹到window原先的位置。
因为smartscroll中,传入了当前页面作为container,绑定了touchmove,所以close弹窗的时候,需要给这个页面解除绑定。
张鑫旭浮层滚动解决方法

四.总结

使用jqm中的popup效果不佳,popup跟着window滑动的问题之前就存在了,所以自定义的弹窗也要尽量避免出现这个问题。在解决这个问题花费了很多时间,其中最最重要的就是解决有滚动条的弹窗的下上边缘的问题,在临界点进行处理。

五.Github地址

GitHub上,导入了jqm的相关代码,因为custom_alert.js文件中用到了jqm来获取当前页面,如果UI框架不使用jqm,可以用你项目的UI框架来获取当前页面,然后代替里面的代码即可,承载的弹窗的div放在page的footer中(即使显示弹窗的页面不需要用到footer,承载的弹窗的div放在page的footer中也不会影响)。
有实例展示,直接下载源码,就可以测试。其中做得不好的请指正,相互交流😀。
源码下载

六.运行后样式

制作后简单展示(如果需要美化弹窗,可以自行在我这个小组件上进行修改):


仿iPhone原生弹窗
弹窗内容超出,可以滚动弹窗
弹窗内容未超出,自适应高度
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,457评论 25 707
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,706评论 22 664
  • 运行故障: MNIST,运行中间发生Python执行非法指令错误,同时运行窗口报告:Couldn't open C...
    zy_now阅读 480评论 0 0
  • 小白7天发圈 第一天:首先要熟悉了解产品,熟悉朋友圈人群质量。发圈以分享为前提。可以在晚上9点左右发一条自己喝燕窝...
    Miss伊阅读 359评论 0 0
  • 默认情况下,把一个NTFS格式的磁盘插入到Mac里,是只能读不能写的。网上一直流传着这么一个简单的方法是用第三方工...
    Chefil阅读 46,528评论 37 18