HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

分享几套我收集的MUI网站模板

模板 mui

mui框架的服装包包手机商城模板
http://www.sucaihuo.com/templates/4490.html

mui框架的移动端app下载界面模板
http://www.sucaihuo.com/templates/4367.html

mui租房app模板
http://www.sucaihuo.com/templates/3300.html

手机app前端开发MUI框架模板
http://www.sucaihuo.com/templates/3694.html

mui框架手机报考驾校预约wap网站模板
http://www.sucaihuo.com/templates/2139.html

继续阅读 »

mui框架的服装包包手机商城模板
http://www.sucaihuo.com/templates/4490.html

mui框架的移动端app下载界面模板
http://www.sucaihuo.com/templates/4367.html

mui租房app模板
http://www.sucaihuo.com/templates/3300.html

手机app前端开发MUI框架模板
http://www.sucaihuo.com/templates/3694.html

mui框架手机报考驾校预约wap网站模板
http://www.sucaihuo.com/templates/2139.html

收起阅读 »

mui 列表项左右滑删除功能升级(仿微信左滑 点击删除后出现确认删除)

mui 列表项左右滑删除功能升级(仿微信左滑 点击删除后出现确认删除)

mui 列表项左右滑删除功能升级(仿微信左滑 点击删除后出现确认删除)

wap2app扫一扫功能兼容性问题

扫一扫 扫码

hbuilder版 本:HBuilder 9.0.8.201806081953

所用代码为官方DEOM案例(如下所示):

index.html页面

<div>  
        <button id="btn">扫一扫</button>  
    </div>  
    <br><br><br>  
        <div>  
        <button id="pay">支付宝支付</button>  
    </div>  
    <script>  
document.getElementById("btn").addEventListener("click", function() {  
    if(navigator.userAgent.indexOf("Html5Plus") > -1) {  
                var w = plus.webview.create('B.html', 'carcode1', {  
                'titleNView': {  
                    'backgroundColor': '#262930',  
                    'titleText': '扫一扫',  
                    'titleColor': '#FFFFFF',  
                    autoBackButton: false  
                }  
            });  
            plus.webview.show(w, 'slide-in-right', '300ms');  
    } else {  
       alert('请在APP中扫码');  
    }  
});  
</script>

B.html代码如下

 <script type="text/javascript">  
            var scan;  
            if(window.plus) {  
                plusready();  
            } else {  
                document.addEventListener('plusready', plusready, false);  
            }  

            function plusready() {  
                setTimeout(function(){  
                    scan = new plus.barcode.Barcode('mask');  
                    scan.start();  
                    scan.onmarked = function(type, result) {  
                        if(result) {  
                            scan.close();  
                                mui.openWindow({   
                                    url: 'http://www.baidu.com',  
                                    id: 'info',  
                                    extras:{  
                                      result:result  
                                    }  
                                });  
                        }  
                    };  
                },1000);  

                //处理返回事件  
                plus.key.addEventListener('backbutton', function() {  
                    plus.webview.currentWebview().close();  
                    //mui.back();  
                })  
            }  
        </script>

以上代码在真机测试时非常好,正式打包后偶尔会有一次能成功,华为多种型号手机在扫码后闪退。
opp手机扫码后也闪退。

继续阅读 »

hbuilder版 本:HBuilder 9.0.8.201806081953

所用代码为官方DEOM案例(如下所示):

index.html页面

<div>  
        <button id="btn">扫一扫</button>  
    </div>  
    <br><br><br>  
        <div>  
        <button id="pay">支付宝支付</button>  
    </div>  
    <script>  
document.getElementById("btn").addEventListener("click", function() {  
    if(navigator.userAgent.indexOf("Html5Plus") > -1) {  
                var w = plus.webview.create('B.html', 'carcode1', {  
                'titleNView': {  
                    'backgroundColor': '#262930',  
                    'titleText': '扫一扫',  
                    'titleColor': '#FFFFFF',  
                    autoBackButton: false  
                }  
            });  
            plus.webview.show(w, 'slide-in-right', '300ms');  
    } else {  
       alert('请在APP中扫码');  
    }  
});  
</script>

B.html代码如下

 <script type="text/javascript">  
            var scan;  
            if(window.plus) {  
                plusready();  
            } else {  
                document.addEventListener('plusready', plusready, false);  
            }  

            function plusready() {  
                setTimeout(function(){  
                    scan = new plus.barcode.Barcode('mask');  
                    scan.start();  
                    scan.onmarked = function(type, result) {  
                        if(result) {  
                            scan.close();  
                                mui.openWindow({   
                                    url: 'http://www.baidu.com',  
                                    id: 'info',  
                                    extras:{  
                                      result:result  
                                    }  
                                });  
                        }  
                    };  
                },1000);  

                //处理返回事件  
                plus.key.addEventListener('backbutton', function() {  
                    plus.webview.currentWebview().close();  
                    //mui.back();  
                })  
            }  
        </script>

