HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

关于第三方登录,IOS端不能注销登录用户信息的解决办法

iOS

首先我在别的帖子上看到了,如何取消掉Android端的第三方登录的信息,同时该题主也提出了IOS 端无法注销登录信息的,
在这里我分享一下自己的解决经验,(官方文档,是通过authorResult来进行判断触发logout方法,IOS端没有这个参数,所以我跳过判断直接调用方法,IOS端全部为注销成功提示,Android端方面,如果有登录信息的则是注销成功,没有登录信息的注销失败)

继续阅读 »

首先我在别的帖子上看到了,如何取消掉Android端的第三方登录的信息,同时该题主也提出了IOS 端无法注销登录信息的,
在这里我分享一下自己的解决经验,(官方文档,是通过authorResult来进行判断触发logout方法,IOS端没有这个参数,所以我跳过判断直接调用方法,IOS端全部为注销成功提示,Android端方面,如果有登录信息的则是注销成功,没有登录信息的注销失败)

收起阅读 »

NUI 富文本编辑器

现在的 MUI 缺少一个富文本编辑器的东西,希望能加上!
功能不需要太多,就像是 发起 --> 发起文章 这样的编辑器就很好,简单好用!

现在的 MUI 缺少一个富文本编辑器的东西,希望能加上!
功能不需要太多,就像是 发起 --> 发起文章 这样的编辑器就很好,简单好用!

视频教程 mui h5+ app实战开发视频

hellomui HelloH5

大家好东翌学院周年庆提供订阅视频教学最低优惠,基础课程包含的(HTML CSS H5 JS Castapp.js,MUI,H5+,PHP mysql,React-Native,Ecmascript6,React.js)只要299元!
高级课程包含的(HTML CSS H5 JS Castapp.js,MUI,H5+,PHP mysql,React-Native,Ecmascript6,React.js mui-UI实战 mui-h5+ APP开发实战功能)只要499元!进入教室 上午十点 下午三点 晚上八点老师直播老师qq2971611409

继续阅读 »

大家好东翌学院周年庆提供订阅视频教学最低优惠,基础课程包含的(HTML CSS H5 JS Castapp.js,MUI,H5+,PHP mysql,React-Native,Ecmascript6,React.js)只要299元!
高级课程包含的(HTML CSS H5 JS Castapp.js,MUI,H5+,PHP mysql,React-Native,Ecmascript6,React.js mui-UI实战 mui-h5+ APP开发实战功能)只要499元!进入教室 上午十点 下午三点 晚上八点老师直播老师qq2971611409

收起阅读 »

【文档】mui.slider轮播组件常用API

图片轮播 slide mui

组件介绍

轮播组件是mui提供的一个核心组件,在该核心组件基础上,衍生出了图片轮播、可拖动式图文表格、可拖动式选项卡、左右滑动9宫格等组件。

示例

获取slide组件对象

var slider = mui('#slider').slider();  

常用API

gotoItem(index)
切换到指定轮播

slider.gotoItem(1); //切换至第二个轮播  

prevItem()
上一个轮播

slider.prevItem();  

nextItem()
下一个轮播

slider.nextItem();  

getSlideNumber()
当前所处位置

slider.getSlideNumber();  

stopped
禁用/开启滑动切换

slider.stopped = false; //开启滑动切换  
slider.stopped = true; //关闭滑动切换  

更多

附上一个简单的示例,解压后将html文件放在mui工程的根目录下即可预览效果。
更多关于slide组件的介绍,参考mui官方文档

PS:关于slide组件,使用过程中如有更多的疑问,请在下方留言。

继续阅读 »

组件介绍

轮播组件是mui提供的一个核心组件,在该核心组件基础上,衍生出了图片轮播、可拖动式图文表格、可拖动式选项卡、左右滑动9宫格等组件。

示例

获取slide组件对象

var slider = mui('#slider').slider();  

常用API

gotoItem(index)
切换到指定轮播

slider.gotoItem(1); //切换至第二个轮播  

prevItem()
上一个轮播

slider.prevItem();  

nextItem()
下一个轮播

slider.nextItem();  

getSlideNumber()
当前所处位置

slider.getSlideNumber();  

stopped
禁用/开启滑动切换

slider.stopped = false; //开启滑动切换  
slider.stopped = true; //关闭滑动切换  

更多

附上一个简单的示例,解压后将html文件放在mui工程的根目录下即可预览效果。
更多关于slide组件的介绍,参考mui官方文档

PS:关于slide组件,使用过程中如有更多的疑问,请在下方留言。

收起阅读 »

【源码分享】分享一个基于官方share.html简化的分享js代码(微信,朋友圈,QQ)

分享插件 微信 分享 微博分享

基于官方demo中的share.hml中的分享内容或者链接到微博,微信,QQ,自己简化了一个通用的分享方法,进一步减少分享功能的开发量。

代码附件中,由于不能上传html文件,所以把文件扩展名改成了doc,下载下来后改成share.html就可以了

js代码如下,也可以把文件中的js代码直接放到js文件中。
用法:

//这里的入口方法是   
/**  
 * 分享内容或者链接  
 * @param  {JSON} msgdata 分享数据的对象  
 * msgdata = {‘title’:'','href':'','desc':'','pic':''} 包含4个字段  
 * @param  {Boolean} ishref  是否分享链接  
 */  
function appshare(msgdata, ishref){}  
//例如引入了js文件后,  
appshare({'title':'DCloud HBuilder-做最好的HTML5开发工具','href':'http://www.dcloud.io/','desc':'我正在使用HBuilder+HTML5开发移动应用,赶紧跟我一起来体验!','pic':'_www/img/logo.png'},true)

具体js代码:


var shares = null;  
mui.plusReady(function() {  
    // 更新分享服务  
    plus.share.getServices(function(s) {  
        shares = {};  
        for(var i in s) {  
            var t = s[i];  
            shares[t.id] = t;  
        }  
    }, function(e) {  
        mui.toast("无享服务!");  
        console.log("获取分享服务列表失败:" + e.message);  
    });  
});  

/**  
 * 分享操作  
 * @param {JSON} sb 分享操作对象s.s为分享通道对象(plus.share.ShareService)  
 * @param {Boolean} ishref 是否分享链接  
 * @param {JSON} msginfo 分享内容  
 */  

function shareAction(sb, ishref, msginfo) {  
    if(!sb || !sb.s) {  
        mui.toast("无效的分享服务!");  
        return;  
    }  
    var msg = { content: msginfo.content, extra: { scene: sb.x } };  
    if(ishref) {  
        msg.title = msginfo.title;  
        msg.href = msginfo.href;  
        msg.content = msginfo.content;  
        msg.thumbs = [msginfo.pic];  
        msg.pictures = [msginfo.pic];  
    }  
    // 发送分享  
    if(sb.s.authenticated) {  
        console.log("---已授权---");  
        shareMessage(msg, sb.s);  
    } else {  
        console.log("---未授权---");  
        sb.s.authorize(function() {  
            shareMessage(msg, sb.s);  
        }, function(e) {  
            console.log("认证授权失败:" + e.code + " - " + e.message);  
        });  
    }  
}  

/**  
 * 发送分享消息  
 * @param {JSON} msg  
 * @param {plus.share.ShareService} s  
 */  
