
关于mui.ajax的设置,以及php取不到data值的问题的方法
代码小白,好不容易做到ajax这一步,又遇到坑了。
找了n多网站,也参考了论坛里面的文章。
最开始完全按照官方的demo来,直接报失败,如下:
[LOG] : SyntaxError: JSON Parse error: Unrecognized token '<'
取消json格式限制后,发现这个'<'token错误是来源于php错误报告的html标签。报告内容就是$post['username']找不到username,也就是说:
我发送的data格式和php获取的格式不一致。
经过无数次的撞墙实验后,发现这样成功了:
mui.ajax('http://server-name/login.php',{
data:{
username:'username',
password:'password'
},
dataType:'json',//服务器返回json格式数据
type:'post',//HTTP请求类型
timeout:10000,//超时时间设置为10秒;
crossDomain: true,
success:function(data){
//服务器返回响应,根据响应结果,分析是否登录成功;
...
},
error:function(xhr,type,errorThrown){
//异常处理;
console.log(type);
}
});
想想看既然data不认识,很可能header也不认识,
那就删掉header这一项吧,有这个header,怎么写怎么错 (不知道是我学艺不精,还是bug?)。然后写在php里:
<?php
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST,GET');
header('Access-Control-Allow-Credentials:true');
header("Content-Type: application/json;charset=utf-8");
//下面该怎么写怎么写
这样php就能读取到data并且 app能顺利的获取php的返回值了。
代码小白,好不容易做到ajax这一步,又遇到坑了。
找了n多网站,也参考了论坛里面的文章。
最开始完全按照官方的demo来,直接报失败,如下:
[LOG] : SyntaxError: JSON Parse error: Unrecognized token '<'
取消json格式限制后,发现这个'<'token错误是来源于php错误报告的html标签。报告内容就是$post['username']找不到username,也就是说:
我发送的data格式和php获取的格式不一致。
经过无数次的撞墙实验后,发现这样成功了:
mui.ajax('http://server-name/login.php',{
data:{
username:'username',
password:'password'
},
dataType:'json',//服务器返回json格式数据
type:'post',//HTTP请求类型
timeout:10000,//超时时间设置为10秒;
crossDomain: true,
success:function(data){
//服务器返回响应,根据响应结果,分析是否登录成功;
...
},
error:function(xhr,type,errorThrown){
//异常处理;
console.log(type);
}
});
想想看既然data不认识,很可能header也不认识,
那就删掉header这一项吧,有这个header,怎么写怎么错 (不知道是我学艺不精,还是bug?)。然后写在php里:
<?php
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST,GET');
header('Access-Control-Allow-Credentials:true');
header("Content-Type: application/json;charset=utf-8");
//下面该怎么写怎么写
这样php就能读取到data并且 app能顺利的获取php的返回值了。
收起阅读 »
HBuilder编写代码中大量的词组都没有自动提示,比如 mysqli
今天第一次下载HBuilder代码编辑器发现,这么强大的编辑器连 mysql。。。这样的很基础的语句都无法自动提示出来,别的编辑器,只需要输入my 后面都提示出来了,是我设置不对吗? 但是 像echo这样的词组可以提示出来,输入ec就可以了
今天第一次下载HBuilder代码编辑器发现,这么强大的编辑器连 mysql。。。这样的很基础的语句都无法自动提示出来,别的编辑器,只需要输入my 后面都提示出来了,是我设置不对吗? 但是 像echo这样的词组可以提示出来,输入ec就可以了

