HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

能否增加一个功能:项目只读开关

在浏览依赖库时总容易不小心碰到键盘。
胸太大了没办法。

在浏览依赖库时总容易不小心碰到键盘。
胸太大了没办法。

Android 获取 手机本机 MAC 地址 支持 所有 Android 版本

Android Native.JS MAC地址

Native.js 获取Android 手机 MAC 物理地址, Android 版本众多,之前的方法已经不支持最新的版本获取MAC地址了

在Android 6.0 之前可以获取MAC 方法,到了6.0版本后,不再支持此方法获取MAC地址了。

此方法,支持移动网络下获取MAC地址

var Context = plus.android.importClass("android.content.Context");  
var WifiManager = plus.android.importClass("android.net.wifi.WifiManager");  
var wifiManager = plus.android.runtimeMainActivity().getSystemService(Context.WIFI_SERVICE);  
var WifiInfo = plus.android.importClass("android.net.wifi.WifiInfo");  
var wifiInfo = wifiManager.getConnectionInfo();  
    wifiInfo.getMacAddress();

Android 6.0之后动态授权对隐私保护高了, 采用的获取MAC 的方法是读取 /sys/class/net/wlan0/address ,

此方法有些型机,只能在WIFI开启的状态下才能获取到MAC 地址

var BufferedReader=plus.android.importClass("java.io.BufferedReader");  
var FileReader=plus.android.importClass("java.io.FileReader");  
var file=new FileReader("/sys/class/net/wlan0/address");       
var reader = new BufferedReader(file,256);  
var address=reader.readLine();  
    reader.close();

Android 7.0 + 以上的方法也都没用了,谷歌对隐私要求更严格了,禁止读取/sys/class/net/wlan0/address 了, 但还是有方法读取到MAC , 采用的是 NetworkInterface 对端口扫描 读取到 wlan0 的值,它就是MAC地址了,

此方法有些型机,只能在WIFI开启的状态下才能获取到MAC 地址

var NetworkInterface=plus.android.importClass("java.net.NetworkInterface");              
var networkInterface = NetworkInterface.getByName("eth1");  
networkInterface = NetworkInterface.getByName("wlan0");  
var mac=networkInterface.getHardwareAddress();

写了一个获取 MAC 的插件,封装了以上三种方法一起,可以获取所有机型的MAC的地址。

有需要的可以到这个下载: http://www.html5-app.com/show/101
获得 MacAddress.js 引到 页面就可以 ,通过以下方法,可以获得MAC 地址。

mui.plusReady(function()  
{  

    var address=Mac.address();  

});
继续阅读 »

Native.js 获取Android 手机 MAC 物理地址, Android 版本众多,之前的方法已经不支持最新的版本获取MAC地址了

在Android 6.0 之前可以获取MAC 方法,到了6.0版本后,不再支持此方法获取MAC地址了。

此方法,支持移动网络下获取MAC地址

var Context = plus.android.importClass("android.content.Context");  
var WifiManager = plus.android.importClass("android.net.wifi.WifiManager");  
var wifiManager = plus.android.runtimeMainActivity().getSystemService(Context.WIFI_SERVICE);  
var WifiInfo = plus.android.importClass("android.net.wifi.WifiInfo");  
var wifiInfo = wifiManager.getConnectionInfo();  
    wifiInfo.getMacAddress();

Android 6.0之后动态授权对隐私保护高了, 采用的获取MAC 的方法是读取 /sys/class/net/wlan0/address ,

此方法有些型机,只能在WIFI开启的状态下才能获取到MAC 地址

var BufferedReader=plus.android.importClass("java.io.BufferedReader");  
var FileReader=plus.android.importClass("java.io.FileReader");  
var file=new FileReader("/sys/class/net/wlan0/address");       
var reader = new BufferedReader(file,256);  
var address=reader.readLine();  
    reader.close();

Android 7.0 + 以上的方法也都没用了,谷歌对隐私要求更严格了,禁止读取/sys/class/net/wlan0/address 了, 但还是有方法读取到MAC , 采用的是 NetworkInterface 对端口扫描 读取到 wlan0 的值,它就是MAC地址了,

此方法有些型机,只能在WIFI开启的状态下才能获取到MAC 地址

var NetworkInterface=plus.android.importClass("java.net.NetworkInterface");              
var networkInterface = NetworkInterface.getByName("eth1");  
networkInterface = NetworkInterface.getByName("wlan0");  
var mac=networkInterface.getHardwareAddress();

写了一个获取 MAC 的插件,封装了以上三种方法一起,可以获取所有机型的MAC的地址。

有需要的可以到这个下载: http://www.html5-app.com/show/101
获得 MacAddress.js 引到 页面就可以 ,通过以下方法,可以获得MAC 地址。

mui.plusReady(function()  
{  

    var address=Mac.address();  

});
收起阅读 »

canvasToTempFilePath 本地打包没用

canvas

HbuildX 最新版本(1.3.0)使用canvasToTempFilePath绘制图片,使用云端打包不会出现绘制为空白的问题。但是使用本地打包的时候,还是会出现在ios中使用canvasToTempFilePath方法绘制图片为空白的情况。不知道是什么原因?

继续阅读 »

HbuildX 最新版本(1.3.0)使用canvasToTempFilePath绘制图片,使用云端打包不会出现绘制为空白的问题。但是使用本地打包的时候,还是会出现在ios中使用canvasToTempFilePath方法绘制图片为空白的情况。不知道是什么原因?

收起阅读 »

