做一个APP软件要多少钱?
与传统APP开发模式相比,云计算模式开发APP,不仅可以大幅缩短开发周期,并可让开发自己成本节省9成左右。
创新云计算开发模式为什么可以更省时、省钱?
从渠道开发角度来说,首发打通了苹果APP+安卓APP+小程序+微官网+移动网站平台的连贯开发,意味着企业只需进行一次APP开发,即可拥有上述所有主流移动渠道平台,并可配置PC/移动端管理平台、配送端平台等全部产品。
从APP功能开发角度来说,基于“PaaS+SaaS”创新云计算模式的云平台,可以有效降低开发门槛,从而大幅提升APP开发效率,进而降低软件APP制作周期与开发成本。
从APP运营角度来讲,企业只需配备1-2人,只需会进行简单的电脑操作,即可进行平台运营维护,无需自建技术团队,运营成本也能得到大幅压缩。
从APP应用角度来看,可以快速搭建最新、最热、最有效的场景化移动电商APP平台,拥有全套的一站式APP制作解决方案!
与传统APP开发模式相比,云计算模式开发APP,不仅可以大幅缩短开发周期,并可让开发自己成本节省9成左右。
创新云计算开发模式为什么可以更省时、省钱?
从渠道开发角度来说,首发打通了苹果APP+安卓APP+小程序+微官网+移动网站平台的连贯开发,意味着企业只需进行一次APP开发,即可拥有上述所有主流移动渠道平台,并可配置PC/移动端管理平台、配送端平台等全部产品。
从APP功能开发角度来说,基于“PaaS+SaaS”创新云计算模式的云平台,可以有效降低开发门槛,从而大幅提升APP开发效率,进而降低软件APP制作周期与开发成本。
从APP运营角度来讲,企业只需配备1-2人,只需会进行简单的电脑操作,即可进行平台运营维护,无需自建技术团队,运营成本也能得到大幅压缩。
从APP应用角度来看,可以快速搭建最新、最热、最有效的场景化移动电商APP平台,拥有全套的一站式APP制作解决方案!
收起阅读 »力谱云专家告诉你,靠谱的APP是如何制作的?
> 移动蓝海市场,商机无限,越来越多的企业开始寻求制作,并运营一款专属于自己的靠谱APP。那么,究竟开发一个APP要多少钱呢?
开门见山,目前通过传统开发模式,制作一个手机APP软件商城的价格普遍在30万元左右。并且,开发APP的成本会随着需求难易度,以及开发周期长短的影响进而走高,可以说是一个上不封顶的高成本投入项目。
传统开发模式下,开发一款普通电商APP究竟为何如此昂贵?
首先,目前制作一个靠谱的手机APP,普遍会需要开发iOS APP、安卓APP、微信小程序、微官网、移动网站等主流APP应用平台,进行大批流量导入。并且,平台方还需要需要PC端运营管理平台,以及便捷的移动端运营平台,进行日常订单、物流、产品等方面的跟进。此外,还会需要服务器方面的部署。这几大方面的开发逻辑各不相同,需要一一从零开始制作。
其次,传统开发模式下,人工成本繁杂,至少需要前后端各自配备一名工程师,一位UI设计师,一位测试员,以及产品经理进行项目统筹。并且,开发周期冗长,需要数月的制作时间,也存在项目开发失败的风险。
另外,除了满足单一的APP功能之外,靠谱的商家,一般会提供许多细分功能,而这些功能都需要庞大的业务系统进行支撑。比如,在开发一个电商APP时,除了商品交易等基础电商功能之外,还会涉及到用户登录注册、购物车、会员管理、订单管理等功能,每个单一功能都需要无数细小功能进行支撑,才能完善业务逻辑。在传统开发模式中,这些细微的功能,都会需要从零起步,一步步进行研磨。
> 移动蓝海市场,商机无限,越来越多的企业开始寻求制作,并运营一款专属于自己的靠谱APP。那么,究竟开发一个APP要多少钱呢?
开门见山,目前通过传统开发模式,制作一个手机APP软件商城的价格普遍在30万元左右。并且,开发APP的成本会随着需求难易度,以及开发周期长短的影响进而走高,可以说是一个上不封顶的高成本投入项目。
传统开发模式下,开发一款普通电商APP究竟为何如此昂贵?
首先,目前制作一个靠谱的手机APP,普遍会需要开发iOS APP、安卓APP、微信小程序、微官网、移动网站等主流APP应用平台,进行大批流量导入。并且,平台方还需要需要PC端运营管理平台,以及便捷的移动端运营平台,进行日常订单、物流、产品等方面的跟进。此外,还会需要服务器方面的部署。这几大方面的开发逻辑各不相同,需要一一从零开始制作。
其次,传统开发模式下,人工成本繁杂,至少需要前后端各自配备一名工程师,一位UI设计师,一位测试员,以及产品经理进行项目统筹。并且,开发周期冗长,需要数月的制作时间,也存在项目开发失败的风险。
另外,除了满足单一的APP功能之外,靠谱的商家,一般会提供许多细分功能,而这些功能都需要庞大的业务系统进行支撑。比如,在开发一个电商APP时,除了商品交易等基础电商功能之外,还会涉及到用户登录注册、购物车、会员管理、订单管理等功能,每个单一功能都需要无数细小功能进行支撑,才能完善业务逻辑。在传统开发模式中,这些细微的功能,都会需要从零起步,一步步进行研磨。
收起阅读 »iOS离线打包 - 语音识别(Speech)插件配置
百度语音配置
将百度语音模块依赖库及资源添加到工程
| 依赖库 | 系统库 | 依赖资源 |
|---|---|---|
| liblibSpeech.a、libBaiduSpeechSDK.a、libbaiduSpeech.a | libc++.tbd、libz.tbd、libsqlite3.tbd、AudioToolbox.framework、AVFoundation.framework、CFNetwork.framework、CoreLocation.framework、CoreTelephony.framework、SystemConfiguration.framework、GLKit.framework | BDSClientEASRResources文件夹里的资源文件 |
帐号配置
1.首先到百度语音官方网站 创建应用获取 appkey 等信息。
2.打开info.plist,找到baiduspeech项,填入自己帐号的信息,如果没有该项,按照下图中的格式创建
3、把BDSClientEASRResources文件夹里的资源文件引入到工程里
讯飞语音配置
添加讯飞语音插件
注: Linker Flags、framework添加方法参考该文档
| 依赖库 | 系统库 | 依赖资源 |
|---|---|---|
| liblibSpeech.a、libiflySpeech.a、iflyMSC.framework | AVFoundation.framework、AddressBook.framework、Contacts.framework | 无 |
注意:iflyMSC.framework 库需要开发者在讯飞语音官方网站自行生成,因为需要跟您的AppId绑定,SDK内的库无法在您的App中使用;
帐号配置
首先到讯飞语音官方网站创建App,获取 appid 信息。
2.打开info.plist,找到iFly项,填入自己帐号的信息,如果没有该项,按照下图中的格式创建
注意:离线打包语言识别功能只能选一个,要么科大讯飞,要么百度语音,剩下那个需要在工程里删除
百度语音配置
将百度语音模块依赖库及资源添加到工程
| 依赖库 | 系统库 | 依赖资源 |
|---|---|---|
| liblibSpeech.a、libBaiduSpeechSDK.a、libbaiduSpeech.a | libc++.tbd、libz.tbd、libsqlite3.tbd、AudioToolbox.framework、AVFoundation.framework、CFNetwork.framework、CoreLocation.framework、CoreTelephony.framework、SystemConfiguration.framework、GLKit.framework | BDSClientEASRResources文件夹里的资源文件 |
帐号配置
1.首先到百度语音官方网站 创建应用获取 appkey 等信息。
2.打开info.plist,找到baiduspeech项,填入自己帐号的信息,如果没有该项,按照下图中的格式创建
3、把BDSClientEASRResources文件夹里的资源文件引入到工程里
讯飞语音配置
添加讯飞语音插件
注: Linker Flags、framework添加方法参考该文档
| 依赖库 | 系统库 | 依赖资源 |
|---|---|---|
| liblibSpeech.a、libiflySpeech.a、iflyMSC.framework | AVFoundation.framework、AddressBook.framework、Contacts.framework | 无 |
注意:iflyMSC.framework 库需要开发者在讯飞语音官方网站自行生成,因为需要跟您的AppId绑定,SDK内的库无法在您的App中使用;
帐号配置
首先到讯飞语音官方网站创建App,获取 appid 信息。
2.打开info.plist,找到iFly项,填入自己帐号的信息,如果没有该项,按照下图中的格式创建
注意:离线打包语言识别功能只能选一个,要么科大讯飞,要么百度语音,剩下那个需要在工程里删除
收起阅读 »HBuilderX入门教程
本帖文章已集成到: hx产品文档
HX是轻量编辑器和强大IDE的完美结合体。敏捷的性能,清爽的界面,强大的功能和于一身。
本文档面向入门用户,建议初学者仔细研读。
1. 介绍
- 执着于更快一步的理念,hx的左侧项目管理器是单击响应而不是双击。
- 单击展开目录,单击预览文件,双击打开文件。
- 预览文件时顶部标签卡是斜体的,此时继续预览其他文件会替换预览标签卡。双击文件后标签卡为正体,不会被替换。预览的文件一旦开始编辑,也会自动变为正式打开状态。
- 项目管理器默认是不显示图标的,可以将鼠标移到项目管理器区域,右上角会悬浮菜单,在里面可以选择显示图标。HBuilderX支持业内多种图标插件,可以在工具-插件安装中找到更多图标插件。
- hx的文件保存是免丢失的,并且有热退出功能。所谓热退出,就是关闭hx时不要保存文件。再次打开时仍然是之前的状态。未保存的文件也会继续原样展现。
- hx默认带有每
30秒保存一次临时文件的策略(可以在设置里调节时间间隔) - 不管是关闭hx,还是断电、崩溃,临时文件始终会自动保存。
- 前端预编译型语言越来越多,每次保存都触发编译比较消耗资源,有了hx,可以专注写代码而不需要隔一会按一下ctrl+s,需要编译时再保存,或编辑多个文件后按ctrl+alt+s全部保存。
2. 语法提示
拥有自研的世界级语法分析引擎一直是HBuilder系列产品傲视业内的资本。
但前端框架众多,框架的语法提示需要加载单独的语法提示库。
框架语法提示库是在页面的右下角选择。(如下图示例)
注意:
- 框架语法库是挂在项目下的,一个项目加载了一个框架语法库后,这个项目下所有js文件或HTML文件都会在代码助手提示这个框架的语法。
- 但如果一个文件是单独从硬盘打开,没有整项目拖入hx,那么此时无法加载框架语法库。
3. 代码助手
hx的代码助手,可以按alt+数字选择直接选择某个项目,类似中文输入法数字选词 (如下图示例)
4. 语法帮助
光标放到某api处,按下F1,就可跳转到这个api的官方手册。目前支持vue、uni-app、5+等api (如下图示例)
5. 编辑器与项目管理器的同步
hx默认是打开的标签卡和项目管理器自动关联,切换标签卡时项目管理器也会跟随变化,如不需要此功能,可以将鼠标移到项目管理器区域,右上角会悬浮菜单,在里面可以取消“与编辑器同步”。(如下图示例)
一般多项目时建议取消同步功能。
取消同步后,如需手动定位标签卡所在的项目,可以对编辑器点右键-“在项目管理器中定位”。(如下图示例)
6. 多光标
hx支持多光标,按 ctrl+鼠标左键 就可增加一个光标,ctrl+鼠标右键 可取消一个光标或选区。(如下图示例)
还可以选择相同词。ctrl+e (mac是cmd+d)可选中相同的词做批处理。(如下图示例)
多光标是极客必备工具,高级技巧请参考:https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/13191
7. 列选择
hx的列选择,是alt+鼠标拖选。或者用快捷键ctrl+alt+↑或↓。(如下图示例)
8. 选择编码、着色高亮
当你打开一个不认识的文档时,即hx的无法高亮着色,可以在右下角选择使用其他编辑器打开。
当你打开一个文件编码错乱,产生乱码时,也可以在右下角选择编码重新打开。(如下图示例)
9. 转到定义
转到定义是非常常用的功能,普通编辑器不长于此,只能猜单词跳转。
HBuilderX有强大的语法分析引擎,可以准确的跳转定义位置。
转到定义的快捷键是Alt+d,鼠标操作是alt+左键单击(注意不是ctrl,因为ctrl留给了多光标)
而HBuilderX还有一个特色是转到定义到分栏,ctrl+alt+左键,可以把一个定义处的代码打开在另一侧,方便共同查看
如何回到上一个光标位置?
在HBuilderX中,Alt+Left或点击工具栏上的<, 即可回到上一个光标位置。
备注:支持切换【Ctrl+鼠标左键】或【Alt+鼠标左键】进行转到定义 (菜单【选择】,最后一个菜单)。
10. 文件快速打开
在顶部工具栏直接搜索工程下的文件名并打开,或者使用快捷键ctrl+p。(如下图示例)
比较常用的文件,可以在工具栏里添加到收藏夹。(如下图示例)
ctrl+p也是标签卡管理的重要工具,屏幕窄看不清左右打开的标签时,可以用它来浏览所有以打开的标签
11. 目录内搜索
项目管理器点右键,选:查找字符串(当前目录),可在该目录下所有文件中搜索字符串(如下图示例)
12. 缩进调整
hx默认使用tab缩进,tab长度为4个空格。
如果你需要调整缩进长度,比如tab长度为2个空格,在工具设置-编辑器中调整。(如下图示例)
如果不喜欢使用tab而喜欢使用空格,也可以在设置中调。注意这个调节只是编辑器里敲tab按键时转为了空格,格式化时仍是tab。
调节格式化设置,参考菜单工具-插件配置。hx支持几种格式化插件,他们都有自己的配置定义文件,请按插件配置中的说明修改设置。(如下图示例)
比如格式化插件Formator-Prettier,它的配置文件为:【工具】【插件配置】【formator-frettier】【formator.config.js】(如下图示例)
在菜单编辑-缩进中,可文件的缩进从tab转空格或从空格转tab。
13. 语法校验
hx的语法校验都是插件,在工具插件安装中选择各种校验插件,不同语言的校验插件不一样。安装校验插件后,保存文件时会自动执行语法校验。(如下图示例)
校验概要结果会显示在状态栏,比如有2个错误(如下图),可以按F4切换到不同的错误处,画有红波浪线(如下图),鼠标移到红波浪线上会显示具体的错误信息。(如下图示例)
你也可以不保存,直接点菜单工具-验证本文档校验语法 来进行校验。(如下图示例)
15. svn/git项目导入
以git为例:(git项目:需要安装git插件、以及TortoiseGit、并配置ssh秘钥)(如下图示例)
| 插件名称 | Mac操作系统 | Windows操作系统 |
|---|---|---|
| svn | Mac SVN教程 | Windows SVN教程 |
| git | Mac Git教程 | Windows Git教程 |
15. 预编译器(less/sass)
在【菜单】-->【插件安装】里有各种语言的预编译器,比如less、ts等。安装预编译器后,hx下的所有项目均可用共用。
sass示例: (如下图示例)
预编译器安装后使用入口在外部命令菜单中
sass/less插件配置小技巧:
less、sass可以在插件配置里,配置为保存文件时自动编译。
安装less或sass插件后,进入菜单【工具】【插件配置】【compile-less】,点击package.json文件,将onDidSaveExecution修改为true。注意修改后需要重启HBuilderX才能生效
{
"onDidSaveExecution": true
}
16. 更多文档教程
参考: HBuilderX更多教程
本帖文章已集成到: hx产品文档
HX是轻量编辑器和强大IDE的完美结合体。敏捷的性能,清爽的界面,强大的功能和于一身。
本文档面向入门用户,建议初学者仔细研读。
1. 介绍
- 执着于更快一步的理念,hx的左侧项目管理器是单击响应而不是双击。
- 单击展开目录,单击预览文件,双击打开文件。
- 预览文件时顶部标签卡是斜体的,此时继续预览其他文件会替换预览标签卡。双击文件后标签卡为正体,不会被替换。预览的文件一旦开始编辑,也会自动变为正式打开状态。
- 项目管理器默认是不显示图标的,可以将鼠标移到项目管理器区域,右上角会悬浮菜单,在里面可以选择显示图标。HBuilderX支持业内多种图标插件,可以在工具-插件安装中找到更多图标插件。
- hx的文件保存是免丢失的,并且有热退出功能。所谓热退出,就是关闭hx时不要保存文件。再次打开时仍然是之前的状态。未保存的文件也会继续原样展现。
- hx默认带有每
30秒保存一次临时文件的策略(可以在设置里调节时间间隔) - 不管是关闭hx,还是断电、崩溃,临时文件始终会自动保存。
- 前端预编译型语言越来越多,每次保存都触发编译比较消耗资源,有了hx,可以专注写代码而不需要隔一会按一下ctrl+s,需要编译时再保存,或编辑多个文件后按ctrl+alt+s全部保存。
2. 语法提示
拥有自研的世界级语法分析引擎一直是HBuilder系列产品傲视业内的资本。
但前端框架众多,框架的语法提示需要加载单独的语法提示库。
框架语法提示库是在页面的右下角选择。(如下图示例)
注意:
- 框架语法库是挂在项目下的,一个项目加载了一个框架语法库后,这个项目下所有js文件或HTML文件都会在代码助手提示这个框架的语法。
- 但如果一个文件是单独从硬盘打开,没有整项目拖入hx,那么此时无法加载框架语法库。
3. 代码助手
hx的代码助手,可以按alt+数字选择直接选择某个项目,类似中文输入法数字选词 (如下图示例)
4. 语法帮助
光标放到某api处,按下F1,就可跳转到这个api的官方手册。目前支持vue、uni-app、5+等api (如下图示例)
5. 编辑器与项目管理器的同步
hx默认是打开的标签卡和项目管理器自动关联,切换标签卡时项目管理器也会跟随变化,如不需要此功能,可以将鼠标移到项目管理器区域,右上角会悬浮菜单,在里面可以取消“与编辑器同步”。(如下图示例)
一般多项目时建议取消同步功能。
取消同步后,如需手动定位标签卡所在的项目,可以对编辑器点右键-“在项目管理器中定位”。(如下图示例)
6. 多光标
hx支持多光标,按 ctrl+鼠标左键 就可增加一个光标,ctrl+鼠标右键 可取消一个光标或选区。(如下图示例)
还可以选择相同词。ctrl+e (mac是cmd+d)可选中相同的词做批处理。(如下图示例)
多光标是极客必备工具,高级技巧请参考:https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/13191
7. 列选择
hx的列选择,是alt+鼠标拖选。或者用快捷键ctrl+alt+↑或↓。(如下图示例)
8. 选择编码、着色高亮
当你打开一个不认识的文档时,即hx的无法高亮着色,可以在右下角选择使用其他编辑器打开。
当你打开一个文件编码错乱,产生乱码时,也可以在右下角选择编码重新打开。(如下图示例)
9. 转到定义
转到定义是非常常用的功能,普通编辑器不长于此,只能猜单词跳转。
HBuilderX有强大的语法分析引擎,可以准确的跳转定义位置。
转到定义的快捷键是Alt+d,鼠标操作是alt+左键单击(注意不是ctrl,因为ctrl留给了多光标)
而HBuilderX还有一个特色是转到定义到分栏,ctrl+alt+左键,可以把一个定义处的代码打开在另一侧,方便共同查看
如何回到上一个光标位置?
在HBuilderX中,Alt+Left或点击工具栏上的<, 即可回到上一个光标位置。
备注:支持切换【Ctrl+鼠标左键】或【Alt+鼠标左键】进行转到定义 (菜单【选择】,最后一个菜单)。
10. 文件快速打开
在顶部工具栏直接搜索工程下的文件名并打开,或者使用快捷键ctrl+p。(如下图示例)
比较常用的文件,可以在工具栏里添加到收藏夹。(如下图示例)
ctrl+p也是标签卡管理的重要工具,屏幕窄看不清左右打开的标签时,可以用它来浏览所有以打开的标签
11. 目录内搜索
项目管理器点右键,选:查找字符串(当前目录),可在该目录下所有文件中搜索字符串(如下图示例)
12. 缩进调整
hx默认使用tab缩进,tab长度为4个空格。
如果你需要调整缩进长度,比如tab长度为2个空格,在工具设置-编辑器中调整。(如下图示例)
如果不喜欢使用tab而喜欢使用空格,也可以在设置中调。注意这个调节只是编辑器里敲tab按键时转为了空格,格式化时仍是tab。
调节格式化设置,参考菜单工具-插件配置。hx支持几种格式化插件,他们都有自己的配置定义文件,请按插件配置中的说明修改设置。(如下图示例)
比如格式化插件Formator-Prettier,它的配置文件为:【工具】【插件配置】【formator-frettier】【formator.config.js】(如下图示例)
在菜单编辑-缩进中,可文件的缩进从tab转空格或从空格转tab。
13. 语法校验
hx的语法校验都是插件,在工具插件安装中选择各种校验插件,不同语言的校验插件不一样。安装校验插件后,保存文件时会自动执行语法校验。(如下图示例)
校验概要结果会显示在状态栏,比如有2个错误(如下图),可以按F4切换到不同的错误处,画有红波浪线(如下图),鼠标移到红波浪线上会显示具体的错误信息。(如下图示例)
你也可以不保存,直接点菜单工具-验证本文档校验语法 来进行校验。(如下图示例)
15. svn/git项目导入
以git为例:(git项目:需要安装git插件、以及TortoiseGit、并配置ssh秘钥)(如下图示例)
| 插件名称 | Mac操作系统 | Windows操作系统 |
|---|---|---|
| svn | Mac SVN教程 | Windows SVN教程 |
| git | Mac Git教程 | Windows Git教程 |
15. 预编译器(less/sass)
在【菜单】-->【插件安装】里有各种语言的预编译器,比如less、ts等。安装预编译器后,hx下的所有项目均可用共用。
sass示例: (如下图示例)
预编译器安装后使用入口在外部命令菜单中
sass/less插件配置小技巧:
less、sass可以在插件配置里,配置为保存文件时自动编译。
安装less或sass插件后,进入菜单【工具】【插件配置】【compile-less】,点击package.json文件,将onDidSaveExecution修改为true。注意修改后需要重启HBuilderX才能生效
{
"onDidSaveExecution": true
}
16. 更多文档教程
参考: HBuilderX更多教程
收起阅读 »Android 获取 手机本机 MAC 地址 支持 所有 Android 版本
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();
}); 收起阅读 »
预览图片 重写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
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>