function shareMessage(msg, s) {  
    s.send(  
        msg,  
        function() {  
            mui.toast("分享到\"" + s.description + "\"成功! ");  
        },  
        function(e) {  
            mui.toast("分享到\"" + s.description + "\"失败! ");  
            // console.log("分享到\"" + s.description + "\"失败: " + JSON.stringify(e));  
        }  
    );  
}  

/**  
 * 分享内容或者链接  
 * @param  {JSON} msgdata 分享数据的对象  
 * @param  {Boolean} ishref  是否分享链接  
 */  
var appshare = function (msgdata, ishref) {  
    // 分享参数  
    if(ishref){  
        var msginfo = { title: msgdata.title, href: msgdata.href, content: msgdata.desc, pic: msgdata.pic };  
    }else{  
        var msginfo = { content: msgdata.desc };  
    }  

    var shareBts = [];  
    // 更新分享列表  
    var ss = shares['weixin'];  
    ss && ss.nativeClient && (shareBts.push({ title: '微信朋友圈', s: ss, x: 'WXSceneTimeline' }), shareBts.push({ title: '微信好友', s: ss, x: 'WXSceneSession' }));  

    ss = shares['qq'];  
    ss && ss.nativeClient && shareBts.push({ title: 'QQ', s: ss });  

    if(!ishref){  
        ss = shares['sinaweibo'];  
        ss && shareBts.push({ title: '新浪微博', s: ss });  
    }  

    // 弹出分享列表  
    shareBts.length > 0 ? plus.nativeUI.actionSheet({  
            title: '分享',  
            cancel: '取消',  
            buttons: shareBts  
        },  
        function(e) {  
            (e.index > 0) && shareAction(shareBts[e.index - 1], ishref, msginfo);  
        }  
    ) : plus.nativeUI.alert('当前环境无法支持分享操作!');  
}  
继续阅读 »

基于官方demo中的share.hml中的分享内容或者链接到微博,微信,QQ,自己简化了一个通用的分享方法,进一步减少分享功能的开发量。

代码附件中,由于不能上传html文件,所以把文件扩展名改成了doc,下载下来后改成share.html就可以了

js代码如下,也可以把文件中的js代码直接放到js文件中。
用法:

//这里的入口方法是   
/**  
 * 分享内容或者链接  
 * @param  {JSON} msgdata 分享数据的对象  
 * msgdata = {‘title’:'','href':'','desc':'','pic':''} 包含4个字段  
 * @param  {Boolean} ishref  是否分享链接  
 */  
function appshare(msgdata, ishref){}  
//例如引入了js文件后,  
appshare({'title':'DCloud HBuilder-做最好的HTML5开发工具','href':'http://www.dcloud.io/','desc':'我正在使用HBuilder+HTML5开发移动应用,赶紧跟我一起来体验!','pic':'_www/img/logo.png'},true)

具体js代码:


var shares = null;  
mui.plusReady(function() {  
    // 更新分享服务  
    plus.share.getServices(function(s) {  
        shares = {};  
        for(var i in s) {  
            var t = s[i];  
            shares[t.id] = t;  
        }  
    }, function(e) {  
        mui.toast("无享服务!");  
        console.log("获取分享服务列表失败:" + e.message);  
    });  
});  

/**  
 * 分享操作  
 * @param {JSON} sb 分享操作对象s.s为分享通道对象(plus.share.ShareService)  
 * @param {Boolean} ishref 是否分享链接  
 * @param {JSON} msginfo 分享内容  
 */  

function shareAction(sb, ishref, msginfo) {  
    if(!sb || !sb.s) {  
        mui.toast("无效的分享服务!");  
        return;  
    }  
    var msg = { content: msginfo.content, extra: { scene: sb.x } };  
    if(ishref) {  
        msg.title = msginfo.title;  
        msg.href = msginfo.href;  
        msg.content = msginfo.content;  
        msg.thumbs = [msginfo.pic];  
        msg.pictures = [msginfo.pic];  
    }  
    // 发送分享  
    if(sb.s.authenticated) {  
        console.log("---已授权---");  
        shareMessage(msg, sb.s);  
    } else {  
        console.log("---未授权---");  
        sb.s.authorize(function() {  
            shareMessage(msg, sb.s);  
        }, function(e) {  
            console.log("认证授权失败:" + e.code + " - " + e.message);  
        });  
    }  
}  

/**  
 * 发送分享消息  
 * @param {JSON} msg  
 * @param {plus.share.ShareService} s  
 */  
function shareMessage(msg, s) {  
    s.send(  
        msg,  
        function() {  
            mui.toast("分享到\"" + s.description + "\"成功! ");  
        },  
        function(e) {  
            mui.toast("分享到\"" + s.description + "\"失败! ");  
            // console.log("分享到\"" + s.description + "\"失败: " + JSON.stringify(e));  
        }  
    );  
}  

/**  
 * 分享内容或者链接  
 * @param  {JSON} msgdata 分享数据的对象  
 * @param  {Boolean} ishref  是否分享链接  
 */  
var appshare = function (msgdata, ishref) {  
    // 分享参数  
    if(ishref){  
        var msginfo = { title: msgdata.title, href: msgdata.href, content: msgdata.desc, pic: msgdata.pic };  
    }else{  
        var msginfo = { content: msgdata.desc };  
    }  

    var shareBts = [];  
    // 更新分享列表  
    var ss = shares['weixin'];  
    ss && ss.nativeClient && (shareBts.push({ title: '微信朋友圈', s: ss, x: 'WXSceneTimeline' }), shareBts.push({ title: '微信好友', s: ss, x: 'WXSceneSession' }));  

    ss = shares['qq'];  
    ss && ss.nativeClient && shareBts.push({ title: 'QQ', s: ss });  

    if(!ishref){  
        ss = shares['sinaweibo'];  
        ss && shareBts.push({ title: '新浪微博', s: ss });  
    }  

    // 弹出分享列表  
    shareBts.length > 0 ? plus.nativeUI.actionSheet({  
            title: '分享',  
            cancel: '取消',  
            buttons: shareBts  
        },  
        function(e) {  
            (e.index > 0) && shareAction(shareBts[e.index - 1], ishref, msginfo);  
        }  
    ) : plus.nativeUI.alert('当前环境无法支持分享操作!');  
}  
收起阅读 »

【示例】双首页secondwebview配置的使用

manifest.json配置 Webview HTML5+

概念澄清

HBuilder8.0.1版更新说明App中有一条:
【重要】新增双首页配置(manifest->plus->secondwebview),加速首页为双webview模式时的应用启动速度。

以往流应用或5+App的首页,就是指的入口页面这一个页面,应用启动时native层立即创建这个launchWebview。
双首页配置下,入口页面依旧是launchWebview,但是还有一个secondWebview同时被创建。两个webview的操作由native层完成,大大提高了第二个webview的创建及加载速度。

举例说明

常规方案

以首页父子页面结构为例,子页面的创建在父页面(即首页)中完成。

var launch = plus.webview.getLaunchWebview();  
var home = plus.webview.create('home.html','home', {  
    top: '50px',  
    bottom: 0  
});  
launch.append(home);  