预览图片 重写back

                                //图片预览对象      
                var imageViewer;  
                mui.back = function(event) {  
                    //先判断 是否是打开了图片预览 没有直接返回有的话就需要关闭图片预览  
                    if (document.querySelector(".mui-imageviewer-item")) {  
                        imageViewer.viewer.style.opacity = 0;  
                        setTimeout(function() {  
                            imageViewer.viewer.style.display = 'none';  
                            imageViewer.disposeImage(true);  
                        }, 600);  
                    } else {  
                        plus.webview.currentWebview().close();  
                    }  
                }
继续阅读 »
                                //图片预览对象      
                var imageViewer;  
                mui.back = function(event) {  
                    //先判断 是否是打开了图片预览 没有直接返回有的话就需要关闭图片预览  
                    if (document.querySelector(".mui-imageviewer-item")) {  
                        imageViewer.viewer.style.opacity = 0;  
                        setTimeout(function() {  
                            imageViewer.viewer.style.display = 'none';  
                            imageViewer.disposeImage(true);  
                        }, 600);  
                    } else {  
                        plus.webview.currentWebview().close();  
                    }  
                }
收起阅读 »

Android平台离线打包 - 语音识别(Speech)插件配置

离线打包 插件

百度语音设置

需要添加的文件

将以下文件放入工程的libs下

路径 文件名
SDK\libs speech-release.aar、speech_baidu-release.aar

AndroidManifest.xml配置

权限配置

    <uses-permission android:name="android.permission.RECORD_AUDIO" />  
    <uses-permission android:name="android.permission.INTERNET" />  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
    <uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

application节点配置

        <meta-data android:name="com.baidu.speech.APP_ID" android:value="${百度语音申请的appid}"/>  
        <meta-data android:name="com.baidu.speech.API_KEY" android:value="${百度语音申请的apikey}"/>  
        <meta-data android:name="com.baidu.speech.SECRET_KEY" android:value="${百度语音申请的secretkey}"/>  
        <service android:name="com.baidu.speech.VoiceRecognitionService" android:exported="false" />

dcloud_properties.xml配置

dcloud_properties.xml文件在assets/data目录下

features节点下设置

        <feature name="Speech" value="io.dcloud.feature.speech.SpeechFeatureImpl">  
            <module name="baidu" value="io.dcloud.feature.speech.BaiduSpeechEngine"/>  
        </feature>

讯飞语音设置

需要添加的文件

将以下文件放入工程的libs下

路径 文件名
SDK\libs speech-release.aar、speech_ifly-release.aar

AndroidManifest.xml配置

权限配置

    <uses-permission android:name="android.permission.RECORD_AUDIO" />  
    <uses-permission android:name="android.permission.INTERNET" />  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

application节点配置

        <meta-data  
            android:name="IFLY_APPKEY"  
            android:value="${讯飞语音申请的appid}" />

dcloud_properties.xml配置

dcloud_properties.xml文件在assets/data目录下

features节点下设置

        <feature name="Speech" value="io.dcloud.feature.speech.SpeechFeatureImpl">  
            <module name="iFly" value="io.dcloud.feature.speech.IflySpeechEngine"/>  
        </feature>
继续阅读 »

百度语音设置

需要添加的文件

将以下文件放入工程的libs下

路径 文件名
SDK\libs speech-release.aar、speech_baidu-release.aar

AndroidManifest.xml配置

权限配置

    <uses-permission android:name="android.permission.RECORD_AUDIO" />  
    <uses-permission android:name="android.permission.INTERNET" />  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
    <uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

application节点配置

        <meta-data android:name="com.baidu.speech.APP_ID" android:value="${百度语音申请的appid}"/>  
        <meta-data android:name="com.baidu.speech.API_KEY" android:value="${百度语音申请的apikey}"/>  
        <meta-data android:name="com.baidu.speech.SECRET_KEY" android:value="${百度语音申请的secretkey}"/>  
        <service android:name="com.baidu.speech.VoiceRecognitionService" android:exported="false" />

dcloud_properties.xml配置

dcloud_properties.xml文件在assets/data目录下

features节点下设置

        <feature name="Speech" value="io.dcloud.feature.speech.SpeechFeatureImpl">  
            <module name="baidu" value="io.dcloud.feature.speech.BaiduSpeechEngine"/>  
        </feature>

讯飞语音设置

需要添加的文件

将以下文件放入工程的libs下

路径 文件名
SDK\libs speech-release.aar、speech_ifly-release.aar

AndroidManifest.xml配置

权限配置

    <uses-permission android:name="android.permission.RECORD_AUDIO" />  
    <uses-permission android:name="android.permission.INTERNET" />  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

application节点配置

        <meta-data  
            android:name="IFLY_APPKEY"  
            android:value="${讯飞语音申请的appid}" />

dcloud_properties.xml配置

dcloud_properties.xml文件在assets/data目录下

features节点下设置

        <feature name="Speech" value="io.dcloud.feature.speech.SpeechFeatureImpl">  
            <module name="iFly" value="io.dcloud.feature.speech.IflySpeechEngine"/>  
        </feature>
收起阅读 »

关于iOS音频后台播放遇到的一些问题