jsHint详解
jshint是一个javaScript语法和风格的检查工具,但检查不出逻辑问题。
安装
一、在sublime text 中使用jshint插件步骤:
(注:在为Sublime Text编辑器安装Sublime-JSHint插件之前,要首先确保安装了node.js)
方法1:
1 Ctrl+Shift+P 呼出Sublime命令面板
2 键入install,并选择Package Control:Install Package
3 键入js gutter,并选择JSHint Gutter
方法2:
1 获取Sublime Text,可通过git命令。
git clone https://github.com/victorporof/Sublime-JSHint.git
2 打开 Sublime Text Package 文件夹。Preferences -> Browse Packages。
3 将步骤1中获取到的 Sublime-JSHint 文件夹移到 Packages 文件夹中。
4 重启 Sublime Text。
Sublime-JSHint使用
方法1:由菜单 Tools -> Command Palette(或快捷键 Ctrl+Shift+P)打开命令面板。键入 jshint 并选择 JSHint。
方法2:打开一 js 文件,并打开控制台(View -> Show Console),在控制台中键入 view.run_command("jshint")。
方法3:Ctrl+Shift+J(或者Mac使用Cmd+Shift+J)
方法4:右键选择JSHint
设置
"lint_on_edit": false,
// Configurable duration before re-linting.
"lint_on_edit_timeout": 5,
// Automatically lint when a file is loaded.
"lint_on_load": false,
// Automatically lint when a file is saved.
"lint_on_save": false,
// Highlight problematic regions when selected.
"highlight_selected_regions": false,
// Log the settings passed to JSHint from .jshintrc
.
"print_diagnostics": true
配置选项
"strict": true, //严格模式 参考文章(http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html)
"asi": true, //允许省略分号(写上这条,规避检查出很多警告 可以去掉)
"bitwise": true, //禁止使用位运算符,比如经常把&&写错& 规避此错误
"noarg": true, //禁止使用.caller 和 .callee (ECMS5已经禁用了此 可以去掉)
"eqeqeq": true, //禁止使用== 和 != 强制使用=== 和 !==
"undef": true, //禁止使用不在全局变量列表中的未定义变量
"curly": true, //循环或者条件语句必须使用花括号包住
"devel": true, //定义用于调试的全局变量:console,alert
"jquery": true, //定义全局暴露的jQuery库 (可以去掉)
"browser": true, //暴露浏览器属性的全局变量 如window document
"evil": true, //禁止使用eval (可以去掉)
"quotemark":true (商榷)
"globals": {"$":true,"require":true,"FastClick":true,"Swiper"},
编辑器 VS Gulp_jshint
1 个人偏向于在编辑器中使用jshint,这样不用在每个项目都配置,同时也能约束项目之外的编辑。
2 在编辑器中使用jshint 比在Gulp_jshint 的更实时,更清晰。jshint有错误,会在每一行有提示。而后者会在命令窗口提示,不方便。
3 Gulp_jshint 还需要进一步探查。
项目中一些问题
无法识别的一些问题:
1 //= require chartjs/chart.core (解决掉了)
2 封闭空间上面的(未解决);
3 引入插件的实例化:comRadar = new Chart(ctx).Radar()(解决掉了);
//配置参数
"globals": {"$":true,"require":true,"FastClick":true,"Swiper"},
4 var CardPopup = function(el, opts) {
this.el = el;
this.defaults = {};
this.options = $.extend({}, this.defaults, opts);
} (此处加封号)
CardPopup.prototype = {
init: function() {
var me = this,
el = me.el;
return me;
},
} (此处加封号)
$.fn.CardPopup = function(opts) {
var com;
} (此处加封号)
5 A && B
//要么写成 if(A) B
//或者 / jshint expr: true /
6 jshint 中希望 A.B 而不希望A[B]
7 / jshint ignore:start /
var optionTemplate = Hogan.compile('<ul class="items options clearfix count-{{count}}">\
{{#options}}\
<li class="item option {{#selected}}selected{{/selected}}">\
<div class="pie">\
<canvas class="canvas-outer" data-percent="{{value}}"></canvas>\
<div class="num">{{value}}%</div>\
</div>\
<p class="text">{{text}}</p>\
</li>\
{{/options}}\
</ul>');
/ jshint ignore:end /
8 /jshint scripturl:true/
data.top[i].redirect_url = data.top[i].redirect_url || 'javascript:void(0);';
9 $(subscribeData).each(function(index, element) {
if (element == specialColumnId) {
elSubscribe.removeClass('icon-jiadingyue').addClass('icon-yidingyue');
}
}) (是否加)
10
/jshint -W018 /
if (!!elForm.find('[name="comment[parent_id]"]').val() == true) {
isReplyComment = true;
}
日记本
來源:http://www.jianshu.com/p/9c26c61da146
jshint是一个javaScript语法和风格的检查工具,但检查不出逻辑问题。
安装
一、在sublime text 中使用jshint插件步骤:
(注:在为Sublime Text编辑器安装Sublime-JSHint插件之前,要首先确保安装了node.js)
方法1:
1 Ctrl+Shift+P 呼出Sublime命令面板
2 键入install,并选择Package Control:Install Package
3 键入js gutter,并选择JSHint Gutter
方法2:
1 获取Sublime Text,可通过git命令。
git clone https://github.com/victorporof/Sublime-JSHint.git
2 打开 Sublime Text Package 文件夹。Preferences -> Browse Packages。
3 将步骤1中获取到的 Sublime-JSHint 文件夹移到 Packages 文件夹中。
4 重启 Sublime Text。
Sublime-JSHint使用
方法1:由菜单 Tools -> Command Palette(或快捷键 Ctrl+Shift+P)打开命令面板。键入 jshint 并选择 JSHint。
方法2:打开一 js 文件,并打开控制台(View -> Show Console),在控制台中键入 view.run_command("jshint")。
方法3:Ctrl+Shift+J(或者Mac使用Cmd+Shift+J)
方法4:右键选择JSHint
设置
"lint_on_edit": false,
// Configurable duration before re-linting.
"lint_on_edit_timeout": 5,
// Automatically lint when a file is loaded.
"lint_on_load": false,
// Automatically lint when a file is saved.
"lint_on_save": false,
// Highlight problematic regions when selected.
"highlight_selected_regions": false,
// Log the settings passed to JSHint from .jshintrc
.
"print_diagnostics": true
配置选项
"strict": true, //严格模式 参考文章(http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html)
"asi": true, //允许省略分号(写上这条,规避检查出很多警告 可以去掉)
"bitwise": true, //禁止使用位运算符,比如经常把&&写错& 规避此错误
"noarg": true, //禁止使用.caller 和 .callee (ECMS5已经禁用了此 可以去掉)
"eqeqeq": true, //禁止使用== 和 != 强制使用=== 和 !==
"undef": true, //禁止使用不在全局变量列表中的未定义变量
"curly": true, //循环或者条件语句必须使用花括号包住
"devel": true, //定义用于调试的全局变量:console,alert
"jquery": true, //定义全局暴露的jQuery库 (可以去掉)
"browser": true, //暴露浏览器属性的全局变量 如window document
"evil": true, //禁止使用eval (可以去掉)
"quotemark":true (商榷)
"globals": {"$":true,"require":true,"FastClick":true,"Swiper"},
编辑器 VS Gulp_jshint
1 个人偏向于在编辑器中使用jshint,这样不用在每个项目都配置,同时也能约束项目之外的编辑。
2 在编辑器中使用jshint 比在Gulp_jshint 的更实时,更清晰。jshint有错误,会在每一行有提示。而后者会在命令窗口提示,不方便。
3 Gulp_jshint 还需要进一步探查。
项目中一些问题
无法识别的一些问题:
1 //= require chartjs/chart.core (解决掉了)
2 封闭空间上面的(未解决);
3 引入插件的实例化:comRadar = new Chart(ctx).Radar()(解决掉了);
//配置参数
"globals": {"$":true,"require":true,"FastClick":true,"Swiper"},
4 var CardPopup = function(el, opts) {
this.el = el;
this.defaults = {};
this.options = $.extend({}, this.defaults, opts);
} (此处加封号)
CardPopup.prototype = {
init: function() {
var me = this,
el = me.el;
return me;
},
} (此处加封号)
$.fn.CardPopup = function(opts) {
var com;
} (此处加封号)
5 A && B
//要么写成 if(A) B
//或者 / jshint expr: true /
6 jshint 中希望 A.B 而不希望A[B]
7 / jshint ignore:start /
var optionTemplate = Hogan.compile('<ul class="items options clearfix count-{{count}}">\
{{#options}}\
<li class="item option {{#selected}}selected{{/selected}}">\
<div class="pie">\
<canvas class="canvas-outer" data-percent="{{value}}"></canvas>\
<div class="num">{{value}}%</div>\
</div>\
<p class="text">{{text}}</p>\
</li>\
{{/options}}\
</ul>');
/ jshint ignore:end /
8 /jshint scripturl:true/
data.top[i].redirect_url = data.top[i].redirect_url || 'javascript:void(0);';
9 $(subscribeData).each(function(index, element) {
if (element == specialColumnId) {
elSubscribe.removeClass('icon-jiadingyue').addClass('icon-yidingyue');
}
}) (是否加)
10
/jshint -W018 /
if (!!elForm.find('[name="comment[parent_id]"]').val() == true) {
isReplyComment = true;
}
日记本
來源:http://www.jianshu.com/p/9c26c61da146
收起阅读 »
怎么解决tomcat占用8080端口问题图文教程
怎么解决tomcat占用8080端口问题
相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现
Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.The server may already be
running in another process, or a system process may be using the port. To start this server you will need to stop the other
process or change the port number(s).
是不是很多人教你重启电脑呢,下面教大家一个不用重启计算机 的方法。