创建子页面这个操作,需要在首页加载完成后才开始。这样就会造成用户先看到首页部分的内容,然后才能看到子页面的内容。

双首页模式

依照更新说明,在manifest.json文件的plus节点下,新增secondwebview节点配置。

"plus": {  
    "secondwebview": {  
        "launch_path": "_www/home.html",  
        "id": "home"  
    }  
}  

这里同样支持secondWebview的styles等属性。

"plus": {  
    "secondwebview": {  
        "launch_path": "_www/home.html",  
        "id": "home",  
        "top": "50px",  
        "bottom": "0px"  
    }  
}  

然后,在launchWebview中建立父子关系即可。当然,如果非必要情况下,是不用建立父子关系的。

var _self = plus.webview.getLaunchWebview();  
var _second = plus.webview.getSecondWebview();  
_self.append(_second);  

在双首页模式下,父页面和子页面的内容是同时显示的,不会给用户造成加载延迟的感觉,大大增强了流应用及5+App的体验。

更多

更多关于HBuilder8.0的更新,以及manifest.json的配置,参考相关文章。
感谢80万开发者厚爱,HBuilder8.0正式发布 【内含重要性能优化新策略】
Manifest.json文档说明 manifest配置

最后附上一个简单的示例源码,解压后真机运行即可。

继续阅读 »

概念澄清

HBuilder8.0.1版更新说明App中有一条:
【重要】新增双首页配置(manifest->plus->secondwebview),加速首页为双webview模式时的应用启动速度。

以往流应用或5+App的首页,就是指的入口页面这一个页面,应用启动时native层立即创建这个launchWebview。
双首页配置下,入口页面依旧是launchWebview,但是还有一个secondWebview同时被创建。两个webview的操作由native层完成,大大提高了第二个webview的创建及加载速度。

举例说明

常规方案

以首页父子页面结构为例,子页面的创建在父页面(即首页)中完成。

var launch = plus.webview.getLaunchWebview();  
var home = plus.webview.create('home.html','home', {  
    top: '50px',  
    bottom: 0  
});  
launch.append(home);  

创建子页面这个操作,需要在首页加载完成后才开始。这样就会造成用户先看到首页部分的内容,然后才能看到子页面的内容。

双首页模式

依照更新说明,在manifest.json文件的plus节点下,新增secondwebview节点配置。

"plus": {  
    "secondwebview": {  
        "launch_path": "_www/home.html",  
        "id": "home"  
    }  
}  

这里同样支持secondWebview的styles等属性。

"plus": {  
    "secondwebview": {  
        "launch_path": "_www/home.html",  
        "id": "home",  
        "top": "50px",  
        "bottom": "0px"  
    }  
}  

然后,在launchWebview中建立父子关系即可。当然,如果非必要情况下,是不用建立父子关系的。

var _self = plus.webview.getLaunchWebview();  
var _second = plus.webview.getSecondWebview();  
_self.append(_second);  

在双首页模式下,父页面和子页面的内容是同时显示的,不会给用户造成加载延迟的感觉,大大增强了流应用及5+App的体验。

更多

更多关于HBuilder8.0的更新,以及manifest.json的配置,参考相关文章。
感谢80万开发者厚爱,HBuilder8.0正式发布 【内含重要性能优化新策略】
Manifest.json文档说明 manifest配置

最后附上一个简单的示例源码,解压后真机运行即可。

收起阅读 »

HBuilder不能返回撤销

例如 先撤销,再向前撤销就不行了

例如 先撤销,再向前撤销就不行了

mui动态索引列表

indexed list

自己写了个三维数组,瞎弄了一下,不知道这样弄对不对,或者还有没有便捷的方法,大神们看一下

自己写了个三维数组,瞎弄了一下,不知道这样弄对不对,或者还有没有便捷的方法,大神们看一下

个推 成功实现推送功能

推送 个推

马上要用到推送功能了,于是就进行了尝试,并成功实现了推送功能!需要注意的点如下:
在做推送功能之前先查看推送插件开发指南
为了能使安卓和ios都能推送,选择透传消息模板。手机用户有自主关闭推送的权利,如果被关闭自然无法收到push。

Android:
1.在个推官网设置appid appsecret等等参数,一定要和app一致,

  1. 个推中的应用标识就是appid,两者一定要一致。
    3.安卓平台打包需要确认打包填写的app包名和在个推平台创建应用时填写的包名相一致。

IOS:
1.证书对应的APPID和在HBuilder打包填写的APPID要一致。
2.IOS平台打包是需要确人打包填写的APPID和提交给个推平台的APS证书内包含的APPID一致。
3.IOS有两个证书,一个是推送证书,一个是开发证书。

继续阅读 »

马上要用到推送功能了,于是就进行了尝试,并成功实现了推送功能!需要注意的点如下:
在做推送功能之前先查看推送插件开发指南
为了能使安卓和ios都能推送,选择透传消息模板。手机用户有自主关闭推送的权利,如果被关闭自然无法收到push。

Android:
1.在个推官网设置appid appsecret等等参数,一定要和app一致,

  1. 个推中的应用标识就是appid,两者一定要一致。
    3.安卓平台打包需要确认打包填写的app包名和在个推平台创建应用时填写的包名相一致。

IOS:
1.证书对应的APPID和在HBuilder打包填写的APPID要一致。
2.IOS平台打包是需要确人打包填写的APPID和提交给个推平台的APS证书内包含的APPID一致。
3.IOS有两个证书,一个是推送证书,一个是开发证书。

收起阅读 »

安卓缓存清除和计算

Android

官方提供的方法中,计算缓存和清除缓存 貌似对安卓系统没有效果,以下是采用原生安卓提供的方法,供有需要的同学参考,自己只有一台魅族手机,不知在其他机型上是否通用。
以下是代码:

var Intent = null,  
            File = null,  
            Uri = null,  
            main = null;  
        var cacheCaleState=false;  
var os=null;  
mui.plusReady(function() {  
     os=plus.os.name;  
            if(os == "Android") {  
                main = plus.android.runtimeMainActivity();  
                Intent = plus.android.importClass("android.content.Intent");  
                File = plus.android.importClass("java.io.File");  
                Uri = plus.android.importClass("android.net.Uri");  
            }  
         initCacheSize();  

      cacheDom.addEventListener('tap', function() {  
                plus.nativeUI.confirm("确定清除缓存? 清除后App中的数据将会被清理,用户需重新登录", function(e) {  
                    if(e.index == 0) {  
                        console.log("cacheCaleState:"+cacheCaleState);  
                        if(os=="Android"){  
                            if(cacheCaleState==true){  
                            clearAllCache();      
                        }else{  
                            mui.toast("缓存计算中……");  
                        }  
                        }else if(os=="iOS"){  
                            clearCache(function(){  
                                //再次计算缓存大小  
                                initCacheSize();  
                            });  
                        }  
                    }  
                }, "新消息通知", ["确定", "取消"]);  
            }, false);  

});

以下是方法体 计算缓存大小

