AppCan前端速度优化方案

AppCan前端速度优化方案


一. 开启硬件加速

开启硬件加速会极大提升页面切换速度

  1. 开启方法是在config.xml文件中配置

     <hardware>true</hardware>
    
  2. 某些场景下硬件加速会与业务逻辑冲突,解决方案为:全局开启硬件加速保证速度,在特定场景关闭硬件加速,保证业务逻辑正常;代码如下,详见Demo

     var extras = {
         extraInfo: {//网页配置
             hardware: 0//是否开启硬件加速,0:否,1:开启(仅Android)
         }
     };
     //须直接使用uexWindow.open方法,文档地址:http://newdocx.appcan.cn/newdocx/docx?type=1390_1249#open
     uexWindow.open('singlePage_normal', '0', 'singlePage_normal.html', 10, '', '', 0, 500, JSON.stringify(extras));
    

二. 单页面(webview)改造

单webview改造会明显提升运行速度,且只有单webview时,才能实现打开新页面时input自动弹出键盘的功能

1.1、 依赖

须引入

  • ui-base.css
  • appcan.js
  • appcan.control.js
    **

需要页面弹动时引入,可实现下拉刷新下载加载功能

  • appcan.scrollbox.js

需要tab选项卡时引入,常用于主界面,可免去预加载处理

  • template.import.js
  • appcan.tab.js

1.2、普通单页面

模板代码如下,根据注释,将对应内容填入对应区域即可:

详细见Demo中的singlePage_normal.html文件

<!DOCTYPE html>
<html class="um landscape min-width-240px min-width-320px min-width-480px min-width-768px min-width-1024px">
<head>
    <title>普通单页面</title>
    <meta charset="utf-8">
    <meta name="viewport"
          content="target-densitydpi=device-dpi, width=device-width, initial-scale=1, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <link rel="stylesheet" href="css/fonts/font-awesome.min.css">
    <link rel="stylesheet" href="css/ui-box.css">
    <link rel="stylesheet" href="css/ui-base.css">
    <link rel="stylesheet" href="css/ui-color.css">
    <link rel="stylesheet" href="css/appcan.icon.css">
    <link rel="stylesheet" href="css/appcan.control.css">
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="page_0" class="bc-bg" data-control="PAGE">

    <!--header开始-->
    <div id="header" class="uh bc-head ub ubb bc-border bc-text-head" data-control="HEADER">
        <!--左边-->
        <div class="nav-btn" id="nav-left">
            <!--返回按钮图标-->
            <div class="ub ub-img tagimg tagwh"></div>
        </div>
        <!--中间-->
        <h1 id="title" class="ut ub-f1 ulev-3 ut-s tx-c">普通单页面</h1>
        <!--右边-->
        <div class="nav-btn" id="nav-right">右边</div>
    </div>
    <!--header结束-->

    <!--content开始-->
    <div id="content" data-control="CONTENT">
        <div id="scrollBox" class="" data-control="ScrollBOX" data-bounce="1">
            <div data-control="BounceBox">

                <!--下拉刷新控件-->
                <div class="box_bounce ub ub-ver ub-pc">
                    <div class="ub-f1"></div>
                    <!--正在下拉-->
                    <div id="draging" class="bounce_status"></div>
                    <!--触发下拉刷新的界限-->
                    <div id="dragToReload" class="bounce_status"></div>
                    <!--下拉刷新回调触发后-->
                    <div id="releaseToReload" class="bounce_status"></div>
                </div>

                <!--内容区域,在这里放界面的HTML代码-->

                <!--内容区域结束-->

            </div>
        </div>
    </div>
    <!--content结束-->

</div>
<script src="js/appcan.js"></script>
<script src="js/appcan.control.js"></script>
<script src="js/appcan.scrollbox.js"></script>
</body>
<script>

    /**
     * 下拉刷新和上拉加载
     * Scroll BOX function DEMO START
     */
    (function ($) {
        //初始化下拉刷新
        initPullDownRefresh(
                //下拉刷新的回调
                function () {
                    console.log("下拉刷新");
                    endPullDownRefreshLately(500);
                }
                //上拉到底部的回调
                , function () {
                    console.log("上拉加载");
                }
                //是否显示提示语
                , true
        );
    })($);

    //插件加载完成的回调
    appcan.ready(function () {

        console.log("appcan.ready");

        //手动调用下拉刷新
        pullDownRefresh();

    });

    //导航栏点击事件
    appcan.button(".nav-btn", "btn-act", function () {
        //左侧
        this.id == "nav-left" && appcan.window.close(-1);
        //右侧
        //this.id == "nav-right" &&;
    });

