知識教程 | sendEvent、execScript的應用附源碼(下

上篇說到,經過按鈕來觸發homepage頁面的監聽事件和待執行的函數。最後還有一個打開新win的按鈕,點擊進入下一個頁面。javascript

 

這個新win是幹嗎的?一臉懵逼,點擊去一看,仍是幾個按鈕。可是你要清楚,這個win和index的win不是一個
 

win代碼:css

<!doctype html>html

<html>vue

<head>java

    <meta charset="utf-8">json

    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/>api

    <meta name="format-detection" content="telephone=no,email=no,date=no,address=no">dom

    <title>new_win</title>ide

    <link rel="stylesheet" type="text/css" href="../../css/aui.css" />函數

</head>

<body>

    <header class="aui-bar aui-bar-nav">

    <a class="aui-pull-left aui-btn">

        <span class="aui-iconfont aui-icon-left" onclick="fnBackOff()" tapmode></span>

    </a>

    <div class="aui-title">新頁面</div>

</header>

</body>

<script type="text/javascript" src="../../script/api.js"></script>

<script type="text/javascript">

    apiready = function(){

            $api.fixStatusBar($api.dom('header'));

            api.parseTapmode();

            api.openFrame({

                name:"newFrame",

                url: "./new_frame.html",

                rect: {

                        x:0,

                        y:$api.dom('header').offsetHeight, 

                        w:"auto",

                        h:"auto"

                },

        });

        fnInitEvent();

    };

    /**

     * 修改標題

     * @param {Object} title 標題內容

     */

    function fnExecScriptTest(title){

            $api.text($api.dom(".aui-title"),title);

    };

    /**

     * 返回按鈕

     */

    function fnBackOff(){

            api.closeWin()

    };

    /**

     * 物初始化頁面監聽

     */

    function fnInitEvent(){

            /**監聽物理返回鍵 */

        api.addEventListener({

            name: 'keyback'

        }, function(ret, err) {

                /**若是popwindow是打開狀態*/

            if ($api.getStorage('isPopOpen') == '1') {

                    /**執行popwindow中的關閉方法*/

                    api.execScript({

                    frameName: 'popWindow',

                    script: 'fnClosePop();'

                });

            }else{

                    api.closeWin();

            };

        });

    };

</script>

</html>

複製代碼

是的,這個頁面也有一個待調用的函數,內容是修改標題,還有一個物理返回鍵監聽,爲何監聽呢?先賣個關子。請看frame代碼:

<!DOCTYPE html>

<html>

<head>

        <meta charset="UTF-8">

        <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/>

        <meta name="format-detection" content="telephone=no,email=no,date=no,address=no">

        <title>個人</title>

        <link rel="stylesheet" type="text/css" href="../../css/aui.css"/>

</head>

<body>

        <div class="aui-content">

                <div class="aui-text-center">也放幾個按鈕吧</div>

                <div class="aui-content-padded">

                    <p><div class="aui-btn aui-btn-primary aui-btn-block aui-btn-sm aui-margin-b-10" onclick="fnSendEvent()" tapmode>試試sendEvent</div></p>

                    <p><div class="aui-btn aui-btn-success aui-btn-block aui-btn-sm aui-margin-b-10" onclick="fnExecScript()" tapmode>試試execScript</div></p>

                        <p><div class="aui-btn aui-btn-info aui-btn-block aui-btn-sm aui-margin-b-10" onclick="fnChangeTitle()" tapmode>改一下title</div></p>

                        <p><div class="aui-btn aui-btn-danger aui-btn-block aui-btn-sm aui-margin-b-10" onclick="fnOpenPop()" tapmode>打開一個popWindow</div></p>

                </div>

                <div class="aui-content-padded aui-hide" id="sendEnvet-code">

                        <p>快去首頁看執行效果,發送監聽消息代碼以下:</p>

                        <p>api.sendEvent({</p>

                        <p style="text-indent: 2em;">name: 'showCode',</p>

                        <p style="text-indent: 2em;">extra: {</p>

                        <p style="text-indent: 4em;">key1: 'value1',</p>

                        <p style="text-indent: 4em;">key2: 'value2'</p>

                        <p style="text-indent: 2em;">}</p>

                        <p>});</p>

                </div>

                <div class="aui-content-padded aui-hide" id="execScript-code">

                        <p>快去首頁看執行效果,發送跨頁面執行函數代碼:</p>

                        <p>api.execScript({</p>

                        <p style="text-indent: 2em;">name: 'root',</p>

                        <p style="text-indent: 2em;">frameName: 'homepage',</p>

                        <p style="text-indent: 2em;">script: "fnExecScriptTest(1)"</p>

                        <p>});</p>

                </div>

        </div>

</body>

<script type="text/javascript" src="../../script/api.js"></script>

<script type="text/javascript" src="../../script/aui-dialog.js"></script>

<script type="text/javascript">

        /**

         * api初始化

         */

        apiready = function(){

                api.parseTapmode();

        };

        /**

         * 發送監聽消息

         */

        function fnSendEvent(){

                $api.removeCls($api.dom("#sendEnvet-code"),"aui-hide");

                api.sendEvent({

                    name: 'showCode',

                    extra: {

                        key1: 'value1',

                        key2: 'value2'

                    }

                });

        };

        /**

         * 跨頁面執行函數

         */

        function fnExecScript(){

                $api.removeCls($api.dom("#execScript-code"),"aui-hide");

                api.execScript({

                        name:'root',

                    frameName: 'homepage',

                    script: "fnExecScriptTest(1)"

                });

        };

        function fnChangeTitle(){

                var dialog = new auiDialog();

                dialog.alert({

                    title:"改個啥好呢?",

                    buttons:['取消','肯定'],

                    input:true

                },function(ret){

                    if(ret.buttonIndex ==2 && ret.text!=""){

                            api.execScript({

                                    script: "fnExecScriptTest('"+ret.text+"')"

                                });

                    };

                });

        };

        /**

         * 打開pop窗口

         */

        function fnOpenPop(){

                $api.setStorage("isPopOpen",'1');

                api.openFrame({

                    name: 'popWindow',

                    url: './popWindow.html',

                    rect: {

                        x: 0,

                        y: 0,

                        w: 'auto',

                        h: 'auto'

                    },

                    pageParam: {

                                frameName:api.frameName

                    }

                });

        };

        /**

         * 選擇的回調

         * @param {Object} data

         */

        function fnChooseCallback(data){

                api.toast({

                        msg: '你點擊了第'+data.index+'個按鈕,數據爲:'+JSON.stringify(data.data)

                });

        };

</script>

</html>

第三個按鈕,修改title,title是在當前win裏邊的dom元素,因此跨頁面執行win裏邊的修改title方法,而且把要修改的title用參數傳過去。

可是這第四個按鈕是來搞笑的嗎?

是的,正如您看到的,點擊第四個按鈕,出來一個彈窗,動畫效果有點屎。。。但不影響講解

打開這個彈窗的時候,我設置了一個$api.setStorage("isPopOpen",'1');這個是我後來用做判斷是否打開pop頁面的。
 

這就是那個彈窗頁面。點擊空白處,和點擊按鈕都會退出這個頁面,不一樣的是點擊按鈕會帶着參數走,此次的參數不是string,是個json字符串。

代碼:

<!DOCTYPE html>

<html>

<head>

        <meta charset="utf-8">

        <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/>

        <meta name="format-detection" content="telephone=no,email=no,date=no,address=no">

        <title>Pop Window</title>

        <link rel="stylesheet" type="text/css" href="../../css/aui.css" />

        <style>

                html,body{background: rgba(0,0,0,0);width: 100%;height: 100%;}

                .pop-fail{width: 100%;height: 100%;background: rgba(0,0,0,.6);}

                .pop-content{position: fixed;width: 100%;left:100%;background: #FFFFFF;}

                .pop-content.show{left: 0;transition: left 0.5s;}

                .pop-content.hide{left: -100%;transition: left 0.2s;}

        </style>

</head>

<body>

        <div class="pop-fail" onclick="fnClosePop()" tapmode></div>

        <div class="pop-content" >

                <div class="aui-content-padded" v-for="(item,index) in data">

                        <p><div class="aui-btn aui-btn-info aui-btn-block aui-btn-sm" :data-tag = "index+1" onclick="fnClick(this)" tapmode>{{item.name}}</div></p>                        

                </div>

        </div>

</body>

<script type="text/javascript" src="../../script/api.js"></script>

<script type="text/javascript" src="../../script/vue.js"></script>

<script type="text/javascript">

        var vm;

        /**

         * api初始化

         */

        apiready = function(){

                /**vue初始化*/

                vm = new Vue({

                           el:'.pop-content',

                           data:{

                                   data:[]

                           }

            });

            fnInitData();

        };

        /**

         * 初始化頁面數據

         */

        function fnInitData(){

                var data = [{name:'按鈕1'},{name:'按鈕2'},{name:'按鈕3'},{name:'按鈕4'}];

                fnInitView(data);

        };

        /**

         * 初始化頁面佈局

         * @param {Object} data

         */

        function fnInitView(data){

                vm.data = data;

                vm.$nextTick(function(){

                        var fail = $api.dom(".pop-fail");

                        var content = $api.dom(".pop-content");

                        var top = fail.offsetHeight/2 - content.offsetHeight/2;

                        content.style.top = top+'px';

                        $api.addCls($api.dom(".pop-content"),'show');

                        api.parseTapmode();

                });

        };

        /**

         * 點擊某一個按鈕

         * @param {Object} dom 

         */

        function fnClick(dom){

                var index = $api.attr(dom,"data-tag");

                var data = vm.data[index-1];

                var newJson = {index:index,data:data};

                $api.addCls($api.dom(".pop-content"),'hide');

                setTimeout(function(){

                        api.execScript({

                            frameName:api.pageParam.frameName,

                            script: 'fnChooseCallback('+JSON.stringify(newJson)+')'

                        });

                        $api.setStorage("isPopOpen",'0');

                        api.closeFrame();

                },200);

        };

        /**

         * 關閉頁面

         */

        function fnClosePop(){

                $api.addCls($api.dom(".pop-content"),'hide');

                $api.setStorage("isPopOpen",'0');

                setTimeout(function(){

                        api.closeFrame();

                },200);

        };

</script>

</html>

 

點擊按鈕會退出,而且執行另外一個frame裏的api.toast。

 

你會不會疑問,點擊物理返回鍵會怎樣?

一般會closeWin也就是pop和上一個frame通通say goodbye。 可是記不記得我在win裏有一段返回鍵監聽?

是的,根據$api.getStorage('isPopOpen');選擇直接closeWin()仍是執行css動畫再退出

 

 

本文轉載自APICloud官方論壇,感謝「楊願」的分享!

相關文章
相關標籤/搜索