function initCacheSize (){  
            var formatedSize;  
            if(os=="Android"){  
                formatedSize=formatSize(calcCache4Android());  
                cacheCaleState=true;  
                cacheDomChild.innerHTML="清除缓存<span class='mui-badge '>" + formatedSize + "</span>";  
            }else if(os=="iOS"){  
                calcCache(function(size) {  
                    cacheCaleState=true;   
                formatedSize=formatSize(size);  
                cacheDomChild.innerHTML="清除缓存<span class='mui-badge '>" + formatedSize + "</span>";  
            });  
            }else{  
                mui.toast("未知的设备类型,无法计算缓存");  
                cacheCaleState=false;  
            }  
        }  
              /**  
         * 计算缓存大小  官方提供方法,用于iOS  
         */  
        function calcCache(callback) {  
            console.log("开始计算缓存大小");  
            var finalSize = -1;  
            plus.cache.calculate(function(size) {  
                console.log(size + "byte");  
                var sizeInt = parseInt(size);  
                console.log("sizeInt" + sizeInt);  
                return callback(finalSize);  
            });  

        }  

        function calcCache4Android() {  
            var cacheSize=0;  
            console.log("start calc android");  
                var sdRoot = main.getCacheDir();  
                var files = plus.android.invoke(sdRoot,"listFiles");  
                 cacheSize += getFolderSize(files);   
            console.log("android size-->"+cacheSize);  
            return cacheSize;  
        }  

            function getFolderSize(files) {  
                var size = 0;  
                    var len = files.length;  
                    for(var i = 0; i < len; i++) {  
                        // 如果下面还有文件  
                        if(files[i].isDirectory()) {  
                            size = size + getFolderSize(files[i]);  
                        } else if(!files[i].isHidden()){  
                            size = size + files[i].length();  
                        }  
                    }  
                return size;  
        }  

                function formatSize(size){  
            var fileSizeString;  
            size=parseInt(size);  
            console.log("我是size"+size);  
                if(size == 0){  
                    fileSizeString = "0B";  
                }else if(size < 1024){  
                    fileSizeString = size + "B";  
                }else if(size < 1048576){  
                    fileSizeString = (size/1024).toFixed(2) + "KB";  
                }else if (size < 1073741824){  
                    console.log("Mb"+size);  
                    fileSizeString = (size/1048576).toFixed(2) + "MB";  
                    console.log("/ after"+fileSizeString);  
                }else{  
                    fileSizeString = (size/1073741824).toFixed(2) + "GB";  
                }  
                return fileSizeString;  
        }  

以下是删除缓存的方法

 /**  
         * 清除缓存    
         */  
        function clearCache(callback) {  
            plus.storage.clear();  
            plus.cache.clear(function() {  
                console.log("清除了~~~return");  
                return callback();  
            });  
        }  
function clearAllCache4Android(){  
            console.log("清理所有缓存");  
             console.log("main"+main.getCacheDir());  
                var sdRoot = main.getCacheDir();  
                var files = plus.android.invoke(sdRoot,"listFiles");  
                    deleteDir(files);     
                //再次计算缓存大小  
               initCacheSize();  
        }  

        function deleteDir(files){  
                    var len = files.length;  
                    console.log("len:"+len);  
                    for(var i = 0; i < len; i++) {  
                        console.log("delete file dir:"+files[i]);  
                        files[i].delete();  
                    }  
                          }  

方法名比较直观,就没有一一注释了。

继续阅读 »

官方提供的方法中,计算缓存和清除缓存 貌似对安卓系统没有效果,以下是采用原生安卓提供的方法,供有需要的同学参考,自己只有一台魅族手机,不知在其他机型上是否通用。
以下是代码:

var Intent = null,  
            File = null,  
            Uri = null,  
            main = null;  
        var cacheCaleState=false;  
var os=null;  
mui.plusReady(function() {  
     os=plus.os.name;  
            if(os == "Android") {  
                main = plus.android.runtimeMainActivity();  
                Intent = plus.android.importClass("android.content.Intent");  
                File = plus.android.importClass("java.io.File");  
                Uri = plus.android.importClass("android.net.Uri");  
            }  
         initCacheSize();  

      cacheDom.addEventListener('tap', function() {  
                plus.nativeUI.confirm("确定清除缓存? 清除后App中的数据将会被清理,用户需重新登录", function(e) {  
                    if(e.index == 0) {  
                        console.log("cacheCaleState:"+cacheCaleState);  
                        if(os=="Android"){  
                            if(cacheCaleState==true){  
                            clearAllCache();      
                        }else{  
                            mui.toast("缓存计算中……");  
                        }  
                        }else if(os=="iOS"){  
                            clearCache(function(){  
                                //再次计算缓存大小  
                                initCacheSize();  
                            });  
                        }  
                    }  
                }, "新消息通知", ["确定", "取消"]);  
            }, false);  

});

以下是方法体 计算缓存大小

function initCacheSize (){  
            var formatedSize;  
            if(os=="Android"){  
                formatedSize=formatSize(calcCache4Android());  
                cacheCaleState=true;  
                cacheDomChild.innerHTML="清除缓存<span class='mui-badge '>" + formatedSize + "</span>";  
            }else if(os=="iOS"){  
                calcCache(function(size) {  
                    cacheCaleState=true;   
                formatedSize=formatSize(size);  
                cacheDomChild.innerHTML="清除缓存<span class='mui-badge '>" + formatedSize + "</span>";  
            });  
            }else{  
                mui.toast("未知的设备类型,无法计算缓存");  
                cacheCaleState=false;  
            }  
        }  
              /**  
         * 计算缓存大小  官方提供方法,用于iOS  
         */  
        function calcCache(callback) {  
            console.log("开始计算缓存大小");  
            var finalSize = -1;  
            plus.cache.calculate(function(size) {  
                console.log(size + "byte");  
                var sizeInt = parseInt(size);  
                console.log("sizeInt" + sizeInt);  
                return callback(finalSize);  
            });  

        }  

        function calcCache4Android() {  
            var cacheSize=0;  
            console.log("start calc android");  
                var sdRoot = main.getCacheDir();  
                var files = plus.android.invoke(sdRoot,"listFiles");  
                 cacheSize += getFolderSize(files);   
            console.log("android size-->"+cacheSize);  
            return cacheSize;  
        }  

            function getFolderSize(files) {  
                var size = 0;  
                    var len = files.length;  
                    for(var i = 0; i < len; i++) {  
                        // 如果下面还有文件  
                        if(files[i].isDirectory()) {  
                            size = size + getFolderSize(files[i]);  
                        } else if(!files[i].isHidden()){  
                            size = size + files[i].length();  
                        }  
                    }  
                return size;  
        }  

                function formatSize(size){  
            var fileSizeString;  
            size=parseInt(size);  
            console.log("我是size"+size);  
                if(size == 0){  
                    fileSizeString = "0B";  
                }else if(size < 1024){  
                    fileSizeString = size + "B";  
                }else if(size < 1048576){  
                    fileSizeString = (size/1024).toFixed(2) + "KB";  
                }else if (size < 1073741824){  
                    console.log("Mb"+size);  
                    fileSizeString = (size/1048576).toFixed(2) + "MB";  
                    console.log("/ after"+fileSizeString);  
                }else{  
                    fileSizeString = (size/1073741824).toFixed(2) + "GB";  
                }  
                return fileSizeString;  
        }  