以上代码在真机测试时非常好,正式打包后偶尔会有一次能成功,华为多种型号手机在扫码后闪退。
opp手机扫码后也闪退。

收起阅读 »

Mui 下拉上拉刷新功能

下拉增加动态时间计算功能:

上拉增加状态文字提示功能(当然也支持时间计算功能,只是我们暂时用不到):

下拉增加动态时间计算功能:

上拉增加状态文字提示功能(当然也支持时间计算功能,只是我们暂时用不到):

mui框架地图开发

map

在csdn上写了博客,不想复制,直接给传送门传送门

在csdn上写了博客,不想复制,直接给传送门传送门

解决Hbuilder出现 Uncaught ReferenceError: mui is not defined 错误的解决经验分享!!!

HBuilder

1、Uncaught ReferenceError: mui is not defined 问题的产生:
上午完成好的项目,手机联机测试都没问题,中午吃过饭来云端打包发布,发布后,程序App的登录页面就开始出现问题了,点击按钮没反应,而且发现登录页面的样式也丢失了,好奇怪,不知道什么原因,然后连接手机进行真机调试,发现控制台输出了:Uncaught ReferenceError: mui is not defined 这个错误,真是活见鬼了,没打包发布前好好的,发布打包后,就出现这个奇怪的错误。

2、寻求问题的解决方案:
1)粘贴错误到度娘里面,发现有不少前辈也遇到这个问题,看了一下,多数提到的因为 mui.js的路径出现错误。然后就开始调整App项目里面的
mui.js的路径,从 <script src="../js/mui.min.js"></script> 调整为 <script src="js/mui.min.js"></script>,再调整为 <script src="../../js/mui.min.js"></script>,同时把 mui.init(); 放到页面的最底部,然并卵,发现根本不解决问题,到底什么原因呢?
2)既然有前辈提到是路径,然后经过修改调整路径,发现根本解决不了,干着急,没办法。经过回想,是不是发布的时候,出现了错误呢?
目前的在发布项目已经出现了问题,要不要新建个项目,再尝试一次发布???说干就干,重新创建了App项目,把已经完成的项目里面使用到的必须文件粘贴过来,链接手机调试,发现又ok了,真是活见鬼了,竟然又好了,基本上可以确定一定是打包的时候出现了问题。

3、终极解决方案:
前面提到新建项目,真机联机测试,发现没有问题,这次特意留心下打包发布时的选项,选中要发布的项目,云端打包发布,
注意,注意,一定要看清楚说明再勾选【加入unpackage配置清单】,需要的App资源,例如图片,js,千万是不能勾选忽略必要的资源文件的,然后正常打包,真机安装发布后的App,一切ok,问题完美解决。
附件里面附带了解释说明。

预祝各位,开发App永远没bug,工作顺利,谢谢各位捧场!!!!

继续阅读 »

1、Uncaught ReferenceError: mui is not defined 问题的产生:
上午完成好的项目,手机联机测试都没问题,中午吃过饭来云端打包发布,发布后,程序App的登录页面就开始出现问题了,点击按钮没反应,而且发现登录页面的样式也丢失了,好奇怪,不知道什么原因,然后连接手机进行真机调试,发现控制台输出了:Uncaught ReferenceError: mui is not defined 这个错误,真是活见鬼了,没打包发布前好好的,发布打包后,就出现这个奇怪的错误。

2、寻求问题的解决方案:
1)粘贴错误到度娘里面,发现有不少前辈也遇到这个问题,看了一下,多数提到的因为 mui.js的路径出现错误。然后就开始调整App项目里面的
mui.js的路径,从 <script src="../js/mui.min.js"></script> 调整为 <script src="js/mui.min.js"></script>,再调整为 <script src="../../js/mui.min.js"></script>,同时把 mui.init(); 放到页面的最底部,然并卵,发现根本不解决问题,到底什么原因呢?
2)既然有前辈提到是路径,然后经过修改调整路径,发现根本解决不了,干着急,没办法。经过回想,是不是发布的时候,出现了错误呢?
目前的在发布项目已经出现了问题,要不要新建个项目,再尝试一次发布???说干就干,重新创建了App项目,把已经完成的项目里面使用到的必须文件粘贴过来,链接手机调试,发现又ok了,真是活见鬼了,竟然又好了,基本上可以确定一定是打包的时候出现了问题。

3、终极解决方案:
前面提到新建项目,真机联机测试,发现没有问题,这次特意留心下打包发布时的选项,选中要发布的项目,云端打包发布,
注意,注意,一定要看清楚说明再勾选【加入unpackage配置清单】,需要的App资源,例如图片,js,千万是不能勾选忽略必要的资源文件的,然后正常打包,真机安装发布后的App,一切ok,问题完美解决。
附件里面附带了解释说明。