最近在做一个音频相关软件,涉及一个后台播放网络地址音频功能。
就是APP不在主界面活动或锁屏时音频不暂停,能持续播放。
做android兼容时没有问题,到iOS时,只要锁屏就会音频暂停。在各个地搜了好多,给的解决办法是manifest.json加"UIBackgroundModes":["audio"]这个配置并且打包发布后才能生效。各种试打包好多遍也不好用。(用的是纯js写的播放音频)。后来细看帖子说是要用5+写。
总结:
js写法
var player = document.createElement('audio');
player.src="https://www.baidu.com/uploads/1.mp3";
mui写法5+
var player = plus.audio.createPlayer('audio/1.mp3');
js可以支持网络音频,但不支持iOS后台播放。配置文件设置后台可播放不生效,就是配置也不管用
5+支持本地,不支持网络音频(iOS)。配置文件设置后台可播放可以生效,但是不能播放网络音频(试过了播放本地文件是不需要打包就可以后台播放的)
这就是试了好多次没有试出结果的原因,结果就是没有结果。
希望对那些配置文件更改后没能有效果的爬坑群众有所帮助(在这纠结了好多天)
要是有好的解决办法欢迎留言!!!!

继续阅读 »

最近在做一个音频相关软件,涉及一个后台播放网络地址音频功能。
就是APP不在主界面活动或锁屏时音频不暂停,能持续播放。
做android兼容时没有问题,到iOS时,只要锁屏就会音频暂停。在各个地搜了好多,给的解决办法是manifest.json加"UIBackgroundModes":["audio"]这个配置并且打包发布后才能生效。各种试打包好多遍也不好用。(用的是纯js写的播放音频)。后来细看帖子说是要用5+写。
总结:
js写法
var player = document.createElement('audio');
player.src="https://www.baidu.com/uploads/1.mp3";
mui写法5+
var player = plus.audio.createPlayer('audio/1.mp3');
js可以支持网络音频,但不支持iOS后台播放。配置文件设置后台可播放不生效,就是配置也不管用
5+支持本地,不支持网络音频(iOS)。配置文件设置后台可播放可以生效,但是不能播放网络音频(试过了播放本地文件是不需要打包就可以后台播放的)
这就是试了好多次没有试出结果的原因,结果就是没有结果。
希望对那些配置文件更改后没能有效果的爬坑群众有所帮助(在这纠结了好多天)
要是有好的解决办法欢迎留言!!!!

收起阅读 »

分享一个有初始化值的prompt

plus uniapp Native.JS prompt

showPrompt(){
let main = plus.android.runtimeMainActivity();
let EditText = plus.android.importClass('android.widget.EditText');
let et = new EditText(main);
et.setText(val);//设置初始值
var AlertDialog = plus.android.importClass("android.app.AlertDialog");// 导入AlertDialog类
var dlg = new AlertDialog.Builder(main);
dlg.setTitle("请输入");// 设置提示框标题
dlg.setView(et);
var listener = plus.android.implements('android.content.DialogInterface$OnClickListener',{
onClick:function(dialog,which){
self.Val = et.getText().toString();
}
})
dlg.setPositiveButton("确定",listener);// 设置提示框按钮以及监听器
dlg.setNegativeButton("取消",null);
dlg.show();// 显示提示框
uni.hideLoading();
}

继续阅读 »

showPrompt(){
let main = plus.android.runtimeMainActivity();
let EditText = plus.android.importClass('android.widget.EditText');
let et = new EditText(main);
et.setText(val);//设置初始值
var AlertDialog = plus.android.importClass("android.app.AlertDialog");// 导入AlertDialog类
var dlg = new AlertDialog.Builder(main);
dlg.setTitle("请输入");// 设置提示框标题
dlg.setView(et);
var listener = plus.android.implements('android.content.DialogInterface$OnClickListener',{
onClick:function(dialog,which){
self.Val = et.getText().toString();
}
})
dlg.setPositiveButton("确定",listener);// 设置提示框按钮以及监听器
dlg.setNegativeButton("取消",null);
dlg.show();// 显示提示框
uni.hideLoading();
}

收起阅读 »

MUI:项目笔记(一)

—— 本套前端采用MUI原生APP框架。
—— 整理页面:
_____
—— lib js,css,font,img文件存放
—— app.css 这是自定义CSS
—— app.js 这是自定义JS
—— game 所有单个彩种投注页面文件
—— prizes 所有单个彩种开奖页面文件
—— activity 最新优惠活动页面文件
—— betting 投注记录页面和投注详情页面文件
—— login 登录、注册、忘记密码页面文件
—— pay 充值、提款、转账页面文件
—— prizes 所有单个彩种开奖页面文件
—— user 用户修改信息页面文件
—— public 所有公共页面文件
—— 脚部固定菜单 --> footernav.html
—— 侧边滑动菜单(预留,没用到,有小BUG) --> nav.html --> 放在</header>之后就能用

—— game.html 购彩大厅页面 --> 点击单个彩种跳转此彩种的投注页面
—— prize.html 开奖大厅页面 --> 点击单个彩种跳转此彩种的开奖历史 --> prizes文件夹
—— touzhu.html 投注记录页面 --> 点击单个记录跳转此彩种的详细投注信息 --> touzhus.html
—— touzhus.html 详情的投注记录页面
—— record.html 充值记录页面
—— records.html 充值记录详情页面
—— index.html 首页
—— user.html 个人中心页面
—— 修改信息跳转页面 --> user.html
—— 安全中心跳转页面 --> safe.html
—— 消息中心跳转页面 --> message.html
—— 代理中心跳转页面 --> agency.html
—— APP下载跳转页面 --> 外链
—— 充值跳转页面 --> recharge.html
—— 提款跳转页面 --> drawing.html
—— 转账跳转页面 --> giro.html
—— looks.html 用户协议页面
—— login.html 用户登录页面
—— register.html 用户注册页面
—— forgetpwd.html 忘记密码第一步页面
—— forgetpwd2.html 忘记密码第二步页面
——
——
——

MUI官网实例:http://www.dcloud.io/hellomui/

