美文网首页
[Apicloud] 监听物理返回键实现返回和退出

[Apicloud] 监听物理返回键实现返回和退出

作者: FFStudio | 来源:发表于2019-06-22 19:36 被阅读0次

前言:

apicloud中最常用的两种打开新页面的方式是 openWin 和 openFrame

而apicloud提供的api:

api.addEventListener({

        name: 'keyback'

    }, function(ret, err){    

        alert('按了返回键');

});

必须在 Window 中注册才有效,Frame 中注册无效,并且只在当前屏幕上的 window 才能收到回调。

但是 openWin 占用的资源比 openFrame 高太多,稍微打开几个页面就会有明显的卡顿。

因此这里简单的实现了一个通过拦截 openFrame,在缓存中实现一个简单的historyList,来实现点击物理返回实现返回上一页

准备:

新打开一个页面:

api.openFrame({

        name: name, // 新打开的Frame的名字,apicloud会根据名字来判断到底是哪个frame

        url: path. // 打开页面的地址

    });

设置缓存:

api.setGlobalData({

            key: 'historyList', // 存放的缓存的 key

            value: JSON.stringify(historyList), // 官方文档说介意放json对象,但是数组放不了,所以转换成字符串

        });

获取缓存:

api.getGlobalData({

        key: 'historyList' // 根据ke来获取缓存

    })

实现:

首先新建一个 tools.js 文件,里面放上下边代码:

let whiteList = ['login', 'home']  // 按下返回键退出程序的页面,若不在whiteList中则是返回上一页

// 跳转  参数: 新打开frame的名字 | 新打开页面的路径 | 需要传递的参数

function goto (name, path, pageParam) {

    // 保存历史记录

    let historyList = api.getGlobalData({

        key: 'historyList'

    }) || '[]'; // 历史记录 首次进入是没有值的 所以赋值为字符串 ‘[]’ 

    historyList = JSON.parse(historyList) // 转换为数组

    historyList.push(name)     // 将新页面放进history

    api.setGlobalData({ // 将history 存入缓存

        key: 'historyList',

        value: JSON.stringify(historyList)

    });

    api.openFrame({ // 打开新页面

        name: name,

        url: path,

        bounces: false,

        rect: {

            w: 'auto'

        },

        animation: {

            type: 'push',

            subType: 'from_bottom'

        },

        pageParam: pageParam // 需要传递的参数

    });

}

// 返回上一页

function back () {

    let historyList = api.getGlobalData({

        key: 'historyList'

    }); // 获取历史记录

    historyList = JSON.parse(historyList)  // 转换为数组

    let frame = historyList[historyList.length - 1]  // 获取到当前页面的name,即最后打开的这个页面

    if (whiteList.includes(frame)) { // 如果是在 whiteList 中则执行 关闭app 的操作

        api.closeWidget({

            id: appID // 这里替换成你的appid

        });

    } else { // 若没在whiteList中 则执行返回上一页操作

        historyList.pop() // 将本页从history中移除

        api.setGlobalData({ 

            key: 'historyList',

            value: JSON.stringify(historyList) // 更新historyList

        });

        api.closeFrame({ // 关闭本页,apicloud自动打开上一个frame,实现返回上一页的效果

            name: frame

        })

    }

}

最后,在程序入口页面 index.html中先引入 tools.js, 然后放入以下代码:

apiready = function() {

        goto('login', 'html/login.html') // 进入程序跳转到登录页,根据自己情况调整

        // 拦截返回键 

        api.addEventListener({

            name: 'keyback'

        }, function(ret, err) {

            back() // 执行返回操作

            return

        });

    };

后言:

goto 和 back 方法中可以拓展很多内容,

比如返回是否刷新上一页,实现自定义router等等

我这个程序比较简单就深入了。

文中如果有地方讲的不对,欢迎指正,欢迎交流。

相关文章

网友评论

      本文标题:[Apicloud] 监听物理返回键实现返回和退出

      本文链接:https://www.haomeiwen.com/subject/mkivqctx.html