预祝各位,开发App永远没bug,工作顺利,谢谢各位捧场!!!!

收起阅读 »

周报(20180608):实名认证

实名认证 周报

热门话题

  • DCloud 开发者实名认证流程:推行 appid 唯一化和 App 所有者实名化是 DCloud 目前需要处理的问题,这会影响到目前以及待上线的一系列云端服务,因此需要广大开发者配合完成。
  • 广告误开原因汇总及解决办法:DCloud 不会强制开通广告,如果应用中出现了非预期的广告信息,请按照此文章中的说明进行确认以及后续的操作。

iOS

问题清单

分享

最后

本周的报告就是这些,希望能对大家有所帮助。同时,也希望更多的小伙伴在社区分享自己的经验心得,交流学习。

祝大家周末愉快。

继续阅读 »

热门话题

  • DCloud 开发者实名认证流程:推行 appid 唯一化和 App 所有者实名化是 DCloud 目前需要处理的问题,这会影响到目前以及待上线的一系列云端服务,因此需要广大开发者配合完成。
  • 广告误开原因汇总及解决办法:DCloud 不会强制开通广告,如果应用中出现了非预期的广告信息,请按照此文章中的说明进行确认以及后续的操作。

iOS

问题清单

分享

最后

本周的报告就是这些,希望能对大家有所帮助。同时,也希望更多的小伙伴在社区分享自己的经验心得,交流学习。

祝大家周末愉快。

收起阅读 »

一个vue多页面的脚手架 有demo和教程哦

less Vue

刚做的脚手架,新鲜的.

脚手架地址

APP 演示下载地址

希望大家多issue哦

使用webpack4
MogoH5+ 是一个 vue 多页面脚手架工具,结合 H5+可以快速开发安卓与苹果 APP.

即使不适用 Hbuilder 打包成 APP,本脚手架同样可以作为多页面网页生成的参考项目.

特性

  • 支持 Npm 生态
  • 支持 vue 语法,以及 vue 生态,比如 vux,mint,vant
  • 支持 ES6/ES7 语法
  • 使用 VConsole 调试
  • VSCode 友好
  • 局域网便捷调试
  • 兼容部分 mui 语法
继续阅读 »

刚做的脚手架,新鲜的.

脚手架地址

APP 演示下载地址

希望大家多issue哦

使用webpack4
MogoH5+ 是一个 vue 多页面脚手架工具,结合 H5+可以快速开发安卓与苹果 APP.

即使不适用 Hbuilder 打包成 APP,本脚手架同样可以作为多页面网页生成的参考项目.

特性

  • 支持 Npm 生态
  • 支持 vue 语法,以及 vue 生态,比如 vux,mint,vant
  • 支持 ES6/ES7 语法
  • 使用 VConsole 调试
  • VSCode 友好
  • 局域网便捷调试
  • 兼容部分 mui 语法
收起阅读 »

近期https://appstoreconnect.apple.com无法访问的解决办法

iOS打包

6月5日一年一度的苹果 WWDC 开发者大会在美国加州圣何塞举行。所以近期苹果更新了很多东西,导致https://appstoreconnect.apple.com都无法访问了。

iTC 后台大变身

新增加的域名

本次 iTC 后台域名改了,所以导致无法访问。

新域名:https://appstoreconnect.apple.com

以前的域名:https://itunesconnect.apple.com

访问以前的域名会自动跳转到新域名。

目前只有 safari 或者开vpn才能用其他浏览器打开域名,很多人用其他浏览器无法打开,在Windows的话根本访问。

如果没有vpn或者用不了苹果电脑Safari浏览器,下面介绍配置下谷歌浏览器实现访问的方法。

苹果可能还会调整几天,暂时用这个方法配置访问https://appstoreconnect.apple.com

安装Chrome(谷歌浏览器),或者Opera,用这两个浏览器,其他浏览器配置不行。

谷歌浏览器下载地址

https://www.google.cn/chrome/

在桌面浏览器图标右键选择属性