此方法也可以解决,windows上如何结束进程的详细过程,下面附详细,图文说明
在dos下,输入 netstat -ano|findstr 8080
//说明:查看占用8080端口的进程
显示占用端口的进程
taskkill /pid 6856 /f
//说明,运行windows自带taskkill命令,将上面显示的进程号,结束掉。
下面有图为证
怎么解决tomcat占用8080端口问题图文教程,到此结束,希望对大家有所帮助。祝大家,工作愉快,
不用重启计算机了,次方法也可以解决其他类似问题,在编程当中对大家的困扰。
怎么解决tomcat占用8080端口问题
相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现
Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.The server may already be
running in another process, or a system process may be using the port. To start this server you will need to stop the other
process or change the port number(s).
是不是很多人教你重启电脑呢,下面教大家一个不用重启计算机 的方法。
此方法也可以解决,windows上如何结束进程的详细过程,下面附详细,图文说明
在dos下,输入 netstat -ano|findstr 8080
//说明:查看占用8080端口的进程
显示占用端口的进程
taskkill /pid 6856 /f
//说明,运行windows自带taskkill命令,将上面显示的进程号,结束掉。
下面有图为证
怎么解决tomcat占用8080端口问题图文教程,到此结束,希望对大家有所帮助。祝大家,工作愉快,
不用重启计算机了,次方法也可以解决其他类似问题,在编程当中对大家的困扰。