初始化模板:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>xx</title>
<link rel="icon" type="image/x-icon" href="lib/img/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="stylesheet" href="lib/css/mui.min.css">
<link rel="stylesheet" type="text/css" href="lib/css/app.css" />
<script src="lib/js/mui.min.js "></script>
<script src="lib/js/jq.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div class="mui-off-canvas-wrap mui-draggable">
<!-- 主页面容器 -->
<div class="mui-inner-wrap">
<!-- 主页面标题 -->
<header class="mui-bar mui-bar-nav">
<h1 class="mui-title">xx</h1>
</header>
<!-- 主页面内容容器 -->
<div class="mui-content mui-scroll-wrapper">
<div class="mui-scroll">
<!-- 内容写在这里!!!主界面具体展示内容 -->
</div>
</div>
<div class="mui-off-canvas-backdrop"></div>
</div>
</div>
</body>
<script type="text/javascript">
mui.init();
//内容允许滚动
(function($) {
$(".mui-scroll-wrapper").scroll({
bounce: true, //滚动条是否有弹力默认是true
indicators: true, //是否显示滚动条,默认是true
});
})(mui);
</script>
<!-- tap方法等于click -->
<script type="text/javascript">
$("body").on('tap', 'a', function(event) {
this.click();
});
</script>
</html>

页面滑动不了解决方案:

<script type="text/javascript">
mui.init();
//内容允许滚动
(function($) {
$(".mui-scroll-wrapper").scroll({
bounce: true, //滚动条是否有弹力默认是true
indicators: true, //是否显示滚动条,默认是true
});
})(mui);
</script>

onclick和a标签跳转/点击事件用不了解决方案:onclick就是tap!!onclick被MUI封装成tap!!

<!-- tap方法等于click -->
<script type="text/javascript">
$("你的id/class").on('tap', 'a', function(event) {
this.click();
});
</script>
<script type="text/javascript">
mui('你的id/class').on('a',function(){
window.top.location.href=this.href;
});
</script>

返回上一层:

<!-- 返回上一层 -->

<a class="mui-icon mui-icon-left-nav" href="javascript:history.back(-1)"></a>

选项卡:

<div class="mui-content">
<div style="padding: 10px 10px;">
<div id="segmentedControl" class="mui-segmented-control">
<a class="mui-control-item mui-active" href="#item1">普通下注</a>
<a class="mui-control-item" href="#item2">快捷下注</a>
</div>
</div>
<div>
<div id="item1" class="mui-control-content mui-active">
<ul class="mui-table-view">
<li class="mui-table-view-cell">
第1个选项卡子项-1
</li>
<li class="mui-table-view-cell">
第1个选项卡子项-2
</li>
<li class="mui-table-view-cell">
第1个选项卡子项-3
</li>
</ul>
</div>
<div id="item2" class="mui-control-content">
<ul class="mui-table-view">
<li class="mui-table-view-cell">
第二个选项卡子项-1
</li>
<li class="mui-table-view-cell">
第二个选项卡子项-2
</li>
<li class="mui-table-view-cell">
第二个选项卡子项-3
</li>
</ul>
</div>
</div>
</div>
<script>
(function($) {
$('#scroll').scroll({
indicators: true //是否显示滚动条
});
var segmentedControl = document.getElementById('segmentedControl');
$('.mui-input-group').on('change', 'input', function() {
if (this.checked) {
var styleEl = document.querySelector('input[name="style"]:checked');
var colorEl = document.querySelector('input[name="color"]:checked');
if (styleEl && colorEl) {
var style = styleEl.value;
var color = colorEl.value;
segmentedControl.className = 'mui-segmented-control' + (style ? (' mui-segmented-' + style) : '') + ' mui-segmented-' + color;
}
}
});
})(mui);
</script>

确定取消提示框:

<button id="tzbtn" type="button">提示框</button>
<script type="text/javascript">
document.getElementById("tzbtn").addEventListener('tap', function(e) {
e.detail.gesture.preventDefault(); //修复iOS 8.x平台存在的bug,使用plus.nativeUI.prompt会造成输入法闪一下又没了
var btnArray = ['确定', '取消'];
// mui.alert('当前值: ' + document.getElementById("zj").value, null, "提示");
mui.prompt('当前值:', ' '+document.getElementById("zj").value, 'Hello MUI', )
});
</script>

验证弹窗:

<div class="mui-input-group">
<div class="mui-input-row">
<label>用户名:</label>
<input type="text" class="mui-input-clear" placeholder="请输入用户名">
</div>
<div class="mui-input-row">
<label>密码:</label>
<input type="password" class="mui-input-clear mui-input-password" placeholder="请输入密码">
</div>
</div>

<script type="text/javascript">
mui("#input_example input").each(function() {
//若当前input为空,则alert提醒
if(!this.value || this.value.trim() == "") {
var label = this.previousElementSibling;
mui.alert(label.innerText + "不允许为空");
check = false;
return false;
}
}); //校验通过,继续执行业务逻辑
if(check){
mui.alert('验证通过!')
}
</script>

继续阅读 »
—— 本套前端采用MUI原生APP框架。
—— 整理页面:
_____
—— lib js,css,font,img文件存放
—— app.css 这是自定义CSS
—— app.js 这是自定义JS
—— game 所有单个彩种投注页面文件
—— prizes 所有单个彩种开奖页面文件
—— activity 最新优惠活动页面文件
—— betting 投注记录页面和投注详情页面文件
—— login 登录、注册、忘记密码页面文件
—— pay 充值、提款、转账页面文件
—— prizes 所有单个彩种开奖页面文件
—— user 用户修改信息页面文件
—— public 所有公共页面文件
—— 脚部固定菜单 --> footernav.html
—— 侧边滑动菜单(预留,没用到,有小BUG) --> nav.html --> 放在</header>之后就能用