在目标最后加入:-disable-http2 (注意先在最后加个空格再复制-disable-http2上去,然后确定,启动浏览器就能访问https://appstoreconnect.apple.com了)

我写的ios app真机调试到上架App Store完整教程,不会上架流程的可以参考下

http://www.applicationloader.net/blog/zh/1717.html

继续阅读 »

6月5日一年一度的苹果 WWDC 开发者大会在美国加州圣何塞举行。所以近期苹果更新了很多东西,导致https://appstoreconnect.apple.com都无法访问了。

iTC 后台大变身

新增加的域名

本次 iTC 后台域名改了,所以导致无法访问。

新域名:https://appstoreconnect.apple.com

以前的域名:https://itunesconnect.apple.com

访问以前的域名会自动跳转到新域名。

目前只有 safari 或者开vpn才能用其他浏览器打开域名,很多人用其他浏览器无法打开,在Windows的话根本访问。

如果没有vpn或者用不了苹果电脑Safari浏览器,下面介绍配置下谷歌浏览器实现访问的方法。

苹果可能还会调整几天,暂时用这个方法配置访问https://appstoreconnect.apple.com

安装Chrome(谷歌浏览器),或者Opera,用这两个浏览器,其他浏览器配置不行。

谷歌浏览器下载地址

https://www.google.cn/chrome/

在桌面浏览器图标右键选择属性

在目标最后加入:-disable-http2 (注意先在最后加个空格再复制-disable-http2上去,然后确定,启动浏览器就能访问https://appstoreconnect.apple.com了)

我写的ios app真机调试到上架App Store完整教程,不会上架流程的可以参考下

http://www.applicationloader.net/blog/zh/1717.html

收起阅读 »

mui集成百度语音转写成文字

(function($, doc) {  

    $.plusReady(function() {  
        var dst;  
        var src;  
        var recordCancel = false;  
        var recorder = null;  
        var audio_tips = document.getElementById("audio_tips");  
        var startTimestamp = null;  
        var stopTimestamp = null;  
        var stopTimer = null;  
        var path1 = null;  
        if(mui.os.android) {  
            var format = "amr";  
        } else if(mui.os.ios) {  
            var format = "wav";  
        }  
        var rate = "16000";  
        var channel = "1";  
        //      var cuid = 'plus.device.imei'; //mac和imei码data:audio/amr;base64,  
        var cuid = '';  
        var speech = '';  
        var token_url = "https://aip.baidubce.com/oauth/2.0/token?";  
        var len = '';  
        var grant_type = "grant_type=自己的&";  
        var APIkey = "client_id=自己的&";  
        var SecretKey = "client_secret=自己的&";  
        var AppID = "自己的";  
        var access_token = "";  
        var fileArr = [];  
        var ui = {  
            boxMsgSound: doc.querySelector('#voice'),  
            areaMsgList: doc.querySelector('#search'),  
            boxSoundAlert: doc.querySelector('#sound-alert'),  
            mistake: doc.querySelector('#mistake'),  
            voice: doc.querySelector('#voice'),  
        };  

        function msgTextFocus() {  
            ui.boxMsgText.focus();  
            setTimeout(function() {  
                ui.boxMsgText.focus();  
            }, 150);  
        }  
        //点击输入框话筒  
        ui.boxMsgSound.addEventListener('tap', function(event) {  
            recordCancel = false;  
            if(stopTimer) clearTimeout(stopTimer);  
            audio_tips.innerHTML = "点击完成";  
            ui.boxSoundAlert.classList.remove('rprogress-sigh');  
            setSoundAlertVisable(true);  
            jQuery('.shield').show();  
            recorder = plus.audio.getRecorder();  
            if(recorder == null) {  
                plus.nativeUI.toast("不能获取录音对象");  
                return;  
            }  
            startTimestamp = (new Date()).getTime();  
            recorder.record({  
                format: 'wav',  
                samplerate: '16000',  
                filename: "_doc/audio/"  
            }, function(path) {  
                fileArr.push(path);  
                if(recordCancel) return;  
                Audio2dataURL(path);  
            }, function(e) {  
                plus.nativeUI.toast("录音时出现异常: " + e.message);  
            });  

        }, false);  

        ui.boxSoundAlert.addEventListener('tap', function(event) {  
            setSoundAlertVisable(false);  
            jQuery('.shield').hide();  
            recorder.stop();  
        }, false);  
        var setSoundAlertVisable = function(show) {  
            if(show) {  
                ui.boxSoundAlert.style.display = 'block';  
                ui.boxSoundAlert.style.opacity = 1;  
            } else {  
                ui.boxSoundAlert.style.opacity = 0;  
                //fadeOut 完成再真正隐藏  
                setTimeout(function() {  
                    ui.boxSoundAlert.style.display = 'none';  
                }, 200);  
            }  
        };  

        /**  
         * 录音语音文件转base64字符串  
         * @param {Object} path  
         */  
        function Audio2dataURL(path) {  
            plus.io.resolveLocalFileSystemURL(path, function(entry) {  
                entry.file(function(file) {  
                    var reader = new plus.io.FileReader();  
                    reader.onloadend = function(e) {  
                        var strResult = e.target.result;  
                        var index = strResult.indexOf('base64,') + 7;  
                        var base64Str = strResult.slice(index, strResult.length);  
                        delVoiceFile();  
                        len = file.size;  
                        if(!pageUtils.netWork()) {  
                            pageUtils.netToast();  
                        } else {  
                            voiceToWord(base64Str);  
                        }  
                    };  
                    reader.readAsDataURL(file);  
                }, function(e) {  
                    pageUtils.showToast("读写出现异常: " + e.message);  
                })  
            })  
        }  

        token();  
                //获取token,需要取百度语音自己获取,相关操作参考百度语音api  
        function token() {  
            if(mui.os.android) {  
                data2 = grant_type + APIkey + SecretKey;  
            } else if(mui.os.ios) {  
                APIkey = 'client_id=自己的&';  
                SecretKey = 'client_secret=自己的';  
                AppID = '自己的';  
                data2 = grant_type + APIkey + SecretKey;  
            }  
            mui.ajax(token_url, {  
                data: data2,  
                type: 'post',  
                contentType: "application/json; charset=utf-8",  
                timeout: 5000,  
                success: function(resp) {  
                    access_token = resp.access_token;  
                },  
                error: function(xhr, type, errorThrown) {  
                    pageUtils.showToast("网络请求出错");  
                }  
            });  
        }  
                //将语音转成文字  
        function voiceToWord(speech) {  
            var data1 = {  
                "rate": rate,  
                "format": format,  
                "channel": channel,  
                "cuid": AppID,  
                "token": access_token,  
                "speech": speech,  
                "dev_pid": 1536,  
                "len": len  
            };  
            mui.ajax(pageUtils.VOICEURL, {  
                data: data1,  
                type: 'post',  
                contentType: "application/json; charset=utf-8",  
                timeout: 5000,  
                success: function(resp) {  
                    if(resp.result == undefined || resp.result == '') {  
                        return;  
                    }  
                    jQuery('#mistake').show();  
                    jQuery('#voice').hide();  
                    ui.areaMsgList.value = resp.result[0];  
                },  
                error: function(xhr, type, errorThrown) {  
                    if(type == 'timeout') {  
                        pageUtils.showToast("录音超时");  
                    } else {  
                        pageUtils.showToast("网络请求出错");  
                    }  
                }  
            });  
        }  
        //这里录音发送完成就不需要了,所以没有必要存在手机里,直接删除音频  
        function delVoiceFile() {  
            for(var i = 0; i < fileArr.length; i++) {  
                plus.io.resolveLocalFileSystemURL(fileArr[i], function(entry) {  
                    if(entry.isFile) {  
                        setTimeout(function() {  
                            entry.remove(function(entry) {  
                                fileArr.pop();  
                                //                              pageUtils.showToast('删除成功');  
                            }, function(e) {  
                                //                              pageUtils.showToast('删除失败');  
                            });  
                        }, 500);  

                    }  
                }, function(e) {  
                    alert("Resolve file URL failed: " + e.message);  
                });  
            }  

        }  

    });  
}(mui, document));
继续阅读 »
(function($, doc) {  

    $.plusReady(function() {  
        var dst;  
        var src;  
        var recordCancel = false;  
        var recorder = null;  
        var audio_tips = document.getElementById("audio_tips");  
        var startTimestamp = null;  
        var stopTimestamp = null;  
        var stopTimer = null;  
        var path1 = null;  
        if(mui.os.android) {  
            var format = "amr";  
        } else if(mui.os.ios) {  
            var format = "wav";  
        }  
        var rate = "16000";  
        var channel = "1";  
        //      var cuid = 'plus.device.imei'; //mac和imei码data:audio/amr;base64,  
        var cuid = '';  
        var speech = '';  
        var token_url = "https://aip.baidubce.com/oauth/2.0/token?";  
        var len = '';  
        var grant_type = "grant_type=自己的&";  
        var APIkey = "client_id=自己的&";  
        var SecretKey = "client_secret=自己的&";  
        var AppID = "自己的";  
        var access_token = "";  
        var fileArr = [];  
        var ui = {  
            boxMsgSound: doc.querySelector('#voice'),  
            areaMsgList: doc.querySelector('#search'),  
            boxSoundAlert: doc.querySelector('#sound-alert'),  
            mistake: doc.querySelector('#mistake'),  
            voice: doc.querySelector('#voice'),  
        };  

        function msgTextFocus() {  
            ui.boxMsgText.focus();  
            setTimeout(function() {  
                ui.boxMsgText.focus();  
            }, 150);  
        }  
        //点击输入框话筒  
        ui.boxMsgSound.addEventListener('tap', function(event) {  
            recordCancel = false;  
            if(stopTimer) clearTimeout(stopTimer);  
            audio_tips.innerHTML = "点击完成";  
            ui.boxSoundAlert.classList.remove('rprogress-sigh');  
            setSoundAlertVisable(true);  
            jQuery('.shield').show();  
            recorder = plus.audio.getRecorder();  
            if(recorder == null) {  
                plus.nativeUI.toast("不能获取录音对象");  
                return;  
            }  
            startTimestamp = (new Date()).getTime();  
            recorder.record({  
                format: 'wav',  
                samplerate: '16000',  
                filename: "_doc/audio/"  
            }, function(path) {  
                fileArr.push(path);  
                if(recordCancel) return;  
                Audio2dataURL(path);  
            }, function(e) {  
                plus.nativeUI.toast("录音时出现异常: " + e.message);  
            });  

        }, false);  

        ui.boxSoundAlert.addEventListener('tap', function(event) {  
            setSoundAlertVisable(false);  
            jQuery('.shield').hide();  
            recorder.stop();  
        }, false);  
        var setSoundAlertVisable = function(show) {  
            if(show) {  
                ui.boxSoundAlert.style.display = 'block';  
                ui.boxSoundAlert.style.opacity = 1;  
            } else {  
                ui.boxSoundAlert.style.opacity = 0;  
                //fadeOut 完成再真正隐藏  
                setTimeout(function() {  
                    ui.boxSoundAlert.style.display = 'none';  
                }, 200);  
            }  
        };  

        /**  
         * 录音语音文件转base64字符串  
         * @param {Object} path  
         */  
        function Audio2dataURL(path) {  
            plus.io.resolveLocalFileSystemURL(path, function(entry) {  
                entry.file(function(file) {  
                    var reader = new plus.io.FileReader();  
                    reader.onloadend = function(e) {  
                        var strResult = e.target.result;  
                        var index = strResult.indexOf('base64,') + 7;  
                        var base64Str = strResult.slice(index, strResult.length);  
                        delVoiceFile();  
                        len = file.size;  
                        if(!pageUtils.netWork()) {  
                            pageUtils.netToast();  
                        } else {  
                            voiceToWord(base64Str);  
                        }  
                    };  
                    reader.readAsDataURL(file);  
                }, function(e) {  
                    pageUtils.showToast("读写出现异常: " + e.message);  
                })  
            })  
        }  

        token();  
                //获取token,需要取百度语音自己获取,相关操作参考百度语音api  
        function token() {  
            if(mui.os.android) {  
                data2 = grant_type + APIkey + SecretKey;  
            } else if(mui.os.ios) {  
                APIkey = 'client_id=自己的&';  
                SecretKey = 'client_secret=自己的';  
                AppID = '自己的';  
                data2 = grant_type + APIkey + SecretKey;  
            }  
            mui.ajax(token_url, {  
                data: data2,  
                type: 'post',  
                contentType: "application/json; charset=utf-8",  
                timeout: 5000,  
                success: function(resp) {  
                    access_token = resp.access_token;  
                },  
                error: function(xhr, type, errorThrown) {  
                    pageUtils.showToast("网络请求出错");  
                }  
            });  
        }  
                //将语音转成文字  
        function voiceToWord(speech) {  
            var data1 = {  
                "rate": rate,  
                "format": format,  
                "channel": channel,  
                "cuid": AppID,  
                "token": access_token,  
                "speech": speech,  
                "dev_pid": 1536,  
                "len": len  
            };  
            mui.ajax(pageUtils.VOICEURL, {  
                data: data1,  
                type: 'post',  
                contentType: "application/json; charset=utf-8",  
                timeout: 5000,  
                success: function(resp) {  
                    if(resp.result == undefined || resp.result == '') {  
                        return;  
                    }  
                    jQuery('#mistake').show();  
                    jQuery('#voice').hide();  
                    ui.areaMsgList.value = resp.result[0];  
                },  
                error: function(xhr, type, errorThrown) {  
                    if(type == 'timeout') {  
                        pageUtils.showToast("录音超时");  
                    } else {  
                        pageUtils.showToast("网络请求出错");  
                    }  
                }  
            });  
        }  
        //这里录音发送完成就不需要了,所以没有必要存在手机里,直接删除音频  
        function delVoiceFile() {  
            for(var i = 0; i < fileArr.length; i++) {  
                plus.io.resolveLocalFileSystemURL(fileArr[i], function(entry) {  
                    if(entry.isFile) {  
                        setTimeout(function() {  
                            entry.remove(function(entry) {  
                                fileArr.pop();  
                                //                              pageUtils.showToast('删除成功');  
                            }, function(e) {  
                                //                              pageUtils.showToast('删除失败');  
                            });  
                        }, 500);  

                    }  
                }, function(e) {  
                    alert("Resolve file URL failed: " + e.message);  
                });  
            }  

        }  

    });  
}(mui, document));
收起阅读 »

uniapp启动画面

uniapp

uniapp启动画面什么时候有啊

uniapp启动画面什么时候有啊

解决同时使用MUI下拉刷新、mui-PopPicker、mui-popover相互冲突的问题

picker popover 下拉刷新 mui

分享一下我在开发应用时,遇到的一些问题的解决方法,不知道会不会给大家一些帮助。
如果您有更好的方法,也可以一起讨论。

在我开发的应用中,主要涉及到高级查询的操作,因为有更多的查询选项,我使用了mui-popover这个控件可进行弹出,然后,嵌入了一些查询表单和下拉列表的选择项。

下拉列表选择项,使用了mui-poppicker控件。在测试时,popover和poppicker控件在安卓上遮罩层会有问题,点击poppicker后,相互遮挡,并且页面上还启用了Mui的下拉刷新控件。

出现的问题:
1、在弹出poppicker选择下拉列表时,会触发下拉刷新的事件。
2、popover显示后,再触发poppicker后,遮罩层不能完全遮盖住popover,导致可以多次触发poppicker

解决方法:

解决问题1思路:
弹出poppicker选择下拉列表时,禁用下拉刷新功能,选择确定后再启用下拉刷新功能。

解决问题2思路:
popover显示后,如果触发poppicker控件,先隐藏popover,选择确定后再显示popover控件。

另外,为了创建下拉列表方便,我将poppicker控件封装了一个常用方法,可以直接调用。

以下是实现的代码:

var isActivePop; //POP刷新激活状态,解决下拉刷新冲突  
mui.plusReady(function() {  
    isActivePop = false;  
    mui("#popWindow .mui-scroll-wrapper").scroll();  
    mui("body").on("shown", ".mui-popover", function(e) {  
        plus.webview.currentWebview().setPullToRefresh({  
            support: false  
        }, function() {});  
        isActivePop = true;  
    });  
    mui("body").on("hidden", ".mui-popover", function(e) {  
        if(isActivePop) {  
            plus.webview.currentWebview().setPullToRefresh({  
                support: true  
            }, function() {  
                // downRefresh(); 你自己的逻辑,我这里用的隐含刷新  
            });  
            mui("#refreshName").pullRefresh().pulldownLoading(); // 调用下拉刷新  
        }  
        isActivePop = false;  
    });  
}  

// 下拉刷新  
function downRefresh() {  
    // 自己的逻辑处理  
}  

/**  
 * 获取选择列表 (返回值为表单input赋值)  
 * 使用时需要引用 mui.picker.all.js 和 mui.picker.all.css 文件  
 * @param {String} buttonId 触发及显示文本的id  
 * @param {String} dataId 数据表单value的id  
 * @param {JSONArray} data 格式为 [{ value: 'ywj', text: '董事长 叶XX' }]  
 * @param {String} selectedValue 为选中值 value  
 * @param {Function} _callbackBefore 确认前回调方法  
 * @param {Function} _callbackPull 确认后回调下拉方法  
 * @param {Function} _callbackExe 确认后执行回调方法  
 */  
function getSelect(buttonId, dataId, data, selectedValue, _callbackBefore, _callbackPull, _callbackExe) {  
    var userPicker = new mui.PopPicker();  
    userPicker.setData(data);  
    var resultText = document.getElementById(buttonId);  
    var resultValue = document.getElementById(dataId);  
    var mui_popover = mui(".mui-popover"); //获取页面上多个popover控件  
    //设置默认值  
    if(selectedValue != null && selectedValue != "") {  
        userPicker.pickers[0].setSelectedValue(selectedValue); //设置选中值value  
        resultText.value = userPicker.pickers[0].getSelectedText(); //获取当前取中值的文本text  
        resultValue.value = userPicker.pickers[0].getSelectedValue(); //获取当前取中值的value值给数据表单  
    }  
    resultText.removeEventListener('tap', function(event) {});  
    resultText.addEventListener('tap', function(event, selectedValue) {  
        var _isActivePop = (isActivePop == null)? false : isActivePop);  
        if(_isActivePop) {  
            isActivePop = false; //在隐藏前,关闭刷新状态  
            for(var i = 0; i < mui_popover.length; i++) {  
                mui(mui_popover[i]).popover("hide");  
            }  
        }  
        plus.webview.currentWebview().setPullToRefresh({  
            support: false,  
        }, function() {  
            if(_callbackBefore != null) _callbackBefore();  
        });  
        userPicker.show(function(items) {  
            resultValue.value = items[0].value;  
            resultText.value = items[0].text;  
            if(_isActivePop) {  
                for(var i = 0; i < mui_popover.length; i++) {  
                    mui(mui_popover[i]).popover("show"); //处理页面上多个popover  
                }  
                isActivePop = true; //在显示后,开启刷新状态,为了能在POP正常HIDE后激活下拉刷新  
            }  
            plus.webview.currentWebview().setPullToRefresh({  
                support: true  
            }, function() {  
                if(_callbackPull != null) _callbackPull();  
            });  
            if(_callbackExe != null) _callbackExe();  
        });  
    }, false);  
    return userPicker;  
}

第一次写,也自己记录一下方便以后查。
以上是我实现的一些解决办法,可能不是很好,JS水平也有限,大家可以一起来完善、提高,相互学习。

继续阅读 »

分享一下我在开发应用时,遇到的一些问题的解决方法,不知道会不会给大家一些帮助。
如果您有更好的方法,也可以一起讨论。

在我开发的应用中,主要涉及到高级查询的操作,因为有更多的查询选项,我使用了mui-popover这个控件可进行弹出,然后,嵌入了一些查询表单和下拉列表的选择项。

下拉列表选择项,使用了mui-poppicker控件。在测试时,popover和poppicker控件在安卓上遮罩层会有问题,点击poppicker后,相互遮挡,并且页面上还启用了Mui的下拉刷新控件。

出现的问题:
1、在弹出poppicker选择下拉列表时,会触发下拉刷新的事件。
2、popover显示后,再触发poppicker后,遮罩层不能完全遮盖住popover,导致可以多次触发poppicker

解决方法:

解决问题1思路:
弹出poppicker选择下拉列表时,禁用下拉刷新功能,选择确定后再启用下拉刷新功能。

解决问题2思路:
popover显示后,如果触发poppicker控件,先隐藏popover,选择确定后再显示popover控件。

另外,为了创建下拉列表方便,我将poppicker控件封装了一个常用方法,可以直接调用。

以下是实现的代码:

var isActivePop; //POP刷新激活状态,解决下拉刷新冲突  
mui.plusReady(function() {  
    isActivePop = false;  
    mui("#popWindow .mui-scroll-wrapper").scroll();  
    mui("body").on("shown", ".mui-popover", function(e) {  
        plus.webview.currentWebview().setPullToRefresh({  
            support: false  
        }, function() {});  
        isActivePop = true;  
    });  
    mui("body").on("hidden", ".mui-popover", function(e) {  
        if(isActivePop) {  
            plus.webview.currentWebview().setPullToRefresh({  
                support: true  
            }, function() {  
                // downRefresh(); 你自己的逻辑,我这里用的隐含刷新  
            });  
            mui("#refreshName").pullRefresh().pulldownLoading(); // 调用下拉刷新  
        }  
        isActivePop = false;  
    });  
}  

// 下拉刷新  
function downRefresh() {  
    // 自己的逻辑处理  
}  

/**  
 * 获取选择列表 (返回值为表单input赋值)  
 * 使用时需要引用 mui.picker.all.js 和 mui.picker.all.css 文件  
 * @param {String} buttonId 触发及显示文本的id  
 * @param {String} dataId 数据表单value的id  
 * @param {JSONArray} data 格式为 [{ value: 'ywj', text: '董事长 叶XX' }]  
 * @param {String} selectedValue 为选中值 value  
 * @param {Function} _callbackBefore 确认前回调方法  
 * @param {Function} _callbackPull 确认后回调下拉方法  
 * @param {Function} _callbackExe 确认后执行回调方法  
 */  
function getSelect(buttonId, dataId, data, selectedValue, _callbackBefore, _callbackPull, _callbackExe) {  
    var userPicker = new mui.PopPicker();  
    userPicker.setData(data);  
    var resultText = document.getElementById(buttonId);  
    var resultValue = document.getElementById(dataId);  
    var mui_popover = mui(".mui-popover"); //获取页面上多个popover控件  
    //设置默认值  
    if(selectedValue != null && selectedValue != "") {  
        userPicker.pickers[0].setSelectedValue(selectedValue); //设置选中值value  
        resultText.value = userPicker.pickers[0].getSelectedText(); //获取当前取中值的文本text  
        resultValue.value = userPicker.pickers[0].getSelectedValue(); //获取当前取中值的value值给数据表单  
    }  
    resultText.removeEventListener('tap', function(event) {});  
    resultText.addEventListener('tap', function(event, selectedValue) {  
        var _isActivePop = (isActivePop == null)? false : isActivePop);  
        if(_isActivePop) {  
            isActivePop = false; //在隐藏前,关闭刷新状态  
            for(var i = 0; i < mui_popover.length; i++) {  
                mui(mui_popover[i]).popover("hide");  
            }  
        }  
        plus.webview.currentWebview().setPullToRefresh({  
            support: false,  
        }, function() {  
            if(_callbackBefore != null) _callbackBefore();  
        });  
        userPicker.show(function(items) {  
            resultValue.value = items[0].value;  
            resultText.value = items[0].text;  
            if(_isActivePop) {  
                for(var i = 0; i < mui_popover.length; i++) {  
                    mui(mui_popover[i]).popover("show"); //处理页面上多个popover  
                }  
                isActivePop = true; //在显示后,开启刷新状态,为了能在POP正常HIDE后激活下拉刷新  
            }  
            plus.webview.currentWebview().setPullToRefresh({  
                support: true  
            }, function() {  
                if(_callbackPull != null) _callbackPull();  
            });  
            if(_callbackExe != null) _callbackExe();  
        });  
    }, false);  
    return userPicker;  
}

第一次写,也自己记录一下方便以后查。
以上是我实现的一些解决办法,可能不是很好,JS水平也有限,大家可以一起来完善、提高,相互学习。

收起阅读 »