以下是删除缓存的方法

 /**  
         * 清除缓存    
         */  
        function clearCache(callback) {  
            plus.storage.clear();  
            plus.cache.clear(function() {  
                console.log("清除了~~~return");  
                return callback();  
            });  
        }  
function clearAllCache4Android(){  
            console.log("清理所有缓存");  
             console.log("main"+main.getCacheDir());  
                var sdRoot = main.getCacheDir();  
                var files = plus.android.invoke(sdRoot,"listFiles");  
                    deleteDir(files);     
                //再次计算缓存大小  
               initCacheSize();  
        }  

        function deleteDir(files){  
                    var len = files.length;  
                    console.log("len:"+len);  
                    for(var i = 0; i < len; i++) {  
                        console.log("delete file dir:"+files[i]);  
                        files[i].delete();  
                    }  
                          }  

方法名比较直观,就没有一一注释了。

收起阅读 »

关于环信WebIM音频文件不使用input file上传的问题

file input 环信
可以使用Blob对象来解决  
function dataURLtoBlob(dataurl) {  
    var arr = dataurl.split(','),  
    mime = arr[0].match(/:(.*?);/)[1],  
    bstr = atob(arr[1]),  
    n = bstr.length,  
    u8arr = new Uint8Array(n);  
    while(n--) {  
        u8arr[n] = bstr.charCodeAt(n);  
    }  
    return new Blob([u8arr], {  
        type: mime  
    });  
}  

function blobToFile(theBlob, fileName) {  
    //A Blob() is almost a File() - it's just missing the two properties below which we will add  
    theBlob.lastModifiedDate = new Date();  
    theBlob.name = fileName;  
    return theBlob;  
}  
// 单聊发送音频消息  
var sendPrivateAudio = function() {  
    var id = conn.getUniqueId(); // 生成本地消息id  
    var msg = new WebIM.message('audio', id); // 创建音频消息  
        //test: blob对象可以通过mui中的io获得  
    var blob = dataURLtoBlob('data:audio/wav;base64,UklGRhwMAABXQVZFZm10IBAAAAABAAEAgD4AAIA+AAABAAgAZGF0Ya4LAACAgICAgICAgICAgICAgICAgICAgICAgICAf3hxeH+AfXZ1eHx6dnR5fYGFgoOKi42aloubq6GOjI2Op7ythXJ0eYF5aV1AOFFib32HmZSHhpCalIiYi4SRkZaLfnhxaWptb21qaWBea2BRYmZTVmFgWFNXVVVhaGdbYGhZbXh1gXZ1goeIlot1k6yxtKaOkaWhq7KonKCZoaCjoKWuqqmurK6ztrO7tbTAvru/vb68vbW6vLGqsLOfm5yal5KKhoyBeHt2dXBnbmljVlJWUEBBPDw9Mi4zKRwhIBYaGRQcHBURGB0XFxwhGxocJSstMjg6PTc6PUxVV1lWV2JqaXN0coCHhIyPjpOenqWppK6xu72yxMu9us7Pw83Wy9nY29ve6OPr6uvs6ezu6ejk6erm3uPj3dbT1sjBzdDFuMHAt7m1r7W6qaCupJOTkpWPgHqAd3JrbGlnY1peX1hTUk9PTFRKR0RFQkRBRUVEQkdBPjs9Pzo6NT04Njs+PTxAPzo/Ojk6PEA5PUJAQD04PkRCREZLUk1KT1BRUVdXU1VRV1tZV1xgXltcXF9hXl9eY2VmZmlna3J0b3F3eHyBfX+JgIWJiouTlZCTmpybnqSgnqyrqrO3srK2uL2/u7jAwMLFxsfEv8XLzcrIy83JzcrP0s3M0dTP0drY1dPR1dzc19za19XX2dnU1NjU0dXPzdHQy8rMysfGxMLBvLu3ta+sraeioJ2YlI+MioeFfX55cnJsaWVjXVlbVE5RTktHRUVAPDw3NC8uLyknKSIiJiUdHiEeGx4eHRwZHB8cHiAfHh8eHSEhISMoJyMnKisrLCszNy8yOTg9QEJFRUVITVFOTlJVWltaXmNfX2ZqZ21xb3R3eHqAhoeJkZKTlZmhpJ6kqKeur6yxtLW1trW4t6+us7axrbK2tLa6ury7u7u9u7vCwb+/vr7Ev7y9v8G8vby6vru4uLq+tri8ubi5t7W4uLW5uLKxs7G0tLGwt7Wvs7avr7O0tLW4trS4uLO1trW1trm1tLm0r7Kyr66wramsqaKlp52bmpeWl5KQkImEhIB8fXh3eHJrbW5mYGNcWFhUUE1LRENDQUI9ODcxLy8vMCsqLCgoKCgpKScoKCYoKygpKyssLi0sLi0uMDIwMTIuLzQ0Njg4Njc8ODlBQ0A/RUdGSU5RUVFUV1pdXWFjZGdpbG1vcXJ2eXh6fICAgIWIio2OkJGSlJWanJqbnZ2cn6Kkp6enq62srbCysrO1uLy4uL+/vL7CwMHAvb/Cvbq9vLm5uba2t7Sysq+urqyqqaalpqShoJ+enZuamZqXlZWTkpGSkpCNjpCMioqLioiHhoeGhYSGg4GDhoKDg4GBg4GBgoGBgoOChISChISChIWDg4WEgoSEgYODgYGCgYGAgICAgX99f398fX18e3p6e3t7enp7fHx4e3x6e3x7fHx9fX59fn1+fX19fH19fnx9fn19fX18fHx7fHx6fH18fXx8fHx7fH1+fXx+f319fn19fn1+gH9+f4B/fn+AgICAgH+AgICAgIGAgICAgH9+f4B+f35+fn58e3t8e3p5eXh4d3Z1dHRzcXBvb21sbmxqaWhlZmVjYmFfX2BfXV1cXFxaWVlaWVlYV1hYV1hYWVhZWFlaWllbXFpbXV5fX15fYWJhYmNiYWJhYWJjZGVmZ2hqbG1ub3Fxc3V3dnd6e3t8e3x+f3+AgICAgoGBgoKDhISFh4aHiYqKi4uMjYyOj4+QkZKUlZWXmJmbm52enqCioqSlpqeoqaqrrK2ur7CxsrGys7O0tbW2tba3t7i3uLe4t7a3t7i3tre2tba1tLSzsrKysbCvrq2sq6qop6alo6OioJ+dnJqZmJeWlJKSkI+OjoyLioiIh4WEg4GBgH9+fXt6eXh3d3V0c3JxcG9ubWxsamppaWhnZmVlZGRjYmNiYWBhYGBfYF9fXl5fXl1dXVxdXF1dXF1cXF1cXF1dXV5dXV5fXl9eX19gYGFgYWJhYmFiY2NiY2RjZGNkZWRlZGVmZmVmZmVmZ2dmZ2hnaGhnaGloZ2hpaWhpamlqaWpqa2pra2xtbGxtbm1ubm5vcG9wcXBxcnFycnN0c3N0dXV2d3d4eHh5ent6e3x9fn5/f4CAgIGCg4SEhYaGh4iIiYqLi4uMjY2Oj5CQkZGSk5OUlJWWlpeYl5iZmZqbm5ybnJ2cnZ6en56fn6ChoKChoqGio6KjpKOko6SjpKWkpaSkpKSlpKWkpaSlpKSlpKOkpKOko6KioaKhoaCfoJ+enp2dnJybmpmZmJeXlpWUk5STkZGQj4+OjYyLioqJh4eGhYSEgoKBgIB/fn59fHt7enl5eHd3dnZ1dHRzc3JycXBxcG9vbm5tbWxrbGxraWppaWhpaGdnZ2dmZ2ZlZmVmZWRlZGVkY2RjZGNkZGRkZGRkZGRkZGRjZGRkY2RjZGNkZWRlZGVmZWZmZ2ZnZ2doaWhpaWpra2xsbW5tbm9ub29wcXFycnNzdHV1dXZ2d3d4eXl6enp7fHx9fX5+f4CAgIGAgYGCgoOEhISFhoWGhoeIh4iJiImKiYqLiouLjI2MjI2OjY6Pj46PkI+QkZCRkJGQkZGSkZKRkpGSkZGRkZKRkpKRkpGSkZKRkpGSkZKRkpGSkZCRkZCRkI+Qj5CPkI+Pjo+OjY6Njo2MjYyLjIuMi4qLioqJiomJiImIh4iHh4aHhoaFhoWFhIWEg4SDg4KDgoKBgoGAgYCBgICAgICAf4CAf39+f35/fn1+fX59fHx9fH18e3x7fHt6e3p7ent6e3p5enl6enl6eXp5eXl4eXh5eHl4eXh5eHl4eXh5eHh3eHh4d3h4d3h3d3h4d3l4eHd4d3h3eHd4d3h3eHh4eXh5eHl4eHl4eXh5enl6eXp5enl6eXp5ent6ent6e3x7fHx9fH18fX19fn1+fX5/fn9+f4B/gH+Af4CAgICAgIGAgYCBgoGCgYKCgoKDgoOEg4OEg4SFhIWEhYSFhoWGhYaHhoeHhoeGh4iHiIiHiImIiImKiYqJiYqJiouKi4qLiouKi4qLiouKi4qLiouKi4qLi4qLiouKi4qLiomJiomIiYiJiImIh4iIh4iHhoeGhYWGhYaFhIWEg4OEg4KDgoOCgYKBgIGAgICAgH+Af39+f359fn18fX19fHx8e3t6e3p7enl6eXp5enl6enl5eXh5eHh5eHl4eXh5eHl4eHd5eHd3eHl4d3h3eHd4d3h3eHh4d3h4d3h3d3h5eHl4eXh5eHl5eXp5enl6eXp7ent6e3p7e3t7fHt8e3x8fHx9fH1+fX59fn9+f35/gH+AgICAgICAgYGAgYKBgoGCgoKDgoOEg4SEhIWFhIWFhoWGhYaGhoaHhoeGh4aHhoeIh4iHiIeHiIeIh4iHiIeIiIiHiIeIh4iHiIiHiIeIh4iHiIeIh4eIh4eIh4aHh4aHhoeGh4aHhoWGhYaFhoWFhIWEhYSFhIWEhISDhIOEg4OCg4OCg4KDgYKCgYKCgYCBgIGAgYCBgICAgICAgICAf4B/f4B/gH+Af35/fn9+f35/fn1+fn19fn1+fX59fn19fX19fH18fXx9fH18fXx9fH18fXx8fHt8e3x7fHt8e3x7fHt8e3x7fHt8e3x7fHt8e3x7fHt8e3x8e3x7fHt8e3x7fHx8fXx9fH18fX5+fX59fn9+f35+f35/gH+Af4B/gICAgICAgICAgICAgYCBgIGAgIGAgYGBgoGCgYKBgoGCgYKBgoGCgoKDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KCgoGCgYKBgoGCgYKBgoGCgYKBgoGCgYKBgoGCgYKBgoGCgYKBgoGCgYKBgoGBgYCBgIGAgYCBgIGAgYCBgIGAgYCBgIGAgYCBgIGAgYCAgICBgIGAgYCBgIGAgYCBgIGAgYCBgExJU1RCAAAASU5GT0lDUkQMAAAAMjAwOC0wOS0yMQAASUVORwMAAAAgAAABSVNGVBYAAABTb255IFNvdW5kIEZvcmdlIDguMAAA');  
    var url = window.URL.createObjectURL(blob);  
    var input = blobToFile(blob, "test.wav");  
    var uri = {  
        url: '',  
        filename: '',  
        filetype: '',  
        data: ''  
    };  
    uri.data = input;  
    uri.url = window.URL.createObjectURL(input);  
    uri.filename = input.name || '';  
    var index = uri.filename.lastIndexOf('.');  
    if(index != -1) {  
        uri.filetype = uri.filename.substring(index + 1).toLowerCase();  
    }  
    var file = uri;  
    var option = {  
        apiUrl: WebIM.config.apiURL,  
        file: file,  
        to: 'test00004', // 接收消息对象  
        roomType: false,  
        chatType: 'singleChat',  
        onFileUploadError: function() { // 消息上传失败  
            console.log('onFileUploadError');  
        },  
        onFileUploadComplete: function() { // 消息上传成功  
            console.log('onFileUploadComplete');  
        },  
            success: function() { // 消息发送成功  
            console.log('Success');  
        },  
        flashUpload: WebIM.flashUpload  
    };  
    msg.set(option);  
    conn.send(msg.body);  
};
继续阅读 »
可以使用Blob对象来解决  
function dataURLtoBlob(dataurl) {  
    var arr = dataurl.split(','),  
    mime = arr[0].match(/:(.*?);/)[1],  
    bstr = atob(arr[1]),  
    n = bstr.length,  
    u8arr = new Uint8Array(n);  
    while(n--) {  
        u8arr[n] = bstr.charCodeAt(n);  
    }  
    return new Blob([u8arr], {  
        type: mime  
    });  
}  

