请选择 进入手机版 | 继续访问电脑版
帖子
帖子
用户
博客
课程
显示全部楼层
124
帖子
0
勋章
2476
Y币

缓存win复用win的js,解决openwin卡顿,包教不包会

[复制链接]
发表于 2015-10-16 10:37:58
本帖最后由 老油条 于 2015-10-22 09:13 编辑
  1. <div class="blockcode"><blockquote>var myapi = '';
  2. (function() {
  3.         var myapireadyDoSomething = [];
  4.         apiready = function() {
  5.                 for (var i = 0; i < myapireadyDoSomething.length; i++) {
  6.                         myapireadyDoSomething[i]();
  7.                 }
  8.                 api.addEventListener({
  9.                         name: 'keyback'
  10.                 }, function(ret, err) {
  11.                         if (keyBackName != '') {
  12.                                 hideWin();
  13.                         }
  14.                 })
  15.         }

  16.         function myapiready(c) {
  17.                 myapireadyDoSomething.push(c);
  18.         }

  19.         function openWin(d) {
  20.                 $api.setStorage(d.name + '_data', {
  21.                         pageParam: d.pageParam,
  22.                         keyBackName: api.winName
  23.                 });
  24.                 api.openWin({
  25.                         name: d.name,
  26.                         url: d.url
  27.                 });
  28.         }
  29.         var keyBackName = '';
  30. var viewAppear=[];
  31.         function mydataReady(cb) {
  32.                 api.addEventListener({
  33.                         name: 'viewappear'
  34.                 }, function(ret, err) {
  35.                         for (var i=0;i<viewAppear.length;i++) {
  36.                                 viewAppear[i]();
  37.                         }
  38.                         var dataForWin = $api.getStorage(api.winName + '_data');
  39.                         if(typeof(dataForWin)!='undefined'){
  40.                                 keyBackName = dataForWin.keyBackName;
  41.                         $api.rmStorage(api.winName + '_data');
  42.                         return cb(dataForWin.pageParam, err);
  43.                         }else{
  44.                                 return cb({}, err);
  45.                         }
  46.                 })
  47.         }
  48.         function vEvent(cb){
  49.                 viewAppear.push(cb);
  50.         }
  51.         function hideWin(){
  52.         api.openWin({
  53.                         name: keyBackName,
  54.                         animation: {
  55.                         type: "push",
  56.                         subType: "from_left",
  57.                         duration: 300
  58.                         }
  59.                 })
  60.         }
  61.         myapi = {
  62.                 myapiready: myapiready,
  63.                 openWin: openWin,
  64.                 mydataReady: mydataReady,
  65.                 hideWin:hideWin,
  66.                 vEvent:vEvent
  67.         }
  68. })()
复制代码


winA需要复用winB,或者winB需要多次利用。不推荐偶尔使用的win功能使用此js;
why myapi.js?
openWin的代价太高,需要重复使用的win并不需要每次close,open,reload=true体验也不好;这种体验就是卡卡卡卡卡卡卡卡卡卡。
how to use?
myapi.myapiready(function(){ doSomething();})的功能替代apiready,并且这个可以使用多次,都是能触发的;
myapi.openWin();打开win,与api.openwin的使用方法类似;支持name,url,pageParam
例如:
myapi.openWin({
    name:'index',
    url:'./html/index.html',
    pageParam:{
           test:'xxxxx'
    }  
});
myapi.mydataReady(function(ret,err) {doSomething(ret);}) 这是页面准备好以后出发的数据接收入口,ret为数据传过来的数据,相当于api.pageParam;
myapi.hideWin();把win切换到后面,作用是缓存,默认在keyback注册了该事件;
myapi.vEvent(function(){}) 暴露出viewappear事件
1682
帖子
10
勋章
2476
Y币
感谢分享
0
帖子
0
勋章
57
Y币
必须点赞!
1
帖子
0
勋章
841
Y币
尽量都在一个WIN里搞定
5
帖子
0
勋章
139
Y币
这个不错
4
帖子
0
勋章
58
Y币
要是win跟frame一样可以hide就好了。
4
帖子
0
勋章
48
Y币
打开隐藏窗口的时候页面似乎再次渲染了,会有闪屏和卡顿
123
帖子
0
勋章
1275
Y币
这种和appcan的有点类似,只是appcan引擎是在关闭前将win的实例单独存放在一个类似堆栈中的,然后在界面上再执行移除操作,打开win的时候会从该堆栈中查询是否存在,不存在才会创建,而楼主分享的这种方法win虽然保留了下来,但是并没有从屏幕上移除,只是隐藏了,在Android中不显示的win也会进行渲染,如果要创建的win多的话就不太好了,还是建议官方参考appcan的close方式,进行实例缓存
71
帖子
0
勋章
328
Y币

想办法优化啊
您需要登录后才可以回帖 登录

本版积分规则