—— game.html 购彩大厅页面 --> 点击单个彩种跳转此彩种的投注页面
—— prize.html 开奖大厅页面 --> 点击单个彩种跳转此彩种的开奖历史 --> prizes文件夹
—— touzhu.html 投注记录页面 --> 点击单个记录跳转此彩种的详细投注信息 --> touzhus.html
—— touzhus.html 详情的投注记录页面
—— record.html 充值记录页面
—— records.html 充值记录详情页面
—— index.html 首页
—— user.html 个人中心页面
—— 修改信息跳转页面 --> user.html
—— 安全中心跳转页面 --> safe.html
—— 消息中心跳转页面 --> message.html
—— 代理中心跳转页面 --> agency.html
—— APP下载跳转页面 --> 外链
—— 充值跳转页面 --> recharge.html
—— 提款跳转页面 --> drawing.html
—— 转账跳转页面 --> giro.html
—— looks.html 用户协议页面
—— login.html 用户登录页面
—— register.html 用户注册页面
—— forgetpwd.html 忘记密码第一步页面
—— forgetpwd2.html 忘记密码第二步页面
——
——
——

MUI官网实例:http://www.dcloud.io/hellomui/

初始化模板:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>xx</title>
<link rel="icon" type="image/x-icon" href="lib/img/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="stylesheet" href="lib/css/mui.min.css">
<link rel="stylesheet" type="text/css" href="lib/css/app.css" />
<script src="lib/js/mui.min.js "></script>
<script src="lib/js/jq.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div class="mui-off-canvas-wrap mui-draggable">
<!-- 主页面容器 -->
<div class="mui-inner-wrap">
<!-- 主页面标题 -->
<header class="mui-bar mui-bar-nav">
<h1 class="mui-title">xx</h1>
</header>
<!-- 主页面内容容器 -->
<div class="mui-content mui-scroll-wrapper">
<div class="mui-scroll">
<!-- 内容写在这里!!!主界面具体展示内容 -->
</div>
</div>
<div class="mui-off-canvas-backdrop"></div>
</div>
</div>
</body>
<script type="text/javascript">
mui.init();
//内容允许滚动
(function($) {
$(".mui-scroll-wrapper").scroll({
bounce: true, //滚动条是否有弹力默认是true
indicators: true, //是否显示滚动条,默认是true
});
})(mui);
</script>
<!-- tap方法等于click -->
<script type="text/javascript">
$("body").on('tap', 'a', function(event) {
this.click();
});
</script>
</html>

页面滑动不了解决方案:

<script type="text/javascript">
mui.init();
//内容允许滚动
(function($) {
$(".mui-scroll-wrapper").scroll({
bounce: true, //滚动条是否有弹力默认是true
indicators: true, //是否显示滚动条,默认是true
});
})(mui);
</script>

onclick和a标签跳转/点击事件用不了解决方案:onclick就是tap!!onclick被MUI封装成tap!!

<!-- tap方法等于click -->
<script type="text/javascript">
$("你的id/class").on('tap', 'a', function(event) {
this.click();
});
</script>
<script type="text/javascript">
mui('你的id/class').on('a',function(){
window.top.location.href=this.href;
});
</script>

返回上一层:

<!-- 返回上一层 -->

<a class="mui-icon mui-icon-left-nav" href="javascript:history.back(-1)"></a>

选项卡:

<div class="mui-content">
<div style="padding: 10px 10px;">
<div id="segmentedControl" class="mui-segmented-control">
<a class="mui-control-item mui-active" href="#item1">普通下注</a>
<a class="mui-control-item" href="#item2">快捷下注</a>
</div>
</div>
<div>
<div id="item1" class="mui-control-content mui-active">
<ul class="mui-table-view">
<li class="mui-table-view-cell">
第1个选项卡子项-1
</li>
<li class="mui-table-view-cell">
第1个选项卡子项-2
</li>
<li class="mui-table-view-cell">
第1个选项卡子项-3
</li>
</ul>
</div>
<div id="item2" class="mui-control-content">
<ul class="mui-table-view">
<li class="mui-table-view-cell">
第二个选项卡子项-1
</li>
<li class="mui-table-view-cell">
第二个选项卡子项-2
</li>
<li class="mui-table-view-cell">
第二个选项卡子项-3
</li>
</ul>
</div>
</div>
</div>
<script>
(function($) {
$('#scroll').scroll({
indicators: true //是否显示滚动条
});
var segmentedControl = document.getElementById('segmentedControl');
$('.mui-input-group').on('change', 'input', function() {
if (this.checked) {
var styleEl = document.querySelector('input[name="style"]:checked');
var colorEl = document.querySelector('input[name="color"]:checked');
if (styleEl && colorEl) {
var style = styleEl.value;
var color = colorEl.value;
segmentedControl.className = 'mui-segmented-control' + (style ? (' mui-segmented-' + style) : '') + ' mui-segmented-' + color;
}
}
});
})(mui);
</script>

确定取消提示框:

<button id="tzbtn" type="button">提示框</button>
<script type="text/javascript">
document.getElementById("tzbtn").addEventListener('tap', function(e) {
e.detail.gesture.preventDefault(); //修复iOS 8.x平台存在的bug,使用plus.nativeUI.prompt会造成输入法闪一下又没了
var btnArray = ['确定', '取消'];
// mui.alert('当前值: ' + document.getElementById("zj").value, null, "提示");
mui.prompt('当前值:', ' '+document.getElementById("zj").value, 'Hello MUI', )
});
</script>