function blobToFile(theBlob, fileName) {  
    //A Blob() is almost a File() - it's just missing the two properties below which we will add  
    theBlob.lastModifiedDate = new Date();  
    theBlob.name = fileName;  
    return theBlob;  
}  
// 单聊发送音频消息  
var sendPrivateAudio = function() {  
    var id = conn.getUniqueId(); // 生成本地消息id  
    var msg = new WebIM.message('audio', id); // 创建音频消息  
        //test: blob对象可以通过mui中的io获得  
    var blob = dataURLtoBlob('data:audio/wav;base64,UklGRhwMAABXQVZFZm10IBAAAAABAAEAgD4AAIA+AAABAAgAZGF0Ya4LAACAgICAgICAgICAgICAgICAgICAgICAgICAf3hxeH+AfXZ1eHx6dnR5fYGFgoOKi42aloubq6GOjI2Op7ythXJ0eYF5aV1AOFFib32HmZSHhpCalIiYi4SRkZaLfnhxaWptb21qaWBea2BRYmZTVmFgWFNXVVVhaGdbYGhZbXh1gXZ1goeIlot1k6yxtKaOkaWhq7KonKCZoaCjoKWuqqmurK6ztrO7tbTAvru/vb68vbW6vLGqsLOfm5yal5KKhoyBeHt2dXBnbmljVlJWUEBBPDw9Mi4zKRwhIBYaGRQcHBURGB0XFxwhGxocJSstMjg6PTc6PUxVV1lWV2JqaXN0coCHhIyPjpOenqWppK6xu72yxMu9us7Pw83Wy9nY29ve6OPr6uvs6ezu6ejk6erm3uPj3dbT1sjBzdDFuMHAt7m1r7W6qaCupJOTkpWPgHqAd3JrbGlnY1peX1hTUk9PTFRKR0RFQkRBRUVEQkdBPjs9Pzo6NT04Njs+PTxAPzo/Ojk6PEA5PUJAQD04PkRCREZLUk1KT1BRUVdXU1VRV1tZV1xgXltcXF9hXl9eY2VmZmlna3J0b3F3eHyBfX+JgIWJiouTlZCTmpybnqSgnqyrqrO3srK2uL2/u7jAwMLFxsfEv8XLzcrIy83JzcrP0s3M0dTP0drY1dPR1dzc19za19XX2dnU1NjU0dXPzdHQy8rMysfGxMLBvLu3ta+sraeioJ2YlI+MioeFfX55cnJsaWVjXVlbVE5RTktHRUVAPDw3NC8uLyknKSIiJiUdHiEeGx4eHRwZHB8cHiAfHh8eHSEhISMoJyMnKisrLCszNy8yOTg9QEJFRUVITVFOTlJVWltaXmNfX2ZqZ21xb3R3eHqAhoeJkZKTlZmhpJ6kqKeur6yxtLW1trW4t6+us7axrbK2tLa6ury7u7u9u7vCwb+/vr7Ev7y9v8G8vby6vru4uLq+tri8ubi5t7W4uLW5uLKxs7G0tLGwt7Wvs7avr7O0tLW4trS4uLO1trW1trm1tLm0r7Kyr66wramsqaKlp52bmpeWl5KQkImEhIB8fXh3eHJrbW5mYGNcWFhUUE1LRENDQUI9ODcxLy8vMCsqLCgoKCgpKScoKCYoKygpKyssLi0sLi0uMDIwMTIuLzQ0Njg4Njc8ODlBQ0A/RUdGSU5RUVFUV1pdXWFjZGdpbG1vcXJ2eXh6fICAgIWIio2OkJGSlJWanJqbnZ2cn6Kkp6enq62srbCysrO1uLy4uL+/vL7CwMHAvb/Cvbq9vLm5uba2t7Sysq+urqyqqaalpqShoJ+enZuamZqXlZWTkpGSkpCNjpCMioqLioiHhoeGhYSGg4GDhoKDg4GBg4GBgoGBgoOChISChISChIWDg4WEgoSEgYODgYGCgYGAgICAgX99f398fX18e3p6e3t7enp7fHx4e3x6e3x7fHx9fX59fn1+fX19fH19fnx9fn19fX18fHx7fHx6fH18fXx8fHx7fH1+fXx+f319fn19fn1+gH9+f4B/fn+AgICAgH+AgICAgIGAgICAgH9+f4B+f35+fn58e3t8e3p5eXh4d3Z1dHRzcXBvb21sbmxqaWhlZmVjYmFfX2BfXV1cXFxaWVlaWVlYV1hYV1hYWVhZWFlaWllbXFpbXV5fX15fYWJhYmNiYWJhYWJjZGVmZ2hqbG1ub3Fxc3V3dnd6e3t8e3x+f3+AgICAgoGBgoKDhISFh4aHiYqKi4uMjYyOj4+QkZKUlZWXmJmbm52enqCioqSlpqeoqaqrrK2ur7CxsrGys7O0tbW2tba3t7i3uLe4t7a3t7i3tre2tba1tLSzsrKysbCvrq2sq6qop6alo6OioJ+dnJqZmJeWlJKSkI+OjoyLioiIh4WEg4GBgH9+fXt6eXh3d3V0c3JxcG9ubWxsamppaWhnZmVlZGRjYmNiYWBhYGBfYF9fXl5fXl1dXVxdXF1dXF1cXF1cXF1dXV5dXV5fXl9eX19gYGFgYWJhYmFiY2NiY2RjZGNkZWRlZGVmZmVmZmVmZ2dmZ2hnaGhnaGloZ2hpaWhpamlqaWpqa2pra2xtbGxtbm1ubm5vcG9wcXBxcnFycnN0c3N0dXV2d3d4eHh5ent6e3x9fn5/f4CAgIGCg4SEhYaGh4iIiYqLi4uMjY2Oj5CQkZGSk5OUlJWWlpeYl5iZmZqbm5ybnJ2cnZ6en56fn6ChoKChoqGio6KjpKOko6SjpKWkpaSkpKSlpKWkpaSlpKSlpKOkpKOko6KioaKhoaCfoJ+enp2dnJybmpmZmJeXlpWUk5STkZGQj4+OjYyLioqJh4eGhYSEgoKBgIB/fn59fHt7enl5eHd3dnZ1dHRzc3JycXBxcG9vbm5tbWxrbGxraWppaWhpaGdnZ2dmZ2ZlZmVmZWRlZGVkY2RjZGNkZGRkZGRkZGRkZGRjZGRkY2RjZGNkZWRlZGVmZWZmZ2ZnZ2doaWhpaWpra2xsbW5tbm9ub29wcXFycnNzdHV1dXZ2d3d4eXl6enp7fHx9fX5+f4CAgIGAgYGCgoOEhISFhoWGhoeIh4iJiImKiYqLiouLjI2MjI2OjY6Pj46PkI+QkZCRkJGQkZGSkZKRkpGSkZGRkZKRkpKRkpGSkZKRkpGSkZKRkpGSkZCRkZCRkI+Qj5CPkI+Pjo+OjY6Njo2MjYyLjIuMi4qLioqJiomJiImIh4iHh4aHhoaFhoWFhIWEg4SDg4KDgoKBgoGAgYCBgICAgICAf4CAf39+f35/fn1+fX59fHx9fH18e3x7fHt6e3p7ent6e3p5enl6enl6eXp5eXl4eXh5eHl4eXh5eHl4eXh5eHh3eHh4d3h4d3h3d3h4d3l4eHd4d3h3eHd4d3h3eHh4eXh5eHl4eHl4eXh5enl6eXp5enl6eXp5ent6ent6e3x7fHx9fH18fX19fn1+fX5/fn9+f4B/gH+Af4CAgICAgIGAgYCBgoGCgYKCgoKDgoOEg4OEg4SFhIWEhYSFhoWGhYaHhoeHhoeGh4iHiIiHiImIiImKiYqJiYqJiouKi4qLiouKi4qLiouKi4qLiouKi4qLi4qLiouKi4qLiomJiomIiYiJiImIh4iIh4iHhoeGhYWGhYaFhIWEg4OEg4KDgoOCgYKBgIGAgICAgH+Af39+f359fn18fX19fHx8e3t6e3p7enl6eXp5enl6enl5eXh5eHh5eHl4eXh5eHl4eHd5eHd3eHl4d3h3eHd4d3h3eHh4d3h4d3h3d3h5eHl4eXh5eHl5eXp5enl6eXp7ent6e3p7e3t7fHt8e3x8fHx9fH1+fX59fn9+f35/gH+AgICAgICAgYGAgYKBgoGCgoKDgoOEg4SEhIWFhIWFhoWGhYaGhoaHhoeGh4aHhoeIh4iHiIeHiIeIh4iHiIeIiIiHiIeIh4iHiIiHiIeIh4iHiIeIh4eIh4eIh4aHh4aHhoeGh4aHhoWGhYaFhoWFhIWEhYSFhIWEhISDhIOEg4OCg4OCg4KDgYKCgYKCgYCBgIGAgYCBgICAgICAgICAf4B/f4B/gH+Af35/fn9+f35/fn1+fn19fn1+fX59fn19fX19fH18fXx9fH18fXx9fH18fXx8fHt8e3x7fHt8e3x7fHt8e3x7fHt8e3x7fHt8e3x7fHt8e3x8e3x7fHt8e3x7fHx8fXx9fH18fX5+fX59fn9+f35+f35/gH+Af4B/gICAgICAgICAgICAgYCBgIGAgIGAgYGBgoGCgYKBgoGCgYKBgoGCgoKDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KDgoOCg4KCgoGCgYKBgoGCgYKBgoGCgYKBgoGCgYKBgoGCgYKBgoGCgYKBgoGCgYKBgoGBgYCBgIGAgYCBgIGAgYCBgIGAgYCBgIGAgYCBgIGAgYCAgICBgIGAgYCBgIGAgYCBgIGAgYCBgExJU1RCAAAASU5GT0lDUkQMAAAAMjAwOC0wOS0yMQAASUVORwMAAAAgAAABSVNGVBYAAABTb255IFNvdW5kIEZvcmdlIDguMAAA');  
    var url = window.URL.createObjectURL(blob);  
    var input = blobToFile(blob, "test.wav");  
    var uri = {  
        url: '',  
        filename: '',  
        filetype: '',  
        data: ''  
    };  
    uri.data = input;  
    uri.url = window.URL.createObjectURL(input);  
    uri.filename = input.name || '';  
    var index = uri.filename.lastIndexOf('.');  
    if(index != -1) {  
        uri.filetype = uri.filename.substring(index + 1).toLowerCase();  
    }  
    var file = uri;  
    var option = {  
        apiUrl: WebIM.config.apiURL,  
        file: file,  
        to: 'test00004', // 接收消息对象  
        roomType: false,  
        chatType: 'singleChat',  
        onFileUploadError: function() { // 消息上传失败  
            console.log('onFileUploadError');  
        },  
        onFileUploadComplete: function() { // 消息上传成功  
            console.log('onFileUploadComplete');  
        },  
            success: function() { // 消息发送成功  
            console.log('Success');  
        },  
        flashUpload: WebIM.flashUpload  
    };  
    msg.set(option);  
    conn.send(msg.body);  
};
收起阅读 »

