最近使用MUI这个框架使用下拉刷新插件的时候,在电脑和苹果手机测试都没有问题,但是一上线却发现安卓打包成APP后无法使用的问题。针对这一问题,博主只想说大家在开发的过程中真的是没有认真官方的文档,官方文档这么说的:为实现下拉刷新功能,大多H5框架都是通过DIV模拟下拉回弹动画,在低端android手机上,DIV动画经常出现卡顿现象(特别是图文列表的情况); mui通过双webview解决这个DIV的拖动流畅度问题;拖动时,拖动的不是div,而是一个完整的webview(子webview),回弹动画使用原生动画;在iOS平台,H5的动画已经比较流畅,故依然使用H5方案。
错误示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <meta name= "viewport" content= "width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <title>MUI下拉刷新</title> <link href= "../css/mui.css" rel= "stylesheet" /> </head> <body> <header class = "mui-bar mui-bar-nav" > <a class = "mui-action-back mui-icon mui-icon-left-nav mui-pull-left" ></a> <h1 class = "mui-title" >测试下拉刷新列表</h1> </header> <div class = "mui-content" > <div id= "pullrefresh" class = "mui-content mui-scroll-wrapper" > <div class = "mui-scroll" > <!--数据列表--> <ul class = "mui-table-view mui-table-view-chevron mt50" > <li class = "mui-table-view-cell" > <a href= "sp-upcoming-test-detail.html" class = "mui-navigate-right" >人员名称: monkey</a> </li> </ul> </div> </div> </div> </body> <script src= "../js/mui.js" ></script> <script type= "text/javascript" charset= "utf-8" > mui.init({ pullRefresh: { container: '#pullrefresh' , down: { callback: pulldownRefresh }, up: { contentrefresh: '正在加载...' , callback: pullupRefresh } } }); /** * 下拉刷新具体业务实现 */ function pulldownRefresh() { setTimeout( function () { var table = document.body.querySelector( '.mui-table-view' ); var cells = document.body.querySelectorAll( '.mui-table-view-cell' ); for ( var i = cells.length, len = i + 3 ; i < len; i++) { var li = document.createElement( 'li' ); li.className = 'mui-table-view-cell' ; li.innerHTML = '<a class="mui-navigate-right">人员名称: ' + (i + 1 ) + '</a>' ; //下拉刷新,新纪录插到最前面; table.insertBefore(li, table.firstChild); } mui( '#pullrefresh' ).pullRefresh().endPulldownToRefresh(); //refresh completed }, 1500 ); } var count = 0 ; /** * 上拉加载具体业务实现 */ function pullupRefresh() { setTimeout( function () { mui( '#pullrefresh' ).pullRefresh().endPullupToRefresh((++count > 2 )); //参数为true代表没有更多数据了。 var table = document.body.querySelector( '.mui-table-view' ); var cells = document.body.querySelectorAll( '.mui-table-view-cell' ); for ( var i = cells.length, len = i + 5 ; i < len; i++) { var li = document.createElement( 'li' ); li.className = 'mui-table-view-cell' ; li.innerHTML = '<a class="mui-navigate-right">人员名称: monkey ' + (i + 1 ) + '</a>' ; table.appendChild(li); } }, 1500 ); } </script> </html> |
既然说这个是错误的例子,那自然就是下拉刷新不兼容安卓的,我们通过这个例子和大家说说为何不兼容。
官方的下拉刷新分为3种:
1.单webview下拉刷新
2.双webview下拉刷新
3.div模拟下拉刷新
在安卓使用的的是双webview下拉刷新,但是在电脑上面测试的时候,也就是没有在html5+的环境下测试的时候,是自动给你替换成了div模拟下拉刷新,所以在电脑上面可以看到下拉刷新效果,到了打包之后app里面之后,就启用了双webview下拉刷新的模式,但是没有按照双webview下拉刷新的模板去写,所以在app里面就失效了。(ios里面可以正常使用,因为ios流畅度较高,打包之后,并没有启用双webview下拉刷新的模式,用的还是div下拉刷新模式)。
但是可以对代码稍微修改一下即可,改成双webview下拉刷新规范的代码布局。
双webview下拉刷新分为2个页面:(主页面,子页面)
主页面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <title>主页面</title> <meta name= "viewport" content= "width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no" > <link rel= "stylesheet" href= "css/mui.min.css" > </head> <body> <header class = "mui-bar mui-bar-nav" > <a class = "mui-action-back mui-icon mui-icon-left-nav mui-pull-left" ></a> <h1 class = "mui-title" >测试列表</h1> </header> </body> <script src= "js/mui.min.js" ></script> <script type= "text/javascript" > mui.init({ subpages:[{ //调用子页面刷新的代码 url: '子页面的地址' , //子页面的地址 id: '子页面的id' , //子页面的id,可以自己根据需求随便设置 styles:{ top: '45px' , //子页面距离顶部的距离 bottom: '0px' , //子页面距离底部的距离 } }] }); </script> </html> |
子页面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <meta name= "viewport" content= "width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <title></title> <link href= "css/mui.min.css" rel= "stylesheet" /> </head> <body> <div class = "mui-content" > <div id= "pullrefresh" class = "mui-content mui-scroll-wrapper" > <div class = "mui-scroll" > <!--数据列表--> <ul class = "mui-table-view mui-table-view-chevron mt50" > <li class = "mui-table-view-cell" > <a href= "sp-upcoming-test-detail.html" class = "mui-navigate-right" >人员名称: 张三</a> </li> </ul> </div> </div> </div> </body> <script src= "js/mui.min.js" ></script> <script type= "text/javascript" charset= "utf-8" > mui.init({ pullRefresh: { container: '#pullrefresh' , down: { callback: pulldownRefresh }, up: { contentrefresh: '正在加载...' , callback: pullupRefresh } } }); /** * 下拉刷新具体业务实现 */ function pulldownRefresh() { setTimeout( function () { var table = document.body.querySelector( '.mui-table-view' ); var cells = document.body.querySelectorAll( '.mui-table-view-cell' ); for ( var i = cells.length, len = i + 3 ; i < len; i++) { var li = document.createElement( 'li' ); li.className = 'mui-table-view-cell' ; li.innerHTML = '<a class="mui-navigate-right">人员名称: ' + (i + 1 ) + '</a>' ; //下拉刷新,新纪录插到最前面; table.insertBefore(li, table.firstChild); } mui( '#pullrefresh' ).pullRefresh().endPulldownToRefresh(); //refresh completed }, 1500 ); } var count = 0 ; /** * 上拉加载具体业务实现 */ function pullupRefresh() { setTimeout( function () { mui( '#pullrefresh' ).pullRefresh().endPullupToRefresh((++count > 2 )); //参数为true代表没有更多数据了。 var table = document.body.querySelector( '.mui-table-view' ); var cells = document.body.querySelectorAll( '.mui-table-view-cell' ); for ( var i = cells.length, len = i + 5 ; i < len; i++) { var li = document.createElement( 'li' ); li.className = 'mui-table-view-cell' ; li.innerHTML = '<a class="mui-navigate-right">人员名称: 张三 ' + (i + 1 ) + '</a>' ; table.appendChild(li); } }, 1500 ); } </script> </html> |
这样就可以实现打包成安卓APP后下拉刷新无兼容问题