验证弹窗:

<div class="mui-input-group">
<div class="mui-input-row">
<label>用户名:</label>
<input type="text" class="mui-input-clear" placeholder="请输入用户名">
</div>
<div class="mui-input-row">
<label>密码:</label>
<input type="password" class="mui-input-clear mui-input-password" placeholder="请输入密码">
</div>
</div>

<script type="text/javascript">
mui("#input_example input").each(function() {
//若当前input为空,则alert提醒
if(!this.value || this.value.trim() == "") {
var label = this.previousElementSibling;
mui.alert(label.innerText + "不允许为空");
check = false;
return false;
}
}); //校验通过,继续执行业务逻辑
if(check){
mui.alert('验证通过!')
}
</script>

收起阅读 »

如何打开和关闭tabBar

tabbar

uni-app的tabBar配置在pages.json中。
那么怎样才可以在login.vue中关闭tabBar?登陆成功后再显示tabBar。

或者有其它什么好的解决办法?

uni-app的tabBar配置在pages.json中。
那么怎样才可以在login.vue中关闭tabBar?登陆成功后再显示tabBar。

或者有其它什么好的解决办法?

mac的HBuilder真机调试无法出现设备(我的一个特例)

真机调试

可能是我mac的原因,之前没用全局的,是失败的。

我先用全局adb
adb kill-server
再用HBuilder底下的adb来启用和查看。
./adb start-server
./adb devices

再重启用HBuilder, 便有了。

附:
HBuilder的adb目录位置:tools/adbs目录(MAC下为HBuilder.app/Contents/tools/adbs目录)
HBuilderX的adb目录位置:plugins/launcher/tools/adbs目录(MAC下为HBuilder.app/Contents/HBuilderX/plugins/launcher/tools/adbs目录)
在adbs目录下运行./adb kill-server重试。

继续阅读 »

可能是我mac的原因,之前没用全局的,是失败的。

我先用全局adb
adb kill-server
再用HBuilder底下的adb来启用和查看。
./adb start-server
./adb devices

再重启用HBuilder, 便有了。

附:
HBuilder的adb目录位置:tools/adbs目录(MAC下为HBuilder.app/Contents/tools/adbs目录)
HBuilderX的adb目录位置:plugins/launcher/tools/adbs目录(MAC下为HBuilder.app/Contents/HBuilderX/plugins/launcher/tools/adbs目录)
在adbs目录下运行./adb kill-server重试。

收起阅读 »

新版HX很卡,经常卡死

HBuilderX

HX 1.2.1不知道为什么卡得的很严重。

1、启动很久,有时候要两分钟以上,而且启动卡住的时候电脑都动不了;
2、中文状态下输入英文的时候卡,要好几秒才识别出来;
3、选择文件的时候卡,这个就相当严重了,比如打包的时候选择证书文件,点击浏览,就开始卡死了,不是编辑器卡死而已,连电脑都卡死了,大概半个小时候后电脑可以动了,也就写了这个帖子,但是编辑器还是无法操作。

mac更新最新系统以后确实很卡,但不至于这么严重,而次打包都因为无法选择证书而不能打包,使用过程中经常就让你休息几分钟,不知道什么问题。

继续阅读 »

HX 1.2.1不知道为什么卡得的很严重。

1、启动很久,有时候要两分钟以上,而且启动卡住的时候电脑都动不了;
2、中文状态下输入英文的时候卡,要好几秒才识别出来;
3、选择文件的时候卡,这个就相当严重了,比如打包的时候选择证书文件,点击浏览,就开始卡死了,不是编辑器卡死而已,连电脑都卡死了,大概半个小时候后电脑可以动了,也就写了这个帖子,但是编辑器还是无法操作。

mac更新最新系统以后确实很卡,但不至于这么严重,而次打包都因为无法选择证书而不能打包,使用过程中经常就让你休息几分钟,不知道什么问题。

收起阅读 »

uni-app 利用uni-nav-bar组件设置导航栏透明渐变样式

uniapp uniapp 教程

官方的演示文件里有个uni-nav-bar,在需要的时候可以很好的自定义导航栏!

<template>  
    <view class="uni-navbar" :class="{'uni-navbar-fixed':isFixed,'uni-navbar-shadow':hasShadow}" :style="{'background-color':backgroundColor}">  
        <uni-status-bar v-if="insertStatusBar"></uni-status-bar>  
        <view class="uni-navbar-header" :style="{color:color}">  
            <view class="uni-navbar-header-btns" @tap="onClickLeft">  
                <view v-if="leftIcon.length">  
                    <uni-icon :type="leftIcon" :color="color" size="24"></uni-icon>  
                </view>  
                <view v-if="leftText.length" class="uni-navbar-btn-text" :class="{'uni-navbar-btn-icon-left':!leftIcon.length}">{{leftText}}</view>  
                <slot name="left"></slot>  
            </view>  
            <view class="uni-navbar-container">  
                <view v-if="title.length" class="uni-navbar-container-title">{{title}}</view>  
                <!-- 标题插槽 -->  
                <slot></slot>  
            </view>  
            <view class="uni-navbar-header-btns" @tap="onClickRight">  
                <view v-if="rightIcon.length">  
                    <uni-icon :type="rightIcon" :color="color" size="24"></uni-icon>  
                </view>  
                <!-- 优先显示图标 -->  
                <view v-if="rightText.length&&!rightIcon.length" class="uni-navbar-btn-text">{{rightText}}</view>  
                <slot name="right"></slot>  
            </view>  
        </view>  
    </view>  