</script>
</html>

1.3、带有tab栏的单页面

模板代码如下,根据注释,将对应内容填入对应区域即可:

详细见Demo中的singlePage_tab.html文件和singlePage_tab_no_header.html文件

需要注意的地方:

  • 每个tab.html的css和js都要在主页面被引入
  • 如果不需要导航栏header,先删除header的部分,还需要将data-control="CONTENT"修改为data-control="CONTENT_NO_HEADER",原理很简单,即为去掉CONTENT的padding-top = 2.75em属性
<!DOCTYPE html>
<html class="um landscape min-width-240px min-width-320px min-width-480px min-width-768px min-width-1024px">
<head>
    <title>带有tab栏的单页面</title>
    <meta charset="utf-8">
    <meta name="viewport"
          content="target-densitydpi=device-dpi, width=device-width, initial-scale=1, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
    <link rel="stylesheet" href="css/fonts/font-awesome.min.css">
    <link rel="stylesheet" href="css/ui-box.css">
    <link rel="stylesheet" href="css/ui-base.css">
    <link rel="stylesheet" href="css/ui-color.css">
    <link rel="stylesheet" href="css/appcan.icon.css">
    <link rel="stylesheet" href="css/appcan.control.css">
    <link rel="stylesheet" href="css/style.css">
    <link rel="stylesheet" href="css/main.css">
</head>
<body>
<div id="page_0" class="bc-bg" tabindex="0" data-control="PAGE">

    <!--header开始-->
    <div id="header" class="uh bc-head ub ubb bc-border bc-text-head" data-control="HEADER">
        <!--左边-->
        <div class="nav-btn" id="nav-left">
            <!--返回按钮图标-->
            <div class="ub ub-img tagimg tagwh"></div>
        </div>
        <!--中间-->
        <h1 id="title" class="ut ub-f1 ulev-3 ut-s tx-c">带有tab栏的单页面</h1>
        <!--右边-->
        <div class="nav-btn" id="nav-right">右边</div>
    </div>
    <!--header结束-->

    <!--header结束--><!--content开始-->
    <div id="content" class="" data-control="CONTENT">
        <div class="" data-control="ScrollBOX" data-bounce="1">
            <div data-control="BounceBox">
                <div class="box_bounce ub ub-ver ub-pc">
                    <div class="ub-f1"></div>
                    <div class="bounce_status">
                        下拉更新......
                    </div>
                    <div class="bounce_status">
                        松手更新......
                    </div>
                    <div class="bounce_status">
                        更新中......
                    </div>
                </div>

                <!--内容区域,在这里放界面的HTML代码-->
                <div class="tab_pane active" data-import="tab1.html">

                </div>
                <div class="tab_pane" data-import="tab2.html">

                </div>
                <div class="tab_pane" data-import="tab3.html">

                </div>
                <!--内容区域结束-->

            </div>
        </div>

    </div>
    <!--content结束-->
    <div id="tabview" class="uf sc-bg ubt sc-border-tab" data-control="FOOTER"></div>

</div>
<script src="js/appcan.js"></script>
<script src="js/appcan.control.js"></script>
<script src="js/appcan.listview.js"></script>
<script src="js/appcan.scrollbox.js"></script>
<script src="js/template.import.js"></script>
<script src="js/appcan.tab.js"></script>
</body>
<script>

    //插件加载完成的回调
    appcan.ready(function () {

    });

    //导航栏点击事件
    appcan.button(".nav-btn", "btn-act", function () {
        //左侧
        this.id == "nav-left" && appcan.window.close(-1);
        //右侧
        //this.id == "nav-right" &&;
    });

    //按钮点击事件
    appcan.button(".btn", "btn-act", function () {
    });

    /**
     * 下拉刷新和上拉加载
     * Scroll BOX function DEMO START
     */
    (function ($) {
        //初始化下拉刷新
        initPullDownRefresh(
                //下拉刷新的回调
                function () {
                    console.log("下拉刷新");
                    endPullDownRefreshLately(500);
                }
                //上拉到底部的回调
                , function () {
                    console.log("上拉加载");
                    //添加数据
                    addData();
                }
                //是否显示提示语
                , true
        );
    })($);

    /**
     * 底部tab栏点击事件
     * Scroll BOX function DEMO END
     */
    var tabview = appcan.tab({
        selector: "#tabview",
        hasIcon: true,
        hasAnim: true,//控制是否有下方滑块和动画
        hasLabel: false,
        hasBadge: false,
        data: [{
            label: "QQ",
            "icon": "fa-qq"
        }, {
            label: "微软",
            "icon": "fa-windows"
        }, {
            label: "微信",
            "icon": "fa-weixin"
        }]
    });
    tabview.on("click", function (obj, index) {
        $(".tab_pane").removeClass("active");
        $($(".tab_pane")[index]).addClass("active");
    });