详解做沉浸式状态栏遇到的坑
因为项目首页顶部是一张图片,不做沉浸式实在难看,搜索很多资料,最终解决。
本来打算只在首页用沉浸式,可惜查阅资料后不能单独设置,因为这个是系统(还是应用)级别的
下面说下如何做沉浸式:
1:
开启沉浸式状态栏
manifest.json->plus节点下
"statusbar": {
"immersed": true //开启沉浸式状态栏
}
开启后页面header会顶到系统状态栏,导致页首标题非常难看,所以要做第二步
2:
引入 HelloH5应用中的“js/immersed.js”
如果用官方提供的例子,需要自己手动在每个页面添加两个ID
示例:
<header class="mui-bar mui-bar-nav nav-bg" id="header">
<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
<h1 class="mui-title">团队报表</h1>
</header>
<div class="mui-content" id="content">
</div>
我根据需求把官方的immersed.js 简单修改了下
示例:
(function(w){
document.addEventListener('plusready',function(){
},false);
var immersed = 0;
var ms=(/Html5Plus\/.+\s(.(Immersed\/(\d+.?\d).*))/gi).exec(navigator.userAgent);
if(ms&&ms.length>=3){//如果支持沉浸式
immersed=parseInt(ms[2]);//系统状态栏高度
}
w.immersed=immersed;
if(!immersed){
return;//如果不支持则返回,不执行下面操作
}
var t=document.getElementById('header');//获得头部标签
t&&(t.style.paddingTop=immersed+'px',t.style.height=t.offsetHeight+immersed+'px');//改变头部的内边距,以及改变头部的高度
t=document.getElementById('content');//获得主体标签
t&&(t.style.marginTop=immersed+'px');//调整主体距离header的外边距(如果只改变头部不执行这行代码会遮盖主体内容)
})(window);
如果需要看官方原版的js 可以查找HelloH5+应用中的“js/immersed.js”
一般来说用我提供的js足矣,如果还有特殊的需求自己dry
总结:第一步 main.json里开启沉浸式 第二步 在错位的页面,引入js 并且设置两个ID即可
本人才疏学浅,初入hbuilder,内容格式编辑的不好,或许还有更好的方案,将就看吧。。
附官方帖子内容:
http://ask.dcloud.net.cn/article/422 如何动态兼容沉浸式应用
http://ask.dcloud.net.cn/article/12622 html5plus应用实现沉浸式状态栏
最后闲话两句:鄙视一下那些在论坛提出问题,最后解决了之后只回复一句解决了,评论底部坛友也遇到同样的问题,在问楼主怎么解决的就没回复了,真心觉得这种人多了,论坛气氛很差。
因为项目首页顶部是一张图片,不做沉浸式实在难看,搜索很多资料,最终解决。
本来打算只在首页用沉浸式,可惜查阅资料后不能单独设置,因为这个是系统(还是应用)级别的
下面说下如何做沉浸式:
1:
开启沉浸式状态栏
manifest.json->plus节点下
"statusbar": {
"immersed": true //开启沉浸式状态栏
}
开启后页面header会顶到系统状态栏,导致页首标题非常难看,所以要做第二步
2:
引入 HelloH5应用中的“js/immersed.js”
如果用官方提供的例子,需要自己手动在每个页面添加两个ID
示例:
<header class="mui-bar mui-bar-nav nav-bg" id="header">
<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
<h1 class="mui-title">团队报表</h1>
</header>
<div class="mui-content" id="content">
</div>
我根据需求把官方的immersed.js 简单修改了下
示例:
(function(w){
document.addEventListener('plusready',function(){
},false);
var immersed = 0;
var ms=(/Html5Plus\/.+\s(.(Immersed\/(\d+.?\d).*))/gi).exec(navigator.userAgent);
if(ms&&ms.length>=3){//如果支持沉浸式
immersed=parseInt(ms[2]);//系统状态栏高度
}
w.immersed=immersed;
if(!immersed){
return;//如果不支持则返回,不执行下面操作
}
var t=document.getElementById('header');//获得头部标签
t&&(t.style.paddingTop=immersed+'px',t.style.height=t.offsetHeight+immersed+'px');//改变头部的内边距,以及改变头部的高度
t=document.getElementById('content');//获得主体标签
t&&(t.style.marginTop=immersed+'px');//调整主体距离header的外边距(如果只改变头部不执行这行代码会遮盖主体内容)
})(window);
如果需要看官方原版的js 可以查找HelloH5+应用中的“js/immersed.js”
一般来说用我提供的js足矣,如果还有特殊的需求自己dry
总结:第一步 main.json里开启沉浸式 第二步 在错位的页面,引入js 并且设置两个ID即可
本人才疏学浅,初入hbuilder,内容格式编辑的不好,或许还有更好的方案,将就看吧。。
附官方帖子内容:
http://ask.dcloud.net.cn/article/422 如何动态兼容沉浸式应用
http://ask.dcloud.net.cn/article/12622 html5plus应用实现沉浸式状态栏
最后闲话两句:鄙视一下那些在论坛提出问题,最后解决了之后只回复一句解决了,评论底部坛友也遇到同样的问题,在问楼主怎么解决的就没回复了,真心觉得这种人多了,论坛气氛很差。
收起阅读 »
iOS 上传App Store 报 ITMS-90096错误处理方法
近期有用户在使用云打包上传appstore时,apploader会报如下错误,
ERROR ITMS-90096: "Your binary is not optimized for iPhone 5 - New iPhone apps and app updates submitted must support the 4-inch display on iPhone 5 and must include a launch image referenced in the Info.plist under UILaunchImages with a UILaunchImageSize value set to {320, 568}. Launch images must be PNG files and located at the top-level of your bundle, or provided within each .lproj folder if you localize your launch images. Learn more about iPhone 5 support and app launch images by reviewing the 'iOS Human Interface Guidelines' at https://developer.apple.com/ios/human-interface-guidelines/graphics/launch-screen
解决方法如下,
请根据HBuilder里manifest.json的启动图片设置页面里提示的尺寸重设应用的启动图片,
注意
1 请严格按照提示的尺寸设置需要支持设备的启动图片
2 图片必须是png格式,其他格式图片修改后缀名也会报错
近期有用户在使用云打包上传appstore时,apploader会报如下错误,
ERROR ITMS-90096: "Your binary is not optimized for iPhone 5 - New iPhone apps and app updates submitted must support the 4-inch display on iPhone 5 and must include a launch image referenced in the Info.plist under UILaunchImages with a UILaunchImageSize value set to {320, 568}. Launch images must be PNG files and located at the top-level of your bundle, or provided within each .lproj folder if you localize your launch images. Learn more about iPhone 5 support and app launch images by reviewing the 'iOS Human Interface Guidelines' at https://developer.apple.com/ios/human-interface-guidelines/graphics/launch-screen
解决方法如下,
请根据HBuilder里manifest.json的启动图片设置页面里提示的尺寸重设应用的启动图片,
注意
1 请严格按照提示的尺寸设置需要支持设备的启动图片
2 图片必须是png格式,其他格式图片修改后缀名也会报错