</template>  

<script>  
    import uniStatusBar from './uni-status-bar.vue'  
    import uniIcon from './uni-icon.vue'  

    export default {  
        components: {  
            uniStatusBar,  
            uniIcon  
        },  
        props: {  
            /**  
             * 标题文字  
             */  
            title: {  
                type: String,  
                default: ''  
            },  
            /**  
             * 左侧按钮文本  
             */  
            leftText: {  
                type: String,  
                default: ''  
            },  
            /**  
             * 右侧按钮文本  
             */  
            rightText: {  
                type: String,  
                default: ''  
            },  
            /**  
             * 左侧按钮图标  
             */  
            leftIcon: {  
                type: String,  
                default: ''  
            },  
            /**  
             * 右侧按钮图标  
             */  
            rightIcon: {  
                type: String,  
                default: ''  
            },  
            /**  
             * 是否固定在顶部  
             */  
            fixed: {  
                type: [Boolean, String],  
                default: false  
            },  
            /**  
             * 按钮图标和文字颜色  
             */  
            color: {  
                type: String,  
                default: '#000000'  
            },  
            /**  
             * 背景颜色  
             */  
            backgroundColor: {  
                type: String,  
                default: '#FFFFFF'  
            },  
            /**  
             * 是否包含状态栏,默认固定在顶部时包含  
             */  
            statusBar: {  
                type: [Boolean, String],  
                default: ''  
            },  
            /**  
             * 是否使用阴影,默认根据背景色判断  
             */  
            shadow: {  
                type: String,  
                default: ''  
            }  
        },  
        computed: {  
            isFixed() {  
                return String(this.fixed) === 'true'  
            },  
            insertStatusBar() {  
                switch (String(this.statusBar)) {  
                    case 'true':  
                        return true  
                    case 'false':  
                        return false  
                    default:  
                        return this.isFixed  
                }  
            },  
            hasShadow() {  
                var backgroundColor = this.backgroundColor  
                switch (String(this.shadow)) {  
                    case 'true':  
                        return true  
                    case 'false':  
                        return false  
                    default:  
                        return backgroundColor !== 'transparent' && backgroundColor.indexOf('rgba') < 0  
                }  
            }  
        },  
        methods: {  
            /**  
             * 左侧按钮点击事件  
             */  
            onClickLeft() {  
                this.$emit('clickLeft')  
                this.$emit('click-left')  
            },  
            /**  
             * 右侧按钮点击事件  
             */  
            onClickRight() {  
                this.$emit('clickRight')  
                this.$emit('click-right')  
            }  
        }  
    }  
</script>  

<style>  
    .uni-navbar {  
        display: block;  
        position: relative;  
        width: 100%;  
        background-color: #FFFFFF;  
        overflow: hidden;  
    }  

    .uni-navbar view{  
        line-height:44px;  
    }  

    .uni-navbar-shadow {  
        box-shadow: 0 1px 6px #ccc;  
    }  

    .uni-navbar.uni-navbar-fixed {  
        position: fixed;  
        z-index: 998;  
    }  

    .uni-navbar-header {  
        display: flex;  
        flex-direction: row;  
        width: 100%;  
        height:44px;  
        line-height:44px;  
        font-size: 16px;  
    }  

    .uni-navbar-header .uni-navbar-header-btns{  
        display:inline-flex;  
        flex-wrap:nowrap;  
        flex-shrink:0;  
        width: 120upx;  
        padding:0 12upx;  
    }  

    .uni-navbar-header .uni-navbar-header-btns:first-child{  
        padding-left:0;  
    }  
    .uni-navbar-header .uni-navbar-header-btns:last-child{  
        width: 60upx;  
    }  
    .uni-navbar-container{  
        width:100%;  
        margin:0 10upx;  
    }  
    .uni-navbar-container-title{  
        font-size:30upx;  
        text-align:center;  
        padding-right: 60upx;  
    }  
</style>  

我们只需要在页面引用这个组件就可以实现导航栏的自定义了!具体的我就不描述了!
在模板文件中引入

        <uni-nav-bar fixed="true" :background-color="titleBg"  left-icon="back" @click-left="back" @click-right="showMenu" left-text="返回" right-text="菜单"  
         title="导航栏组件"></uni-nav-bar>

给导航栏背景定义一个titleBg

<script>  
    import uniNavBar from '../../../components/uni-nav-bar.vue'  
    export default {  
        data() {  
            return {  
                titleBg:'rgba(255,255,255,0)'  
            };  
        },  
        components: {  
            uniNavBar  
        },  
        methods: {  

        },  
        onPageScroll:function(e){  
            this.titleBg = 'rgba(255,255,255,'+e.scrollTop / 300+')';  
        }  
    }  
</script>

这样就完成了从透明到白色背景的滚动渐变样式了 其他颜色修改下就可以了

继续阅读 »

官方的演示文件里有个uni-nav-bar,在需要的时候可以很好的自定义导航栏!