</script>
</html>

2、API概览

2.1 方法:

初始化下拉刷新和上拉加载

initPullDownRefresh(pullDownRefreshCallback, pullUpLoadingCallback, isShowTips)

说明:

初始化下拉刷新和上拉加载

参数:

| 参数名称 | 参数类型 | 说明 |
| ----- | ----- | ----- | ----- |
| pullDownRefreshCallback| function| 下拉刷新的回调 |
| pullUpLoadingCallback| function| 上拉到底部的回调 |
| isShowTips| boolean| 是否显示提示语,true显示;false不显示,只有弹动效果 |

示例:

    /**
     * 下拉刷新和上拉加载
     * Scroll BOX function DEMO START
     */
    (function ($) {
        //初始化下拉刷新
        initPullDownRefresh(
                //下拉刷新的回调
                function () {
                    console.log("下拉刷新");
                }
                //上拉到底部的回调
                , function () {
                    console.log("上拉加载");
                }
                //是否显示提示语
                , true
        );
    })($);

注意事项

  1. 调用该方法初始化下拉刷新和上拉加载时须放在(function ($) {})($)之间,否则无效果

  2. 如不想调用下拉刷新,不调用该方法或者删除appcan.scrollbox.js都可以;

  3. 提示语即是下拉刷新的样式,为了统一风格,将其写在appcan.scrollbox.js中已便复用,如不满意,可以在appcan.scrollbox.js中自行修改

/**
 * 初始化下拉刷新
 *
 * @param pullDownRefreshCallback 下拉刷新的回调
 * @param pullUpLoadingCallback 上拉到底部的回调
 * @param isShowTips 是否显示提示语
 */
function initPullDownRefresh(pullDownRefreshCallback, pullUpLoadingCallback, isShowTips) {
    var $el = $("body");
    var isShowTipsCurrent = true;
    if (isShowTips != null) {
        isShowTipsCurrent = isShowTips;
    }
    scrollViewInstance = $.scrollbox($el);
    scrollViewInstance.on("releaseToReload", pullDownRefreshCallback
    ).on("onReloading", function (a) {//if onreloading status, drag will trigger this event
    }).on("dragToReload", function () {//到达下拉刷新的边界 drag over 30% of bounce height,will trigger this event
    }).on("draging", function (percent) {//正在下拉on draging, this event will be triggered.
    }).on("scrollbottom", pullUpLoadingCallback);

    if (isShowTipsCurrent == false) {
        return;
    }

    //这里可以定义下拉的样式
    $('#draging').html('下拉刷新');
    $('#dragToReload').html('释放更新');
    $('#releaseToReload').html('加载中');
}

主动调用下拉刷新

pullDownRefresh()

说明:

主动调用下拉刷新

参数:

示例:

    //插件加载完成的回调
    appcan.ready(function () {
        console.log("appcan.ready");
        //手动调用下拉刷新
        pullDownRefresh();
    });

结束下拉刷新

endPullDownRefresh()

说明:

结束下拉刷新

参数:

示例:

    /**
     * 下拉刷新和上拉加载
     * Scroll BOX function DEMO START
     */
    (function ($) {
        //初始化下拉刷新
        initPullDownRefresh(
                //下拉刷新的回调
                function () {
                    console.log("下拉刷新");
                    endPullDownRefresh();
                }
                //上拉到底部的回调
                , function () {
                    console.log("上拉加载");
                }
                //是否显示提示语
                , true
        );
    })($);

三.打开新页面时input自动获得焦点并弹出键盘

在appcan.ready的回调中获得input标签的焦点,并调用uexWindow.showSoftKeyboard()方法即可

调用uexWindow.hideSoftKeyboard()隐藏键盘

    //插件加载完成的回调
    appcan.ready(function () {

        console.log("appcan.ready");

        //input输入框获得焦点
        $('#input1').focus();
        //弹出键盘,延时弹出体验更好
        setTimeout(function () {
            uexWindow.showSoftKeyboard();
        }, 500);

    });

详细见Demo中的singlePage_input_focus.html文件

注意事项

开启页面打开键盘、关闭页面隐藏键盘时推荐增减延时;
经实际测试发现,低端机器打开页面同时开启键盘或者关闭页面同时隐藏键盘会出现卡顿、闪屏的现象,增加延时后消失,具体效果见Demo。

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

推荐阅读更多精彩内容