完美解决ios网络音频播放问题,解决音频自动播放问题,解决网络音频自动播放问题
潘顺昌 2017-12-13
```javascript
受到ios中的提示
iOS - 4.3+ (支持): 支持"aac"、"aiff"、"mp3"、"mid"、"wav"、"amr"等格式文件。 暂不支持播放网络路径音频。
那么就是说播放本地视频是可以的,因此只要把音频下载到ios不就行了么?哈哈,微信里不是很多文件都保存在本地么,说干就干
代码如下:
```javascript
/**
* 下载mp3文件到本地
* @mp3Id id
* @loadUrl 网络路径
* @relativePath 自己存储的相对路径
*/
function downloadMp3toLocalByUrl(mp3Id,loadUrl,relativePath)
{
/*联网下载mp3*/
//创建下载任务
var dtask = plus.downloader.createDownload(loadUrl, {}, function(d, status) {
if (status == 200) {
//下载成功并播放音频
console.log("下载成功");
var mp3src = getImgFromLocal(mp3Id, d.filename);
if ( plus.audio == undefined ) {
mui.toast( "音频播放器加载失败." );
}
console.log("mp3 download dir="+mp3src+",mp3="+d.filename);
p = plus.audio.createPlayer(d.filename);
p.play( function () {
p.stop();//播放完停止
console.log( "Audio play success!" );
}, function ( e ) {
console.log( "Audio play error: " + e.message );
} );
}
else
{
//下载失败,需删除本地临时文件,否则下次进来时会检查到图片已存在
console.log("下载失败status=" + status+"=="+relativePath);
//dtask.abort();//文档描述:取消下载,删除临时文件;(但经测试临时文件没有删除,故使用delFile()方法删除);
if (relativePath!=null)
{
delFile(relativePath);
}
}
});
//启动下载任务
dtask.start();
}
/*删除指定文件*/
function delFile(relativePath) {
plus.io.resolveLocalFileSystemURL(relativePath, function(entry) {
entry.remove(function(entry) {
console.log("文件删除成功==" + relativePath);
}, function(e) {
console.log("文件删除失败=" + relativePath);
});
});
}
/*获取本地mp3文件最终路径完整地址
* mp3Id mp3文件id
* relativePath 本地相对路径 例如:"_downloads/demo.mp3"
*/
function getImgFromLocal(mp3Id, relativePath) {
//本地相对路径("_downloads/logo.jpg")转成SD卡绝对路径("/storage/emulated/0/Android/data/io.dcloud.HBuilder/.HBuilder/downloads/logo.jpg");
var sd_path = plus.io.convertLocalFileSystemURL(relativePath);
//返回路径全地址
return sd_path;
}
测试代码如下:
startPlay("http://bos.nj.bpc.baidu.com/v1/developer/73bbf22c-7511-4e87-bdc8-d8d0b5b0c47e.mp3");
潘顺昌 2017-12-13
```javascript
受到ios中的提示
iOS - 4.3+ (支持): 支持"aac"、"aiff"、"mp3"、"mid"、"wav"、"amr"等格式文件。 暂不支持播放网络路径音频。
那么就是说播放本地视频是可以的,因此只要把音频下载到ios不就行了么?哈哈,微信里不是很多文件都保存在本地么,说干就干
代码如下:
```javascript
/**
* 下载mp3文件到本地
* @mp3Id id
* @loadUrl 网络路径
* @relativePath 自己存储的相对路径
*/
function downloadMp3toLocalByUrl(mp3Id,loadUrl,relativePath)
{
/*联网下载mp3*/
//创建下载任务
var dtask = plus.downloader.createDownload(loadUrl, {}, function(d, status) {
if (status == 200) {
//下载成功并播放音频
console.log("下载成功");
var mp3src = getImgFromLocal(mp3Id, d.filename);
if ( plus.audio == undefined ) {
mui.toast( "音频播放器加载失败." );
}
console.log("mp3 download dir="+mp3src+",mp3="+d.filename);
p = plus.audio.createPlayer(d.filename);
p.play( function () {
p.stop();//播放完停止
console.log( "Audio play success!" );
}, function ( e ) {
console.log( "Audio play error: " + e.message );
} );
}
else
{
//下载失败,需删除本地临时文件,否则下次进来时会检查到图片已存在
console.log("下载失败status=" + status+"=="+relativePath);
//dtask.abort();//文档描述:取消下载,删除临时文件;(但经测试临时文件没有删除,故使用delFile()方法删除);
if (relativePath!=null)
{
delFile(relativePath);
}
}
});
//启动下载任务
dtask.start();
}
/*删除指定文件*/
function delFile(relativePath) {
plus.io.resolveLocalFileSystemURL(relativePath, function(entry) {
entry.remove(function(entry) {
console.log("文件删除成功==" + relativePath);
}, function(e) {
console.log("文件删除失败=" + relativePath);
});
});
}
/*获取本地mp3文件最终路径完整地址
* mp3Id mp3文件id
* relativePath 本地相对路径 例如:"_downloads/demo.mp3"
*/
function getImgFromLocal(mp3Id, relativePath) {
//本地相对路径("_downloads/logo.jpg")转成SD卡绝对路径("/storage/emulated/0/Android/data/io.dcloud.HBuilder/.HBuilder/downloads/logo.jpg");
var sd_path = plus.io.convertLocalFileSystemURL(relativePath);
//返回路径全地址
return sd_path;
}
测试代码如下:
startPlay("http://bos.nj.bpc.baidu.com/v1/developer/73bbf22c-7511-4e87-bdc8-d8d0b5b0c47e.mp3");