学习笔记自我小结(3)

做一个实际项目,必然会涉及到多个页面的跳转刷新数据,所以建议页面跳转用mui.fire 进行传参,到另一个页面监听执行事件,然后执行数据
请求的逻辑函数,当然这里会有一些不注意的地方,重复绑定事件函数,比如obj.addEventListener(“click”, function() {}), 页面在来回跳转
的时候,必然会导致重复绑定类似于这样的事件,所以一定要解绑。

mui("父级元素").off("tap").on("tap", "子元素", function() {  

})

页面来回切换还有个别的问题,比如黑屏的情况,查了会资料,不晓得怎么更好的去解决,临时用了plus.webview.create(“index.html”),
objWebview.close(); 来替代 objWebview.hide() 。。 这非常的耗损性能。。

注意点:
一个页面跳转到一个页面再跳转到另一个页面,在第三个页面返回,或者操作完毕返回时,别忘了要 plus.webview.currentWebview().hide()。
来回监听函数绑定事件,要先解绑再绑定,不然会绑定多次,也就导致同一个事件会执行多次。
如果用click点击无法触发的时候,换成tap试试。
当前webview创建或者预加载一个webview,在跳转到创建或者预加载的那个webview时,不能hide()当前的webview,否则预加载的webview不能显示
出来,因为预加载webview 与 当前webview 是捆绑到一起的。

