
学习笔记自我小结(二)
1.打开一个webview,要采用延时,因为webview样式渲染需要时间
bindCreateAddr: function() {//新建地址栏
mui("#addressManage .mui-scroll")[0].innerHTML = '';
mui(".check-btn-total")[0].classList.add("hide");
setTimeout(function() { //加个延时
mui.openWindow({
url: 'newAddress.html',
id: 'newAddress.html',
show: {
aniShow: 'pop-in'
},
waiting: {
autoShow: false
}
});
}, 70);
},
要加个延时。虽然js的确清除了innerHmtl = '' 但是webview的渲染执行,在openwindow执行后,未必就
渲染成功。
否则到newAddress.html 页面 再返回的时候,webview的渲染才会执行,就会看到执行innerHTML = ''操作之前的样式,然后再显示 innerHTML = '' 执行的操作样式。
这里重点注意一下。。。
- picker 省市区的三级联动 选中默认值,必须得加上延时才行。
cityPicker.pickers[0].setSelectedValue(130000);
setTimeout(function(){
cityPicker.pickers[1].setSelectedValue(130200);
},100);
我侧过了,就是选择完第一个第二个效果还没显示完,所以不选择,设个延时就好了。希望对以后的朋友有帮助。
3.关于聚焦在input框上,系统自动调用软键盘会将底部的fixed定位的按钮顶起来。
原因是因为: 调用软键盘的显示,会将当前的webview挤压,减少视口的高度。
解决:监控 document.body.onresize 的事件来解决问题。
如下代码:
//代码结构如下,所有内容包含在了mui-scroll 里面。因为mui-scroll 是absolute,所以body的高度是无法因内容的多少而变化的。
//所以监控了mui-scroll的高度。
// 初始化加载第一次的未调用软键盘时的高度 newAddress.view.scrollOffHeight = mui(".mui-scroll")[0].offsetHeight。
//然后再比较, 代码如下:
<div class="mui-content">
<div class="mui-scroll-wrapper">
<div class="mui-scroll">
</div>
</div>
</div>
newAddress.view.scrollOffHeight = mui(".mui-scroll")[0].offsetHeight;//
document.body.onresize = function() {
if(newAddress.view.scrollOffHeight > mui(".mui-scroll")[0].offsetHeight) {//比较
mui(".check-btn-total")[0].style.cssText = "display:none"; //控制底部的fixed按钮
} else {
mui(".check-btn-total")[0].style.cssText = "display:block";
}
}
4 .mui-content {overflow:hidden} 解决 scroll 滚动条问题
1.打开一个webview,要采用延时,因为webview样式渲染需要时间
bindCreateAddr: function() {//新建地址栏
mui("#addressManage .mui-scroll")[0].innerHTML = '';
mui(".check-btn-total")[0].classList.add("hide");
setTimeout(function() { //加个延时
mui.openWindow({
url: 'newAddress.html',
id: 'newAddress.html',
show: {
aniShow: 'pop-in'
},
waiting: {
autoShow: false
}
});
}, 70);
},
要加个延时。虽然js的确清除了innerHmtl = '' 但是webview的渲染执行,在openwindow执行后,未必就
渲染成功。
否则到newAddress.html 页面 再返回的时候,webview的渲染才会执行,就会看到执行innerHTML = ''操作之前的样式,然后再显示 innerHTML = '' 执行的操作样式。
这里重点注意一下。。。
- picker 省市区的三级联动 选中默认值,必须得加上延时才行。
cityPicker.pickers[0].setSelectedValue(130000);
setTimeout(function(){
cityPicker.pickers[1].setSelectedValue(130200);
},100);
我侧过了,就是选择完第一个第二个效果还没显示完,所以不选择,设个延时就好了。希望对以后的朋友有帮助。
3.关于聚焦在input框上,系统自动调用软键盘会将底部的fixed定位的按钮顶起来。
原因是因为: 调用软键盘的显示,会将当前的webview挤压,减少视口的高度。
解决:监控 document.body.onresize 的事件来解决问题。
如下代码:
//代码结构如下,所有内容包含在了mui-scroll 里面。因为mui-scroll 是absolute,所以body的高度是无法因内容的多少而变化的。
//所以监控了mui-scroll的高度。
// 初始化加载第一次的未调用软键盘时的高度 newAddress.view.scrollOffHeight = mui(".mui-scroll")[0].offsetHeight。
//然后再比较, 代码如下:
<div class="mui-content">
<div class="mui-scroll-wrapper">
<div class="mui-scroll">
</div>
</div>
</div>
newAddress.view.scrollOffHeight = mui(".mui-scroll")[0].offsetHeight;//
document.body.onresize = function() {
if(newAddress.view.scrollOffHeight > mui(".mui-scroll")[0].offsetHeight) {//比较
mui(".check-btn-total")[0].style.cssText = "display:none"; //控制底部的fixed按钮
} else {
mui(".check-btn-total")[0].style.cssText = "display:block";
}
}
4 .mui-content {overflow:hidden} 解决 scroll 滚动条问题
收起阅读 »
学习笔记自我小结(2)
1.打开一个webview,要采用延时,因为webview样式渲染需要时间
bindCreateAddr: function() {//新建地址栏
mui("#addressManage .mui-scroll")[0].innerHTML = '';
mui(".check-btn-total")[0].classList.add("hide");
setTimeout(function() { //加个延时
mui.openWindow({
url: 'newAddress.html',
id: 'newAddress.html',
show: {
aniShow: 'pop-in'
},
waiting: {
autoShow: false
}
});
}, 70);
},
要加个延时。虽然js的确清除了innerHmtl = '' 但是webview的渲染执行,在openwindow执行后,未必就
渲染成功。
否则到newAddress.html 页面 再返回的时候,webview的渲染才会执行,就会看到执行innerHTML = ''操作之前的样式,然后再显示 innerHTML = '' 执行的操作样式。
这里重点注意一下。。。
- picker 省市区的三级联动 选中默认值,必须得加上延时才行。
cityPicker.pickers[0].setSelectedValue(130000);
setTimeout(function(){
cityPicker.pickers[1].setSelectedValue(130200);
},100);
我侧过了,就是选择完第一个第二个效果还没显示完,所以不选择,设个延时就好了。希望对以后的朋友有帮助。
4.关于聚焦在input框上,系统自动调用软键盘会将底部的fixed定位的按钮顶起来。
原因是因为: 调用软键盘的显示,会将当前的webview挤压,减少视口的高度。
解决:监控 document.body.onresize 的事件来解决问题。
如下代码:
//代码结构如下,所有内容包含在了mui-scroll 里面。因为mui-scroll 是absolute,所以body的高度是无法因内容的多少而变化的。
//所以监控了mui-scroll的高度。
// 初始化加载第一次的未调用软键盘时的高度 newAddress.view.scrollOffHeight = mui(".mui-scroll")[0].offsetHeight。
//然后再比较, 代码如下:
<div class="mui-content">
<div class="mui-scroll-wrapper">
<div class="mui-scroll">
</div>
</div>
</div>
newAddress.view.scrollOffHeight = mui(".mui-scroll")[0].offsetHeight;//
document.body.onresize = function() {
if(newAddress.view.scrollOffHeight > mui(".mui-scroll")[0].offsetHeight) {//比较
mui(".check-btn-total")[0].style.cssText = "display:none"; //控制底部的fixed按钮
} else {
mui(".check-btn-total")[0].style.cssText = "display:block";
}
}
-
.mui-content {overflow:hidden} 解决 scroll 滚动条问题
-
官方的checkbox例子中,点击checkbox的圆圈,触发2次change,已解决
不采用官方的checkbox, 自己重写。
-
打开新的webview,样式渲染需要时间,防止用户在第一眼看到乱的样式之前,用loaded加载完毕再show出
来, 虽然页面加载完毕好了,但是js的渲染还在继续,所以可以适当的采用延迟,这里我给了300msmui("#slider .mui-slider-group").on("tap", ".mui-slider-item", function() { var waiting = plus.nativeUI.showWaiting("等待中..."); var detailView = plus.webview.create('detail.html','detail.html'); var proId = this.getAttribute("id"); mui.fire(detailView,'getProDetailInfo',{ "proDetail": data["banners"][1] }); var waiting = plus.nativeUI.showWaiting("等待中..."); detailView.addEventListener("loaded",function(){//页面加载完成后才显示 setTimeout(function() { plus.nativeUI.closeWaiting("等待中..."); detailView.show("pop-in"); }, 300) },false); })
1.打开一个webview,要采用延时,因为webview样式渲染需要时间
bindCreateAddr: function() {//新建地址栏
mui("#addressManage .mui-scroll")[0].innerHTML = '';
mui(".check-btn-total")[0].classList.add("hide");
setTimeout(function() { //加个延时
mui.openWindow({
url: 'newAddress.html',
id: 'newAddress.html',
show: {
aniShow: 'pop-in'
},
waiting: {
autoShow: false
}
});
}, 70);
},
要加个延时。虽然js的确清除了innerHmtl = '' 但是webview的渲染执行,在openwindow执行后,未必就
渲染成功。
否则到newAddress.html 页面 再返回的时候,webview的渲染才会执行,就会看到执行innerHTML = ''操作之前的样式,然后再显示 innerHTML = '' 执行的操作样式。
这里重点注意一下。。。
- picker 省市区的三级联动 选中默认值,必须得加上延时才行。
cityPicker.pickers[0].setSelectedValue(130000);
setTimeout(function(){
cityPicker.pickers[1].setSelectedValue(130200);
},100);
我侧过了,就是选择完第一个第二个效果还没显示完,所以不选择,设个延时就好了。希望对以后的朋友有帮助。
4.关于聚焦在input框上,系统自动调用软键盘会将底部的fixed定位的按钮顶起来。
原因是因为: 调用软键盘的显示,会将当前的webview挤压,减少视口的高度。
解决:监控 document.body.onresize 的事件来解决问题。
如下代码:
//代码结构如下,所有内容包含在了mui-scroll 里面。因为mui-scroll 是absolute,所以body的高度是无法因内容的多少而变化的。
//所以监控了mui-scroll的高度。
// 初始化加载第一次的未调用软键盘时的高度 newAddress.view.scrollOffHeight = mui(".mui-scroll")[0].offsetHeight。
//然后再比较, 代码如下:
<div class="mui-content">
<div class="mui-scroll-wrapper">
<div class="mui-scroll">
</div>
</div>
</div>
newAddress.view.scrollOffHeight = mui(".mui-scroll")[0].offsetHeight;//
document.body.onresize = function() {
if(newAddress.view.scrollOffHeight > mui(".mui-scroll")[0].offsetHeight) {//比较
mui(".check-btn-total")[0].style.cssText = "display:none"; //控制底部的fixed按钮
} else {
mui(".check-btn-total")[0].style.cssText = "display:block";
}
}
-
.mui-content {overflow:hidden} 解决 scroll 滚动条问题
-
官方的checkbox例子中,点击checkbox的圆圈,触发2次change,已解决
不采用官方的checkbox, 自己重写。
-
打开新的webview,样式渲染需要时间,防止用户在第一眼看到乱的样式之前,用loaded加载完毕再show出
来, 虽然页面加载完毕好了,但是js的渲染还在继续,所以可以适当的采用延迟,这里我给了300msmui("#slider .mui-slider-group").on("tap", ".mui-slider-item", function() { var waiting = plus.nativeUI.showWaiting("等待中..."); var detailView = plus.webview.create('detail.html','detail.html'); var proId = this.getAttribute("id"); mui.fire(detailView,'getProDetailInfo',{ "proDetail": data["banners"][1] }); var waiting = plus.nativeUI.showWaiting("等待中..."); detailView.addEventListener("loaded",function(){//页面加载完成后才显示 setTimeout(function() { plus.nativeUI.closeWaiting("等待中..."); detailView.show("pop-in"); }, 300) },false); })

push推送遇到的问题总结
android:
一开始做就是不认真,想当然所以走了不少弯路,所以一定要对推送插件开发指南详细认真阅读!,认真阅读!,认真阅读!,开始正题
1.在个推官网设置appid appsecret等等参数,这些就不多说了,都有教程
2.对于推送的消息分为两种 ,1:普通的推送消息 2:透传数据(透传的数据又分为两种 ,下面具体说)
3. 对于普通消息的推送 ,只会在消息中心显示消息,只会触发点击启动应用等动作。注意了,只是触发启动应用等动作,并不是响应click事件!!!!!!,这是坑我最惨的,一开始我以为可以响应,官网其实也说了:只是触发启动应用等动作,是我想当然了!!,所以发送普通消息就别想着去触发click事件了!!!!!
4 说完普通消息推送,剩下的透传数据的推送就可以响应click和receive了,当然这也是分情况的!!,真坑。分析如下
1.当发送透传数据的格式是标准格式({title:"通知标题",content:"通知内容",payload:"通知去干嘛这里可以自定义"}),这个时候消息会发送到消息中心,并且这个时候当用户点击这个消息,就会响应click事件!,妈蛋终于响应了!,但是抱歉只能响应click事件,要想响应receive还得分情况。
2.说完了响应click事件的情况,剩下的就是receive事件响应了。只有发送的是透传数据 而且不是标准格式并且 当前应用在活动,这3个条件,才可以响应receive事件!!!,但是消息中心并没有消息展示!!!,这就是最坑的!
所以总结如下:
触发click事件: 发送透传数据并且格式为标准格式。
触发receive事件:发送透传数据且格式为非标准格式且应用在活动。(消息栏不会有提示!!!!!)
ios:
在线:只能响应receive,但消息中心无消息
不在线:消息中心有消息,且响应click事件
android:
一开始做就是不认真,想当然所以走了不少弯路,所以一定要对推送插件开发指南详细认真阅读!,认真阅读!,认真阅读!,开始正题
1.在个推官网设置appid appsecret等等参数,这些就不多说了,都有教程
2.对于推送的消息分为两种 ,1:普通的推送消息 2:透传数据(透传的数据又分为两种 ,下面具体说)
3. 对于普通消息的推送 ,只会在消息中心显示消息,只会触发点击启动应用等动作。注意了,只是触发启动应用等动作,并不是响应click事件!!!!!!,这是坑我最惨的,一开始我以为可以响应,官网其实也说了:只是触发启动应用等动作,是我想当然了!!,所以发送普通消息就别想着去触发click事件了!!!!!
4 说完普通消息推送,剩下的透传数据的推送就可以响应click和receive了,当然这也是分情况的!!,真坑。分析如下
1.当发送透传数据的格式是标准格式({title:"通知标题",content:"通知内容",payload:"通知去干嘛这里可以自定义"}),这个时候消息会发送到消息中心,并且这个时候当用户点击这个消息,就会响应click事件!,妈蛋终于响应了!,但是抱歉只能响应click事件,要想响应receive还得分情况。
2.说完了响应click事件的情况,剩下的就是receive事件响应了。只有发送的是透传数据 而且不是标准格式并且 当前应用在活动,这3个条件,才可以响应receive事件!!!,但是消息中心并没有消息展示!!!,这就是最坑的!
所以总结如下:
触发click事件: 发送透传数据并且格式为标准格式。
触发receive事件:发送透传数据且格式为非标准格式且应用在活动。(消息栏不会有提示!!!!!)
ios:
在线:只能响应receive,但消息中心无消息
不在线:消息中心有消息,且响应click事件

【公告】关于HBuilder 7.6.3中Android4.4以下软键盘闪退,子webview切换异常,iOS关闭子窗口导致应用卡死等问题的解决办法
Android
软键盘闪退
HBuilder 7.6.3版真机调试,Android4.4以下设备,表单元素如input,点击获取焦点后软键盘出现立刻收回,再次点击无法弹出。
子窗口切换异常
Android平台下,父子webview模式。子webview首次显示,先全屏显示然后styles变化。
控制台信息
控制太多出的信息,是底层的日志信息,并不是bug,新的apk不会再出现这些日志信息。
iOS
关闭子窗口导致应用卡死
iOS父子webview模式下,关闭子窗口导致应用卡死。
解决办法
Alpha版HBuilder已修复以上问题,请更新或下载最新版Alpha版HBuilder。
下载地址: http://pan.baidu.com/s/1hs0O4eS#list/path=%2F&parentPath=%2Falpha%3Fqq-pf-to
7.6.5.201612262256-alpha 版本更新日志:
【重要】更新高德地图、百度地图、微信等第三SDK,支持https连接
Android平台修复获取设备屏幕逻辑分辨率不准确的问题
Android平台修复Webview作为子窗口使用fade-in动画效果显示不正常的问题
Android平台修复调用微信登录可能无法触发回调的问题
iOS平台补齐讯飞语音支持设置识别语言、标点符号功能
iOS平台修复关闭子Webview窗口可能导致页面卡死的问题
iOS平台修复个推发送透传消息启动可能导致异常退出的问题
Android
软键盘闪退
HBuilder 7.6.3版真机调试,Android4.4以下设备,表单元素如input,点击获取焦点后软键盘出现立刻收回,再次点击无法弹出。
子窗口切换异常
Android平台下,父子webview模式。子webview首次显示,先全屏显示然后styles变化。
控制台信息
控制太多出的信息,是底层的日志信息,并不是bug,新的apk不会再出现这些日志信息。
iOS
关闭子窗口导致应用卡死
iOS父子webview模式下,关闭子窗口导致应用卡死。
解决办法
Alpha版HBuilder已修复以上问题,请更新或下载最新版Alpha版HBuilder。
下载地址: http://pan.baidu.com/s/1hs0O4eS#list/path=%2F&parentPath=%2Falpha%3Fqq-pf-to
7.6.5.201612262256-alpha 版本更新日志:
【重要】更新高德地图、百度地图、微信等第三SDK,支持https连接
Android平台修复获取设备屏幕逻辑分辨率不准确的问题
Android平台修复Webview作为子窗口使用fade-in动画效果显示不正常的问题
Android平台修复调用微信登录可能无法触发回调的问题
iOS平台补齐讯飞语音支持设置识别语言、标点符号功能
iOS平台修复关闭子Webview窗口可能导致页面卡死的问题
iOS平台修复个推发送透传消息启动可能导致异常退出的问题

解析XML文件
之前一直用json格式,后来接口边XML,发现解析也方便:
var xmlDoc=new DOMParser().parseFromString(jsonStr, "text/xml");
var desc = xmlDoc.getElementsByTagName("desc")[0].firstChild.nodeValue;
var flag = xmlDoc.getElementsByTagName("flag")[0].firstChild.nodeValue;
之前一直用json格式,后来接口边XML,发现解析也方便:
var xmlDoc=new DOMParser().parseFromString(jsonStr, "text/xml");
var desc = xmlDoc.getElementsByTagName("desc")[0].firstChild.nodeValue;
var flag = xmlDoc.getElementsByTagName("flag")[0].firstChild.nodeValue;

文字合成语音的实现
HBuilder版本号为7.6.3.201612161809及之后的用户请用如下Native.Js代码实现:
var receiver;
receiver = plus.android.implements('com.iflytek.cloud.SynthesizerListener', {
onEvent: function(int eventType, int arg1, int arg2, Bundle obj) {
console.log("onEvent");
},
onSpeakBegin: function() {
console.log("开始阅读");
},
onSpeakPaused: function() {
console.log(" 暂停播放 ");
},
onSpeakResumed: function() {
console.log("继续播放");
},
onBufferProgress: function(percent, beginPos, endPos, info) {
console.log("合成进度" + percent);
},
onSpeakProgress: function(percent, beginPos, endPos) {
console.log("播放进度" + percent);
},
onCompleted: function(error) {
console.log("播放完毕");
}
});
var main = plus.android.runtimeMainActivity();
var SpeechUtility = plus.android.importClass('com.iflytek.cloud.SpeechUtility');
SpeechUtility.createUtility(main, "appid=53feacdd");
var SynthesizerPlayer = plus.android.importClass('com.iflytek.cloud.SpeechSynthesizer');
var play = SynthesizerPlayer.createSynthesizer(main, null);
// 开始合成
play.startSpeaking('新年快乐', receiver);
// 取消合成
play.stopSpeaking();
// 暂停播放
play.pauseSpeaking();
// 继续播放
play.resumeSpeaking();
该版本之前的用户请参考下面的写法:
由于Android系统tts不支持中文,使用科大讯飞文字转语音功能,使用如此功能时,需要保证manifest.json中permissions节点含有speech节点(如"Speech": {"description": "管理语音识别插件" })。
var main = plus.android.runtimeMainActivity();
var SynthesizerPlayer = plus.android.importClass('com.iflytek.speech.SynthesizerPlayer');
var play = SynthesizerPlayer.createSynthesizerPlayer(main,'appid=53feacdd');
play.playText('水果',null,null);
iOS平台参考[http://ask.dcloud.net.cn/question/4175)(http://ask.dcloud.net.cn/question/4175)
HBuilder版本号为7.6.3.201612161809及之后的用户请用如下Native.Js代码实现:
var receiver;
receiver = plus.android.implements('com.iflytek.cloud.SynthesizerListener', {
onEvent: function(int eventType, int arg1, int arg2, Bundle obj) {
console.log("onEvent");
},
onSpeakBegin: function() {
console.log("开始阅读");
},
onSpeakPaused: function() {
console.log(" 暂停播放 ");
},
onSpeakResumed: function() {
console.log("继续播放");
},
onBufferProgress: function(percent, beginPos, endPos, info) {
console.log("合成进度" + percent);
},
onSpeakProgress: function(percent, beginPos, endPos) {
console.log("播放进度" + percent);
},
onCompleted: function(error) {
console.log("播放完毕");
}
});
var main = plus.android.runtimeMainActivity();
var SpeechUtility = plus.android.importClass('com.iflytek.cloud.SpeechUtility');
SpeechUtility.createUtility(main, "appid=53feacdd");
var SynthesizerPlayer = plus.android.importClass('com.iflytek.cloud.SpeechSynthesizer');
var play = SynthesizerPlayer.createSynthesizer(main, null);
// 开始合成
play.startSpeaking('新年快乐', receiver);
// 取消合成
play.stopSpeaking();
// 暂停播放
play.pauseSpeaking();
// 继续播放
play.resumeSpeaking();
该版本之前的用户请参考下面的写法:
由于Android系统tts不支持中文,使用科大讯飞文字转语音功能,使用如此功能时,需要保证manifest.json中permissions节点含有speech节点(如"Speech": {"description": "管理语音识别插件" })。
var main = plus.android.runtimeMainActivity();
var SynthesizerPlayer = plus.android.importClass('com.iflytek.speech.SynthesizerPlayer');
var play = SynthesizerPlayer.createSynthesizerPlayer(main,'appid=53feacdd');
play.playText('水果',null,null);
iOS平台参考[http://ask.dcloud.net.cn/question/4175)(http://ask.dcloud.net.cn/question/4175)
收起阅读 »
app开发视频教程 - 用户注册、登录、微信登录(完全免费 精细讲解 欢迎 学习) 还有mui、h5+教程都是免费的 快来学习吧
《app开发教程-用户注册、登录、微信登录》视频教程已经更新完毕,涵盖了用户注册、登录、微信登录等相关知识点的详细讲解,欢迎观看学习!观看地址
http://www.hcoder.net/course

交流qq群 335126794 欢迎加入
《app开发教程-用户注册、登录、微信登录》视频教程已经更新完毕,涵盖了用户注册、登录、微信登录等相关知识点的详细讲解,欢迎观看学习!观看地址
http://www.hcoder.net/course
交流qq群 335126794 欢迎加入
收起阅读 »
分享一个多页面倒计时60秒防止刷新的按钮+沉浸式状态栏js
var DA = {
navStyle:function (color){//状态栏样式,参数(颜色),在ios7和android4.0以上有效
plus.navigator.setStatusBarBackground(color);
plus.navigator.setStatusBarStyle('UIStatusBarStyleBlackOpaque')
},
timeInit:function(btn_name){//初始化验证码按钮倒计时状态和设置当前页面的本地存储name
var countdown = localStorage.getItem(''+btn_name+'');
if(countdown == null||countdown == "0"){
$("#code_btn").html("获取验证码");
$("#code_btn").css({'background':'#48A2E0','disabled':false,'color':'#fff'});
localStorage.removeItem(''+btn_name+'');
}else if(countdown !== "0"){
$("#code_btn").css({'background':'#ccc','disabled':true,'color':'#5f5f5f'})
$("#code_btn").html("重新发送 ( " + countdown + " )");
this.timedown(''+btn_name+'');
}
},
timedown:function(btn_name){//倒计时定时器
var countdowns;
countdown = localStorage.getItem(''+btn_name+'');
if (countdown == '0') {
$("#code_btn").html("获取验证码");
$("#code_btn").css({'background':'#48A2E0','disabled':false,'color':'#fff'})
return clearTimeout();//清除定时,没有的话会导致后面每次减一越来越快
} else {
$("#code_btn").html("重新发送 ( " + countdown + " )");
$("#code_btn").css({'background':'#ccc','disabled':true,'color':'#5f5f5f'})
countdown = countdown - 1;
localStorage.setItem(''+btn_name+'',countdown);
}
setTimeout(function() {
DA.timedown(''+btn_name+'')
}, 1000);//定时每秒减一
},
settime:function (btn_name){//点击获取手机号码,判断手机号码,执行此函数
var phone = document.getElementById("phone");//判断是否是input,根据自己的逻辑来玩
if(phone.tagName.toLocaleLowerCase() == 'input'){
var check_phone_number = /^1[3458]\d{9}$/;
if (phone.value.length == '') {
DA.X_toast("手机号不能为空",'error.png',1000)
return;
}
if (phone.value.length != 11) {
DA.X_toast("请输入有效的手机号!",'error.png',1000)
return;
}
if (!phone.value.match(check_phone_number)) {
DA.X_toast("请输入有效的手机号",'error.png',1000)
return;
} else {
//短信发送,根据自己逻辑异步获取验证码
localStorage.setItem(''+btn_name+'','10');
this.timedown(''+btn_name+'');
}
}else{
//短信发送,根据自己逻辑异步获取验证码
localStorage.setItem(''+btn_name+'','10');
this.timedown(''+btn_name+'');
}
}
}
function plusReady(){
// 设置系统状态栏样式为浅色文字
DA.navStyle('#000000');
//localStorage.removeItem('LoginToken')//清除键值对
//localStorage.setItem('LoginToken','123456')//设置键值对
var LoginToken;
//console.log(LoginToken);
$('.content_divs').on('tap',function(){
LoginToken = localStorage.getItem("LoginToken");
var _self = $(this);
var url = _self.attr('data-url');
switch(url)
{
case 'Pay_record_head.html':
DA.open(url,'right');
break;
case 'my_assets_head.html':
DA.open(url,'right');
break;
default:
LoginToken == null?(url = 'login.html',DA.open(url,'right')):DA.open(url,'right');
}
})
}
if(window.plus){
plusReady();
}else{
document.addEventListener("plusready",plusReady,false);
}
var DA = {
navStyle:function (color){//状态栏样式,参数(颜色),在ios7和android4.0以上有效
plus.navigator.setStatusBarBackground(color);
plus.navigator.setStatusBarStyle('UIStatusBarStyleBlackOpaque')
},
timeInit:function(btn_name){//初始化验证码按钮倒计时状态和设置当前页面的本地存储name
var countdown = localStorage.getItem(''+btn_name+'');
if(countdown == null||countdown == "0"){
$("#code_btn").html("获取验证码");
$("#code_btn").css({'background':'#48A2E0','disabled':false,'color':'#fff'});
localStorage.removeItem(''+btn_name+'');
}else if(countdown !== "0"){
$("#code_btn").css({'background':'#ccc','disabled':true,'color':'#5f5f5f'})
$("#code_btn").html("重新发送 ( " + countdown + " )");
this.timedown(''+btn_name+'');
}
},
timedown:function(btn_name){//倒计时定时器
var countdowns;
countdown = localStorage.getItem(''+btn_name+'');
if (countdown == '0') {
$("#code_btn").html("获取验证码");
$("#code_btn").css({'background':'#48A2E0','disabled':false,'color':'#fff'})
return clearTimeout();//清除定时,没有的话会导致后面每次减一越来越快
} else {
$("#code_btn").html("重新发送 ( " + countdown + " )");
$("#code_btn").css({'background':'#ccc','disabled':true,'color':'#5f5f5f'})
countdown = countdown - 1;
localStorage.setItem(''+btn_name+'',countdown);
}
setTimeout(function() {
DA.timedown(''+btn_name+'')
}, 1000);//定时每秒减一
},
settime:function (btn_name){//点击获取手机号码,判断手机号码,执行此函数
var phone = document.getElementById("phone");//判断是否是input,根据自己的逻辑来玩
if(phone.tagName.toLocaleLowerCase() == 'input'){
var check_phone_number = /^1[3458]\d{9}$/;
if (phone.value.length == '') {
DA.X_toast("手机号不能为空",'error.png',1000)
return;
}
if (phone.value.length != 11) {
DA.X_toast("请输入有效的手机号!",'error.png',1000)
return;
}
if (!phone.value.match(check_phone_number)) {
DA.X_toast("请输入有效的手机号",'error.png',1000)
return;
} else {
//短信发送,根据自己逻辑异步获取验证码
localStorage.setItem(''+btn_name+'','10');
this.timedown(''+btn_name+'');
}
}else{
//短信发送,根据自己逻辑异步获取验证码
localStorage.setItem(''+btn_name+'','10');
this.timedown(''+btn_name+'');
}
}
}
function plusReady(){
// 设置系统状态栏样式为浅色文字
DA.navStyle('#000000');
//localStorage.removeItem('LoginToken')//清除键值对
//localStorage.setItem('LoginToken','123456')//设置键值对
var LoginToken;
//console.log(LoginToken);
$('.content_divs').on('tap',function(){
LoginToken = localStorage.getItem("LoginToken");
var _self = $(this);
var url = _self.attr('data-url');
switch(url)
{
case 'Pay_record_head.html':
DA.open(url,'right');
break;
case 'my_assets_head.html':
DA.open(url,'right');
break;
default:
LoginToken == null?(url = 'login.html',DA.open(url,'right')):DA.open(url,'right');
}
})
}
if(window.plus){
plusReady();
}else{
document.addEventListener("plusready",plusReady,false);
}
收起阅读 »

【示例】Android及iOS平台下视频全屏播放时自动横屏的实现
需求明确
视频全屏播放时,屏幕自动旋转为横屏。
此类功能,手机内置浏览器以及UC浏览器等,均有不同的实现。
若需要更多功能的定制,需自行扩展插件。
思路
首先,明确不同平台下的全屏事件,也就是所需监听的全屏变化的事件。
Android和iOS平台下,事件存在较大的差异。
其次,根据实际业务需求,对屏幕方向做出相应的调整。
此例中的处理方式为:
视频全屏,即锁定屏幕为横屏。
视频恢复,则解除屏幕方向的锁定。
具体实现
Android
1.常规处理
监听webkitfullscreenchange事件,并且读取全屏元素,对屏幕方向做出调整。
document.addEventListener('webkitfullscreenchange', function() {
var el = document.webkitFullscreenElement; //获取全屏元素
if(el) {
plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏
} else {
plus.screen.unlockOrientation(); //解除屏幕方向的锁定
}
});
2.WebviewStyles.videoFullscreen
HBuilder7.6.3.201612161809更新日志的App项中:
“Android平台优化视频全屏旋转效果,增加WebviewStyles.videoFullscreen控制”
意味着我们可以使用更加方便和性能更高的方法实现该功能
var self = plus.webview.currentWebview();
self.setStyle({
videoFullscreen: 'landscape'
});
iOS
监听video元素的webkitbeginfullscreen与webkitendfullscreen事件,在全屏开始和结束时,对屏幕方向做相应的调整。
// 监听的事件与Android平台有很大区别
videoElem.addEventListener('webkitbeginfullscreen', function() {
plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏
});
videoElem.addEventListener('webkitendfullscreen', function() {
// plus.screen.unlockOrientation(); //解除屏幕方向的锁定,但是不一定是竖屏;
plus.screen.lockOrientation('portrait'); //锁死屏幕方向为竖屏
});
相关API
设备屏幕信息
原生窗口设置参数的对象
HTML 5+ SDK 更新日志
涉及全屏播放并且需要打包成原生安装包的开发者请注意:
全屏播放涉及屏幕旋转,在iOS上实现此效果则需要在manifest.json中plus -> distribute -> orientation 节点配置应用支持的方向,默认是只支持竖屏正方向。
"orientation": [
"portrait-primary"
],/*应用支持的方向,portrait-primary:竖屏正方向;portrait-secondary:竖屏反方向;landscape-primary:横屏正方向;landscape-secondary:横屏反方向*/
源码
附上源码,解压后放在App工程中,运行即可。
需求明确
视频全屏播放时,屏幕自动旋转为横屏。
此类功能,手机内置浏览器以及UC浏览器等,均有不同的实现。
若需要更多功能的定制,需自行扩展插件。
思路
首先,明确不同平台下的全屏事件,也就是所需监听的全屏变化的事件。
Android和iOS平台下,事件存在较大的差异。
其次,根据实际业务需求,对屏幕方向做出相应的调整。
此例中的处理方式为:
视频全屏,即锁定屏幕为横屏。
视频恢复,则解除屏幕方向的锁定。
具体实现
Android
1.常规处理
监听webkitfullscreenchange事件,并且读取全屏元素,对屏幕方向做出调整。
document.addEventListener('webkitfullscreenchange', function() {
var el = document.webkitFullscreenElement; //获取全屏元素
if(el) {
plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏
} else {
plus.screen.unlockOrientation(); //解除屏幕方向的锁定
}
});
2.WebviewStyles.videoFullscreen
HBuilder7.6.3.201612161809更新日志的App项中:
“Android平台优化视频全屏旋转效果,增加WebviewStyles.videoFullscreen控制”
意味着我们可以使用更加方便和性能更高的方法实现该功能
var self = plus.webview.currentWebview();
self.setStyle({
videoFullscreen: 'landscape'
});
iOS
监听video元素的webkitbeginfullscreen与webkitendfullscreen事件,在全屏开始和结束时,对屏幕方向做相应的调整。
// 监听的事件与Android平台有很大区别
videoElem.addEventListener('webkitbeginfullscreen', function() {
plus.screen.lockOrientation('landscape'); //锁死屏幕方向为横屏
});
videoElem.addEventListener('webkitendfullscreen', function() {
// plus.screen.unlockOrientation(); //解除屏幕方向的锁定,但是不一定是竖屏;
plus.screen.lockOrientation('portrait'); //锁死屏幕方向为竖屏
});
相关API
设备屏幕信息
原生窗口设置参数的对象
HTML 5+ SDK 更新日志
涉及全屏播放并且需要打包成原生安装包的开发者请注意:
全屏播放涉及屏幕旋转,在iOS上实现此效果则需要在manifest.json中plus -> distribute -> orientation 节点配置应用支持的方向,默认是只支持竖屏正方向。
"orientation": [
"portrait-primary"
],/*应用支持的方向,portrait-primary:竖屏正方向;portrait-secondary:竖屏反方向;landscape-primary:横屏正方向;landscape-secondary:横屏反方向*/
源码
附上源码,解压后放在App工程中,运行即可。
收起阅读 »
app开发实战 - 《用户注册、登录》视频教程发布!
app开发实战视频教程 - 《用户注册、登录》视频教程已经发布,持续更新(本周内完结)。完结后发布第三方登录教程。
教程完全免费!观看地址
http://www.hcoder.net/course
还有mui、h5+、新闻客户端实战教程 都在这个页面上,欢迎观看!
app开发实战视频教程 - 《用户注册、登录》视频教程已经发布,持续更新(本周内完结)。完结后发布第三方登录教程。
教程完全免费!观看地址
http://www.hcoder.net/course
还有mui、h5+、新闻客户端实战教程 都在这个页面上,欢迎观看!
收起阅读 »