<template>  
    <view class="uni-navbar" :class="{'uni-navbar-fixed':isFixed,'uni-navbar-shadow':hasShadow}" :style="{'background-color':backgroundColor}">  
        <uni-status-bar v-if="insertStatusBar"></uni-status-bar>  
        <view class="uni-navbar-header" :style="{color:color}">  
            <view class="uni-navbar-header-btns" @tap="onClickLeft">  
                <view v-if="leftIcon.length">  
                    <uni-icon :type="leftIcon" :color="color" size="24"></uni-icon>  
                </view>  
                <view v-if="leftText.length" class="uni-navbar-btn-text" :class="{'uni-navbar-btn-icon-left':!leftIcon.length}">{{leftText}}</view>  
                <slot name="left"></slot>  
            </view>  
            <view class="uni-navbar-container">  
                <view v-if="title.length" class="uni-navbar-container-title">{{title}}</view>  
                <!-- 标题插槽 -->  
                <slot></slot>  
            </view>  
            <view class="uni-navbar-header-btns" @tap="onClickRight">  
                <view v-if="rightIcon.length">  
                    <uni-icon :type="rightIcon" :color="color" size="24"></uni-icon>  
                </view>  
                <!-- 优先显示图标 -->  
                <view v-if="rightText.length&&!rightIcon.length" class="uni-navbar-btn-text">{{rightText}}</view>  
                <slot name="right"></slot>  
            </view>  
        </view>  
    </view>  
</template>  

<script>  
    import uniStatusBar from './uni-status-bar.vue'  
    import uniIcon from './uni-icon.vue'  

    export default {  
        components: {  
            uniStatusBar,  
            uniIcon  
        },  
        props: {  
            /**  
             * 标题文字  
             */  
            title: {  
                type: String,  
                default: ''  
            },  
            /**  
             * 左侧按钮文本  
             */  
            leftText: {  
                type: String,  
                default: ''  
            },  
            /**  
             * 右侧按钮文本  
             */  
            rightText: {  
                type: String,  
                default: ''  
            },  
            /**  
             * 左侧按钮图标  
             */  
            leftIcon: {  
                type: String,  
                default: ''  
            },  
            /**  
             * 右侧按钮图标  
             */  
            rightIcon: {  
                type: String,  
                default: ''  
            },  
            /**  
             * 是否固定在顶部  
             */  
            fixed: {  
                type: [Boolean, String],  
                default: false  
            },  
            /**  
             * 按钮图标和文字颜色  
             */  
            color: {  
                type: String,  
                default: '#000000'  
            },  
            /**  
             * 背景颜色  
             */  
            backgroundColor: {  
                type: String,  
                default: '#FFFFFF'  
            },  
            /**  
             * 是否包含状态栏,默认固定在顶部时包含  
             */  
            statusBar: {  
                type: [Boolean, String],  
                default: ''  
            },  
            /**  
             * 是否使用阴影,默认根据背景色判断  
             */  
            shadow: {  
                type: String,  
                default: ''  
            }  
        },  
        computed: {  
            isFixed() {  
                return String(this.fixed) === 'true'  
            },  
            insertStatusBar() {  
                switch (String(this.statusBar)) {  
                    case 'true':  
                        return true  
                    case 'false':  
                        return false  
                    default:  
                        return this.isFixed  
                }  
            },  
            hasShadow() {  
                var backgroundColor = this.backgroundColor  
                switch (String(this.shadow)) {  
                    case 'true':  
                        return true  
                    case 'false':  
                        return false  
                    default:  
                        return backgroundColor !== 'transparent' && backgroundColor.indexOf('rgba') < 0  
                }  
            }  
        },  
        methods: {  
            /**  
             * 左侧按钮点击事件  
             */  
            onClickLeft() {  
                this.$emit('clickLeft')  
                this.$emit('click-left')  
            },  
            /**  
             * 右侧按钮点击事件  
             */  
            onClickRight() {  
                this.$emit('clickRight')  
                this.$emit('click-right')  
            }  
        }  
    }  
</script>  

<style>  
    .uni-navbar {  
        display: block;  
        position: relative;  
        width: 100%;  
        background-color: #FFFFFF;  
        overflow: hidden;  
    }  

    .uni-navbar view{  
        line-height:44px;  
    }  

    .uni-navbar-shadow {  
        box-shadow: 0 1px 6px #ccc;  
    }  

    .uni-navbar.uni-navbar-fixed {  
        position: fixed;  
        z-index: 998;  
    }  

    .uni-navbar-header {  
        display: flex;  
        flex-direction: row;  
        width: 100%;  
        height:44px;  
        line-height:44px;  
        font-size: 16px;  
    }  

    .uni-navbar-header .uni-navbar-header-btns{  
        display:inline-flex;  
        flex-wrap:nowrap;  
        flex-shrink:0;  
        width: 120upx;  
        padding:0 12upx;  
    }  

    .uni-navbar-header .uni-navbar-header-btns:first-child{  
        padding-left:0;  
    }  
    .uni-navbar-header .uni-navbar-header-btns:last-child{  
        width: 60upx;  
    }  
    .uni-navbar-container{  
        width:100%;  
        margin:0 10upx;  
    }  
    .uni-navbar-container-title{  
        font-size:30upx;  
        text-align:center;  
        padding-right: 60upx;  
    }  
</style>  

我们只需要在页面引用这个组件就可以实现导航栏的自定义了!具体的我就不描述了!
在模板文件中引入

        <uni-nav-bar fixed="true" :background-color="titleBg"  left-icon="back" @click-left="back" @click-right="showMenu" left-text="返回" right-text="菜单"  
         title="导航栏组件"></uni-nav-bar>

给导航栏背景定义一个titleBg

<script>  
    import uniNavBar from '../../../components/uni-nav-bar.vue'  
    export default {  
        data() {  
            return {  
                titleBg:'rgba(255,255,255,0)'  
            };  
        },  
        components: {  
            uniNavBar  
        },  
        methods: {  

        },  
        onPageScroll:function(e){  
            this.titleBg = 'rgba(255,255,255,'+e.scrollTop / 300+')';  
        }  
    }  
</script>

这样就完成了从透明到白色背景的滚动渐变样式了 其他颜色修改下就可以了

收起阅读 »