软键盘顶起父级webview的tab问题:
个人觉得是这样,首先官方讲的是软键盘下面是不可能覆盖元素的,软键盘导致了webview高度压缩,而子webview的bottom预先设定是50px, 因为这父webview的tab才得以显示出来,只要子webview设定为bottom为0,就会重新将父级webview覆盖起来,因为子webview的z-index层级比父级webview高。

var oldH = plus.android.invoke(plus.android.currentWebview(),"getHeight") ;  
window.addEventListener("resize", function() {  
            var newH = plus.android.invoke(plus.android.currentWebview(),"getHeight") ;  
            if(oldH - newH > 100) { //监控当前webview的变化  
                plus.webview.currentWebview().setStyle({top: '0px',bottom: '0px'});  
            } else {  
                plus.webview.currentWebview().setStyle({top: '0px',bottom: '50px'});  
            }  
        }) 
继续阅读 »

做一个实际项目,必然会涉及到多个页面的跳转刷新数据,所以建议页面跳转用mui.fire 进行传参,到另一个页面监听执行事件,然后执行数据
请求的逻辑函数,当然这里会有一些不注意的地方,重复绑定事件函数,比如obj.addEventListener(“click”, function() {}), 页面在来回跳转
的时候,必然会导致重复绑定类似于这样的事件,所以一定要解绑。

mui("父级元素").off("tap").on("tap", "子元素", function() {  

})

页面来回切换还有个别的问题,比如黑屏的情况,查了会资料,不晓得怎么更好的去解决,临时用了plus.webview.create(“index.html”),
objWebview.close(); 来替代 objWebview.hide() 。。 这非常的耗损性能。。

注意点:
一个页面跳转到一个页面再跳转到另一个页面,在第三个页面返回,或者操作完毕返回时,别忘了要 plus.webview.currentWebview().hide()。
来回监听函数绑定事件,要先解绑再绑定,不然会绑定多次,也就导致同一个事件会执行多次。
如果用click点击无法触发的时候,换成tap试试。
当前webview创建或者预加载一个webview,在跳转到创建或者预加载的那个webview时,不能hide()当前的webview,否则预加载的webview不能显示
出来,因为预加载webview 与 当前webview 是捆绑到一起的。

软键盘顶起父级webview的tab问题:
个人觉得是这样,首先官方讲的是软键盘下面是不可能覆盖元素的,软键盘导致了webview高度压缩,而子webview的bottom预先设定是50px, 因为这父webview的tab才得以显示出来,只要子webview设定为bottom为0,就会重新将父级webview覆盖起来,因为子webview的z-index层级比父级webview高。

var oldH = plus.android.invoke(plus.android.currentWebview(),"getHeight") ;  
window.addEventListener("resize", function() {  
            var newH = plus.android.invoke(plus.android.currentWebview(),"getHeight") ;  
            if(oldH - newH > 100) { //监控当前webview的变化  
                plus.webview.currentWebview().setStyle({top: '0px',bottom: '0px'});  
            } else {  
                plus.webview.currentWebview().setStyle({top: '0px',bottom: '50px'});  
            }  
        }) 
收起阅读 »