【示例】iphonex顶部安全区域适配
在iphoneX上,由于安全区域的存在,窗口顶部的一部分内容会被遮挡。
下面给出5+App的一些适配方案
native处理
配置titleNView
webview配置了titleNView,那么native层会自动调整系统状态栏区域的内容。
无titleNView
webview如果没有配置titleNView,则可以选择补充statusbar的配置。同样,native层会处理状态栏以及安全区域。
注意:以上两种方案,均是交给native层来处理状态栏部分的高度,与一般的沉浸式应用适配是一致的。参考文档 html5plus应用实现沉浸式状态栏
另外,首页比较特殊,需要在manifest.json中配置。
不依赖native
参考网上分享的 iPhone X的缺口和CSS 方案,做了一个简单的示例,效果见图。
示例
head部分
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover" />
css部分
.main {
background-color: #ff0000;
padding-top: 20px;
padding-top: constant(safe-area-inset-top);
}
.mui-bar.mui-bar-nav {
background-color: #ff0000;
box-shadow: none;
top: 20px;
top: constant(safe-area-inset-top);
}
.mui-bar.mui-bar-nav .mui-title {
color: #FFFFFF;
}
大致思路
- 内容区域 .main,设置 padding-top 让出系统状态栏的高度
- 固顶的 header 部分同样设置 top 值,让出状态栏的高度
- viewport 的 content 中,添加 viewport-fit=cover
- 让出高度的元素,使用css的contant()方法,适配top方向的高度
更多方案
感谢 @瞳player 在一早就提供的分享 xcode9 ios11 沉浸式状态栏适配
关于iphoneX的适配,网上已经有了各种方案,如果大家有更好的方案欢迎分享。
示例的源码,见附件。
在iphoneX上,由于安全区域的存在,窗口顶部的一部分内容会被遮挡。
下面给出5+App的一些适配方案
native处理
配置titleNView
webview配置了titleNView,那么native层会自动调整系统状态栏区域的内容。
无titleNView
webview如果没有配置titleNView,则可以选择补充statusbar的配置。同样,native层会处理状态栏以及安全区域。
注意:以上两种方案,均是交给native层来处理状态栏部分的高度,与一般的沉浸式应用适配是一致的。参考文档 html5plus应用实现沉浸式状态栏
另外,首页比较特殊,需要在manifest.json中配置。
不依赖native
参考网上分享的 iPhone X的缺口和CSS 方案,做了一个简单的示例,效果见图。
示例
head部分
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover" />
css部分
.main {
background-color: #ff0000;
padding-top: 20px;
padding-top: constant(safe-area-inset-top);
}
.mui-bar.mui-bar-nav {
background-color: #ff0000;
box-shadow: none;
top: 20px;
top: constant(safe-area-inset-top);
}
.mui-bar.mui-bar-nav .mui-title {
color: #FFFFFF;
}
大致思路
- 内容区域 .main,设置 padding-top 让出系统状态栏的高度
- 固顶的 header 部分同样设置 top 值,让出状态栏的高度
- viewport 的 content 中,添加 viewport-fit=cover
- 让出高度的元素,使用css的contant()方法,适配top方向的高度
更多方案
感谢 @瞳player 在一早就提供的分享 xcode9 ios11 沉浸式状态栏适配
关于iphoneX的适配,网上已经有了各种方案,如果大家有更好的方案欢迎分享。
示例的源码,见附件。

XMLHttpRequest 发送 post 请求,php 接收不到数据的解决方案
.
说明
这是我入门 DC(DCloud)遇到的第一个比较正式的问题。
我是一名前端开发者,同时也会点世界最好的编程语言 php(开个玩笑,别动手)。
当然 php 只是作为我的辅助技能,方便自己调试用,当然在与后台配合做项目时也会得心应手,所以,在入门学习 XMLHttpRequest 自己调试的时候,发现 php 接收不到 post 请求的参数,然后就在问答社区和度娘找原因,几经周折,完美的解决了这个问题。
.
php 接收不到数据的根本原因是什么?
前端发送数据的 "编码方式" 与后台接收数据的 "解码方式" 不同。
这里说的编码与解码对应的是请求头 header 中的 Content-Type 字段。
Content-Type 的主要方式:
- text/xml (xml 数据格式)
- text/html (html 数据格式)
- text/plain (无格式字符串数据格式)
- multipart/form-data (上传文件)
- application/json (json 数据格式)
- application/x-www-form-urlencoded (序列化数据 / url 查询地址,比如 name=Eric&password=123456)
- …
.
第一个、第二个,因为我至今没接触过,不敢多言。
第三个,无格式字符串数据格式,就是很普通的字符串。
第四个,是 form 表单上传文件时用的,这里暂时也不讨论这个。
第五个和第六个,是我要具体要讨论的。
PS:这个月的膝盖献给这位大神:四种常见的 POST 提交数据方式
.
方案一:Content-Type: "application/json"
首先,我们先看下,XMLHttpRequest 请求头的默认编码方式是什么。
JS 部分
var xhr = new plus.net.XMLHttpRequest();
xhr.onreadystatechange = function()
{
if( xhr.readyState==4 && xhr.status==200 )
{
console.log(xhr.responseText);
}
}
var json = {
name: "Eric",
password: "123456"
};
xhr.open("POST","http://www.xxx.com/api.php");
xhr.send(JSON.stringify(json)); // post 数据只能是字符串
PHP 部分
<?php
// 返回请求头的编码方式和 name 的值
$header = $_SERVER["CONTENT_TYPE"];
$name = $_POST["name"];
echo '{"header":"'.$header.'","name":"'.$name.'"}';
?>
返回结果:{"header":"text/plain;charset=utf-8","name":""}
很显然,$_POST["name"] 没有取到数据。
后来,我看到了这篇文章:Mui v3.2.0中ajax设置headers为{'Content-Type': 'application/json'}发起post请求,后端接收不到数据的解决方案(php为例) 。
虽然他说的是 mui.ajax 方式,但是思路都是一样的,然后,我修改了下代码。
JS 部分
var xhr = new plus.net.XMLHttpRequest();
xhr.onreadystatechange = function()
{
if( xhr.readyState==4 && xhr.status==200 )
{
console.log(xhr.responseText);
}
}
var json = {
name: "Eric",
password: "123456"
};
xhr.open("POST","http://www.xxx.com/api.php");
xhr.setRequestHeader("Content-Type","application/json;charset=utf-8");
xhr.send(JSON.stringify(json)); // post 数据只能是字符串
PHP 部分
<?php
// 返回请求头的编码方式和 name 的值
$input = file_get_contents('php://input');
$object = json_decode($input);
$name = $object->name;
echo '{"header":"'.$_SERVER["CONTENT_TYPE"].'","name":"'.$name.'"}';
?>
返回结果:{"header":"application/json;charset=utf-8","name":"Eric"}
很显然,数据已经接收到,这种方案确实有效。
虽然确实能解决问题,但我最终没有采用的原因是:
①. 不够直接,它不是通过 $_POST[] 方式获取的数据,后台需要对数据进行解析,无形中增加了工作量
②. 旧项目迁移不友好,如果旧项目之前采用的是 $_POST[] 方式,后台接口改动会很大
.
方案二:Content-Type: "application/x-www-form-urlencoded"
首先,后台(php)使用 $_POST[] 获取数据,需要满足两个条件:
- 设置请求头,Content-Type: "application/x-www-form-urlencoded"
- 请求数据必须序列化,比如,name=Eric&password=123456
直接上代码:
JS 部分
var xhr = new plus.net.XMLHttpRequest();
xhr.onreadystatechange = function()
{
if( xhr.readyState==4 && xhr.status==200 )
{
console.log(xhr.responseText);
}
}
xhr.open("POST","http://www.xxx.com/api.php");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
xhr.send("name=Eric&password=123456");
PHP 部分
<?php
$header = $_SERVER["CONTENT_TYPE"];
$name = $_POST["name"];
echo '{"header":"'.$header.'","name":"'.$name.'"}';
?>
返回结果:{"header":"application/x-www-form-urlencoded;charset=utf-8","name":"Eric"}
至此,问题已解决,而且不需要后台程序的特殊处理。
但是,现在的方案却不完善,因为大部分情况,我们发送的 POST 请求数据是 JSON 对象,这时候 PHP 仍然获取不到数据,此时的我,脑海中响起了《西游记》的一首歌:刚翻过了几座山,又越过了几条河,崎岖坎坷怎么它就这么多 。。
后来,我问了下度娘,它告诉我,只需要一行代码就可以将 JSON 对象转换成序列化数据。
那就是 jquery 的这个功能:$.param(JSON) 。
JS 部分
var xhr = new plus.net.XMLHttpRequest();
xhr.onreadystatechange = function()
{
if( xhr.readyState==4 && xhr.status==200 )
{
console.log(xhr.responseText);
}
}
var json = {
name: "Eric",
password: "123456"
};
xhr.open("POST","http://www.xxx.com/api.php");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
xhr.send($.param(json));
多谢万能的 jquery 霸霸。
至此,这个问题就被彻底地解决了,呕吼,略略略略略略略略 。
.
适用场景
综上,这个方案适用于 PHP 使用 $_POST[] 的方式来获取 post 请求数据的场景。
希望对你有帮助。
.
.
说明
这是我入门 DC(DCloud)遇到的第一个比较正式的问题。
我是一名前端开发者,同时也会点世界最好的编程语言 php(开个玩笑,别动手)。
当然 php 只是作为我的辅助技能,方便自己调试用,当然在与后台配合做项目时也会得心应手,所以,在入门学习 XMLHttpRequest 自己调试的时候,发现 php 接收不到 post 请求的参数,然后就在问答社区和度娘找原因,几经周折,完美的解决了这个问题。
.
php 接收不到数据的根本原因是什么?
前端发送数据的 "编码方式" 与后台接收数据的 "解码方式" 不同。
这里说的编码与解码对应的是请求头 header 中的 Content-Type 字段。
Content-Type 的主要方式:
- text/xml (xml 数据格式)
- text/html (html 数据格式)
- text/plain (无格式字符串数据格式)
- multipart/form-data (上传文件)
- application/json (json 数据格式)
- application/x-www-form-urlencoded (序列化数据 / url 查询地址,比如 name=Eric&password=123456)
- …
.
第一个、第二个,因为我至今没接触过,不敢多言。
第三个,无格式字符串数据格式,就是很普通的字符串。
第四个,是 form 表单上传文件时用的,这里暂时也不讨论这个。
第五个和第六个,是我要具体要讨论的。
PS:这个月的膝盖献给这位大神:四种常见的 POST 提交数据方式
.
方案一:Content-Type: "application/json"
首先,我们先看下,XMLHttpRequest 请求头的默认编码方式是什么。
JS 部分
var xhr = new plus.net.XMLHttpRequest();
xhr.onreadystatechange = function()
{
if( xhr.readyState==4 && xhr.status==200 )
{
console.log(xhr.responseText);
}
}
var json = {
name: "Eric",
password: "123456"
};
xhr.open("POST","http://www.xxx.com/api.php");
xhr.send(JSON.stringify(json)); // post 数据只能是字符串
PHP 部分
<?php
// 返回请求头的编码方式和 name 的值
$header = $_SERVER["CONTENT_TYPE"];
$name = $_POST["name"];
echo '{"header":"'.$header.'","name":"'.$name.'"}';
?>
返回结果:{"header":"text/plain;charset=utf-8","name":""}
很显然,$_POST["name"] 没有取到数据。
后来,我看到了这篇文章:Mui v3.2.0中ajax设置headers为{'Content-Type': 'application/json'}发起post请求,后端接收不到数据的解决方案(php为例) 。
虽然他说的是 mui.ajax 方式,但是思路都是一样的,然后,我修改了下代码。
JS 部分
var xhr = new plus.net.XMLHttpRequest();
xhr.onreadystatechange = function()
{
if( xhr.readyState==4 && xhr.status==200 )
{
console.log(xhr.responseText);
}
}
var json = {
name: "Eric",
password: "123456"
};
xhr.open("POST","http://www.xxx.com/api.php");
xhr.setRequestHeader("Content-Type","application/json;charset=utf-8");
xhr.send(JSON.stringify(json)); // post 数据只能是字符串
PHP 部分
<?php
// 返回请求头的编码方式和 name 的值
$input = file_get_contents('php://input');
$object = json_decode($input);
$name = $object->name;
echo '{"header":"'.$_SERVER["CONTENT_TYPE"].'","name":"'.$name.'"}';
?>
返回结果:{"header":"application/json;charset=utf-8","name":"Eric"}
很显然,数据已经接收到,这种方案确实有效。
虽然确实能解决问题,但我最终没有采用的原因是:
①. 不够直接,它不是通过 $_POST[] 方式获取的数据,后台需要对数据进行解析,无形中增加了工作量
②. 旧项目迁移不友好,如果旧项目之前采用的是 $_POST[] 方式,后台接口改动会很大
.
方案二:Content-Type: "application/x-www-form-urlencoded"
首先,后台(php)使用 $_POST[] 获取数据,需要满足两个条件:
- 设置请求头,Content-Type: "application/x-www-form-urlencoded"
- 请求数据必须序列化,比如,name=Eric&password=123456
直接上代码:
JS 部分
var xhr = new plus.net.XMLHttpRequest();
xhr.onreadystatechange = function()
{
if( xhr.readyState==4 && xhr.status==200 )
{
console.log(xhr.responseText);
}
}
xhr.open("POST","http://www.xxx.com/api.php");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
xhr.send("name=Eric&password=123456");
PHP 部分
<?php
$header = $_SERVER["CONTENT_TYPE"];
$name = $_POST["name"];
echo '{"header":"'.$header.'","name":"'.$name.'"}';
?>
返回结果:{"header":"application/x-www-form-urlencoded;charset=utf-8","name":"Eric"}
至此,问题已解决,而且不需要后台程序的特殊处理。
但是,现在的方案却不完善,因为大部分情况,我们发送的 POST 请求数据是 JSON 对象,这时候 PHP 仍然获取不到数据,此时的我,脑海中响起了《西游记》的一首歌:刚翻过了几座山,又越过了几条河,崎岖坎坷怎么它就这么多 。。
后来,我问了下度娘,它告诉我,只需要一行代码就可以将 JSON 对象转换成序列化数据。
那就是 jquery 的这个功能:$.param(JSON) 。
JS 部分
var xhr = new plus.net.XMLHttpRequest();
xhr.onreadystatechange = function()
{
if( xhr.readyState==4 && xhr.status==200 )
{
console.log(xhr.responseText);
}
}
var json = {
name: "Eric",
password: "123456"
};
xhr.open("POST","http://www.xxx.com/api.php");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
xhr.send($.param(json));
多谢万能的 jquery 霸霸。
至此,这个问题就被彻底地解决了,呕吼,略略略略略略略略 。
.
适用场景
综上,这个方案适用于 PHP 使用 $_POST[] 的方式来获取 post 请求数据的场景。
希望对你有帮助。
.
收起阅读 »
wgtu差量升级
在我做这个功能的时候踩到了几个坑,给大家分享一下:
一.制作升级包:
(1) 点击“发行”——“制作移动app资源升级包”,(注意发行的时候要保证manifest.json 里面的版本号比你当前运行的版本号高一版本,例如当前版本号是1.1.0,manifest.json里面的版本号就要为1.1.1)
(2)制作好了按照http://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/199 里面的来写update.xml,注意里面version 是当前的版本号(不要作死写不一样的,我试过会报 “WGTU安装包中update.xml文件的version版本不匹配” 这个错误)
(3)最后用 zip压缩工具 (用过别的包压缩会报格式错误) 进行压缩,同时选中www文件和update.xml进行压缩,最后将zip改为wgtu就完成了升级包的制作。
在我做这个功能的时候踩到了几个坑,给大家分享一下:
一.制作升级包:
(1) 点击“发行”——“制作移动app资源升级包”,(注意发行的时候要保证manifest.json 里面的版本号比你当前运行的版本号高一版本,例如当前版本号是1.1.0,manifest.json里面的版本号就要为1.1.1)
(2)制作好了按照http://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/199 里面的来写update.xml,注意里面version 是当前的版本号(不要作死写不一样的,我试过会报 “WGTU安装包中update.xml文件的version版本不匹配” 这个错误)
(3)最后用 zip压缩工具 (用过别的包压缩会报格式错误) 进行压缩,同时选中www文件和update.xml进行压缩,最后将zip改为wgtu就完成了升级包的制作。