MUI H5文档笔记

primadonna

发布日期: 2019-03-06 21:40:56 浏览量: 1297
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

MUI H5文档笔记

界面初始化

初始化就是把一切程序设为默认状态,把没准备的准备好。
mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需要在mui.init方法中完成对应参数配置即可,目前支持在mui.init方法中配置的功能包括:创建子页面、关闭页面、手势事件配置、预加载、下拉刷新、上拉加载。

H5plus初始化

在我们APP的开发中,如果我们用到了H5+的一些API或者接口,我们需要初始化另外一个函数,类属于 JS 中的window.onload 或者 window.ready

Mui.plusReady(); 所有涉及到H5+的东西,建议写到这个里面

  1. mui.plusReady(function(){
  2. var w = plus.webview.currentWebview();
  3. console.log(w);
  4. });

创建子页面

为防止APP运行过程中内容滚动出现卡顿的现象,所以部分页面我们采用头部和内容分离的形式进行实现,比如头部导航和底部导航

  1. mui.init({
  2. subpages:[{
  3. url:your-subpage-url,//子页面HTML地址,支持本地地址和网络地址
  4. id:your-subpage-id,//子页面标志
  5. styles:{
  6. top:subpage-top-position,//子页面顶部位置
  7. bottom:subpage-bottom-position,//子页面底部位置
  8. width:subpage-width,//子页面宽度,默认为100%
  9. height:subpage-height,//子页面高度,默认为100%
  10. ......
  11. },
  12. extras:{
  13. name:'zxd学院'//子页面通过plus.webview.currentWebview().name能拿到这个值
  14. }//额外扩展参数
  15. }]
  16. });

打开界面

  1. //打开新窗口
  2. mui.openWindow({
  3. url:'target.html', //需要打开页面的url地址
  4. id:'target', //需要打开页面的url页面id
  5. styles:{
  6. top:'0px',//新页面顶部位置
  7. bottom:'0px',//新页面底部位置
  8. // width:newpage-width,//新页面宽度,默认为100%
  9. // height:newpage-height,//新页面高度,默认为100% ......
  10. },
  11. extras:{
  12. name:'aries',
  13. age:'18',
  14. // .....//自定义扩展参数,可以用来处理页面间传值
  15. },show:{ //控制打开页面的类型
  16. autoShow:true,
  17. // //页面loaded事件发生后自动显示,默认为true
  18. aniShow:'zoom-fade-out',//页面显示动画,默认为”slide-in-right“; 页面出现的方式 左右上下
  19. duration:'1000'//页面动画持续时间,Android平台默认100毫秒,iOS平台默认200毫秒;
  20. }, waiting:{ // 控制 弹出转圈框的信息
  21. autoShow:true,//自动显示等待框,默认为true
  22. title:'WRITE-BUG...',//等待对话框上显示的提示内容
  23. options:{
  24. width:'300px',//等待框背景区域宽度,默认根据内容自动计算合适宽度
  25. height:'300px',//等待框背景区域高度,默认根据内容自动计算合适高度 ......
  26. }
  27. }
  28. });

参数传递

  1. mui.plusReady(function(){
  2. var self = plus.webview.currentWebview(); //获得当前页面的对象
  3. var name = self.name; //name 和 age 为传递的参数的键
  4. var age = self.age;
  5. console.log(name);
  6. console.log(age);
  7. // 获得首页 专用的
  8. var index = plus.webview.getLaunchWebview();
  9. // 获得指定页面的对象 注意,要确保你的这个页面是存在的, 就是打开过的
  10. var target = plus.webview.getWebviewById('目标页面的id');
  11. });

控制页面load显示

  1. show:{ // openwindow 函数内设置
  2. autoShow:false
  3. }
  4. // 目标页面
  5. //从服务器获取数据 ....
  6. 这里是业务逻辑
  7. //业务数据获取完毕,并已插入当前页面DOM;
  8. //注意:若为ajax请求,则需将如下代码放在处理完ajax响应数据之后;
  9. mui.plusReady(function(){
  10. //关闭等待框
  11. plus.nativeUI.closeWaiting();
  12. //显示当前页面
  13. mui.currentWebview.show();
  14. });

关闭界面

  • 点击包含.mui-action-back类的控件

  • 在页面上,向右快速滑动

  • Android手机按下back按键

mui框架封装的页面右滑关闭功能,默认未启用,若要使用右滑关闭功能,需要在mui.init();方法中设置swipeBack参数,如下:

  1. mui.init({
  2. swipeBack:true //启用右滑关闭功能
  3. });

mui框架默认会监听Android手机的back按键,然后执行页面关闭逻辑; 若不希望mui自动处理back按键,可通过如下方式关闭mui的back按键监听:

  1. mui.init({
  2. keyEventBind: {
  3. backbutton: false //关闭back按键监听
  4. }
  5. });

底部导航切换界面

HTML部分:

  1. <nav class="mui-bar mui-bar-tab">
  2. <a id="defaultTab" class="mui-tab-item mui-active" href="a.html">
  3. <span class="mui-icon mui-icon-videocam"></span>
  4. <span class="mui-tab-label">社区</span>
  5. </a>
  6. <a class="mui-tab-item" href="b.html">
  7. <span class="mui-icon mui-icon-chatboxes"><span style="display: none;" class="mui-badge">1</span></span>
  8. <span class="mui-tab-label">群组</span>
  9. </a>
  10. <a class="mui-tab-item" href="c.html">
  11. <span class="mui-icon mui-icon-home"></span>
  12. <span class="mui-tab-label">我的</span>
  13. </a>
  14. </nav>

JavaScript部分:

  1. //mui初始化
  2. mui.init();
  3. var subpages = ['a.html', 'b.html', 'c.html'];
  4. var subpage_style = {
  5. top:'0px',
  6. bottom: '51px'
  7. };
  8. var aniShow = {};
  9. //创建子页面,首个选项卡页面显示,其它均隐藏;
  10. mui.plusReady(function() {
  11. var self = plus.webview.currentWebview();
  12. for (var i = 0; i < subpages.length; i++) {
  13. var temp = {};
  14. var sub = plus.webview.create(subpages[i], subpages[i], subpage_style);
  15. if (i > 0) {
  16. sub.hide();
  17. }else{
  18. temp[subpages[i]] = "true";
  19. mui.extend(aniShow,temp);
  20. }
  21. self.append(sub);
  22. }
  23. });
  24. //当前激活选项
  25. var activeTab = subpages[0];
  26. //选项卡点击事件
  27. mui('.mui-bar-tab').on('tap', 'a', function(e) {
  28. var targetTab = this.getAttribute('href');
  29. if (targetTab == activeTab) {
  30. return;
  31. }
  32. //显示目标选项卡
  33. //若为iOS平台或非首次显示,则直接显示
  34. if(mui.os.ios||aniShow[targetTab]){
  35. plus.webview.show(targetTab);
  36. }else{
  37. //否则,使用fade-in动画,且保存变量
  38. var temp = {};
  39. temp[targetTab] = "true";
  40. mui.extend(aniShow,temp);
  41. plus.webview.show(targetTab,"fade-in",300);
  42. }
  43. //隐藏当前;
  44. plus.webview.hide(activeTab);
  45. //更改当前活跃的选项卡
  46. activeTab = targetTab;
  47. });
  48. //自定义事件,模拟点击“首页选项卡”
  49. document.addEventListener('gohome', function() {
  50. var defaultTab = document.getElementById("defaultTab");
  51. //模拟首页点击
  52. mui.trigger(defaultTab, 'tap');
  53. //切换选项卡高亮
  54. var current = document.querySelector(".mui-bar-tab>.mui-tab-item.mui-active");
  55. if (defaultTab !== current) {
  56. current.classList.remove('mui-active');
  57. defaultTab.classList.add('mui-active');
  58. }
  59. });

自定义事件

监听自定义事件 - 目标页

  1. window.addEventListener('shijian',function(event){
  2. //通过event.detail可获得传递过来的参数内容
  3. ....
  4. var name = event.detail.namel
  5. console.log(name);
  6. shijian();
  7. })

触发自定义事件 - 本页

  1. //首先获得目标页面的对象
  2. var targetPage = plus.webview.getWebviewById('目标页面id');
  3. mui.fire(targetPage,'shijian',{
  4. //自定义事件参数
  5. name:'write-bug'
  6. });

页面预加载

所谓的预加载技术就是在用户尚未触发页面跳转时,提前创建目标页面,这样当用户跳转时,就可以立即进行页面切换,节省创建新页面的时间,提升app使用体验。mui提供两种方式实现页面预加载。

方式一:通过mui.init方法中的preloadPages参数进行配置

  1. mui.init({ // 可同时加载一个或者多个界面
  2. preloadPages:[ //加载一个界面
  3. {
  4. url:'a.html',
  5. id:'a',
  6. styles:{},//窗口参数
  7. extras:{},//自定义扩展参数
  8. subpages:[{},{}]//预加载页面的子页面
  9. },{ // 可加载另外一个界面,不需要可直接删除
  10. url:'b.html',
  11. id:'b',
  12. styles:{},//窗口参数
  13. extras:{},//自定义扩展参数
  14. subpages:[{},{}]//预加载页面的子页面
  15. }
  16. ]
  17. });

方式二:通过mui.preload方法预加载,一次只能预加载一个页面,若需加载多个webview,则需多次调用mui.preload()方法

  1. mui.plusReady(function(){
  2. var productView = mui.preload({
  3. url: 'list.html',
  4. id: 'list',
  5. });
  6. console.log(productView); //获得预加载界面的对象
  7. });

消息框

警告消息框

  1. mui.alert('欢迎使用Hello WRITE-BUG','WRITE-BUG',function(){
  2. alert('你刚关闭了警告框');
  3. });

消息提示框

  1. var btnArray = ['是','否'];
  2. mui.confirm('WRITE-BUG技术共享平台 - 一个专注校园计算机技术交流的平台,赞?','Hello WRITE-BUG',btnArray,function(e){
  3. if(e.index==0){
  4. alert('点击了- 是');
  5. //自己的逻辑
  6. }else{
  7. alert('点击了- 否');
  8. }
  9. });

输入对话框

  1. var btnArray = ['确定','取消'];
  2. mui.prompt('请输入你对WRITE-BUG的评语:','内容好','WRITE-BUG',btnArray,function(e){
  3. if(e.index==0){
  4. alert('点击了 - 确认');
  5. var value = e.value; // value 为输入的内容
  6. }else{
  7. alert('点击了 - 取消');
  8. }
  9. });

自动消息对话框

  1. mui.toast('显示内容');

日期选择框

  1. //js里的月份 是从0月开始的,也就是说,js中的0月是我们1月
  2. var dDate=new Date(); //默认显示的时间
  3. dDate.setFullYear(2015,5,30);
  4. var minDate=new Date(); //可选择的最小时间
  5. minDate.setFullYear(2010,0,1);
  6. var maxDate=new Date(); //课选择的最大的时间
  7. maxDate.setFullYear(2016,11,31);
  8. plus.nativeUI.pickDate( function(e) {
  9. var d=e.date;
  10. alert('您选择的日期是:'+d.getFullYear()+"-"+(d.getMonth()+1)+"-"+ d.getDate());
  11. },function(e){
  12. alert('您没有选择日期');
  13. },{title:"请选择日期",date:dDate,minDate:minDate,maxDate:maxDate});

时间选择框

  1. var dTime=new Date();
  2. dTime.setHours(20,0); //设置默认时间
  3. plus.nativeUI.pickTime(function(e){
  4. var d=e.date;
  5. alert("您选择的时间是:"+d.getHours()+":"+d.getMinutes());
  6. },function (e){
  7. alert('您没有选择时间');
  8. },{title:"请选择时间",is24Hour:true,time:dTime});

原生模式ActionSheet

  1. var btnArray = [{title:"分享到微信"},{title:"分享到新浪微博"},{title:"分享到搜狐微博"}]; //选择按钮 1 2 3
  2. plus.nativeUI.actionSheet( {
  3. title:"分享到",
  4. cancel:"取消", // 0
  5. buttons:btnArray
  6. },
  7. function(e){
  8. var index = e.index; //
  9. alert(index);
  10. switch (index){
  11. case 1:
  12. //写自己的逻辑
  13. break;
  14. case 2:
  15. break;
  16. }
  17. } );

下拉刷新

为实现下拉刷新功能,大多H5框架都是通过DIV模拟下拉回弹动画,在低端android手机上,DIV动画经常出现卡顿现象(特别是图文列表的情况); 通过双webview解决这个DIV的拖动流畅度问题;拖动时,拖动的不是div,而是一个完整的webview(子webview),回弹动画使用原生动画;在iOS平台,H5的动画已经比较流畅,故依然使用H5方案。两个平台实现虽有差异,但经过封装,可使用一套代码实现下拉刷新。

第一步: 创建子页面,因为拖动的其实是个子页面的整体

  1. mui.init({
  2. subpages:[{
  3. url:pullrefresh-subpage-url,//下拉刷新内容页面地址
  4. id:pullrefresh-subpage-id,//内容页面标志
  5. styles:{ top:subpage-top-position,//内容页面顶部位置,需根据实际页面布局计算,若使用标准mui导航,顶部默认为48px; .....//其它参数定义
  6. }
  7. }]
  8. });

第二步:内容页面需按照如下DOM结构构建

  1. <!--下拉刷新容器-->
  2. <div id="pullrefresh" class="mui-content mui-scroll-wrapper">
  3. <div class="mui-scroll">
  4. <!--数据列表-->
  5. <ul class="mui-table-view mui-table-view-chevron">
  6. <li class="mui-table-view-cell">1</li>
  7. </ul>
  8. </div>
  9. </div>

第三步:通过mui.init方法中pullRefresh参数配置下拉刷新各项参数

  1. mui.init({
  2. pullRefresh : {
  3. container:"#pullrefresh",//下拉刷新容器标识,querySelector能定位的css选择器均可,比如:id、.class等
  4. down : {
  5. contentdown : "下拉可以刷新",//可选,在下拉可刷新状态时,下拉刷新控件上显示的标题内容
  6. contentover : "释放立即刷新",//可选,在释放可刷新状态时,下拉刷新控件上显示的标题内容
  7. contentrefresh : "正在刷新...",//可选,正在刷新状态时,下拉刷新控件上显示的标题内容
  8. callback : fn //必选,刷新函数,根据具体业务来编写,比如通过ajax从服务器获取新数据;
  9. } }
  10. });

第四步:设置执行函数

  1. function fn() {
  2. //业务逻辑代码,比如通过ajax从服务器获取新数据; ...... //注意,加载完新数据后,必须执行如下代码,注意:若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后
  3. mui('#pullrefresh').pullRefresh().endPulldownToRefresh(); //这行代码会隐藏掉 正在加载... 容器
  4. }

上拉加载

第一步,第二步 和下拉刷新的一样

第三步:通过mui.init方法中pullRefresh参数配置下拉刷新各项参数

  1. mui.init({
  2. pullRefresh : {
  3. container:"#pullrefresh",//待刷新区域标识,querySelector能定位的css选择器均可,比如:id、.class等
  4. up : {
  5. contentrefresh : "正在加载...",//可选,正在加载状态时,上拉加载控件上显示的标题内容
  6. contentnomore:'没有更多数据了',//可选,请求完毕若没有更多数据时显示的提醒内容;
  7. callback : fn //必选,刷新函数,根据具体业务来编写,比如通过ajax从服务器获取新数据;
  8. }
  9. }
  10. });

第四步:设置执行函数

  1. function fn() {
  2. //业务逻辑代码,比如通过ajax从服务器获取新数据; ...... //注意,加载完新数据后,必须执行如下代码,true表示没有更多数据了,
  3. 两个注意事项: //1、若为ajax请求,则需将如下代码放置在处理完ajax响应数据之后 //
  4. 2、注意this的作用域,若存在匿名函数,需将this复制后使用
  5. var _this = this;
  6. _this.endPullupToRefresh(true|false);
  7. }

上拉下拉整合

第一步,第二步和下拉刷新一样

第三步:在mui.init()内同时设置上拉加载和下拉刷新

  1. mui.init({
  2. pullRefresh: {
  3. container: '#pullrefresh',
  4. down: {
  5. contentdown : "下拉可以刷新",//可选,在下拉可刷新状态时,下拉刷新控件上显示的标题内容
  6. contentover : "释放立即刷新",//可选,在释放可刷新状态时,下拉刷新控件上显示的标题内容
  7. contentrefresh : "正在刷新...",//可选,正在刷新状态时,下拉刷新控件上显示的标题内容
  8. callback: downFn // 下拉执行函数
  9. },
  10. up: {
  11. contentrefresh: '正在加载...',
  12. callback: upFn // 上拉执行函数
  13. }
  14. }
  15. });

注意: 给获取元素加onclick点击事件不行,需要加addEventListener自定义事件

手势

在开发移动端的应用时,会用到很多的手势操作,比如滑动、长按等,为了方便开放者快速集成这些手势,mui内置了常用的手势事件,目前支持的手势事件见如下列表:

分类 参数描述
点击
tap 单击屏幕
doubletap 双击屏幕
长按
longtap 长按屏幕
hold 按住屏幕
release 离开屏幕
滑动
swipeleft 向左滑动
swiperight 向右滑动
swipeup 向上滑动
swipedown 向下滑动
拖动
dragstart 开始拖动
drag 拖动中
dragend 拖动结束
  1. mui.init({
  2. gestureConfig:{
  3. tap: true, //默认为true
  4. doubletap: true, //默认为false
  5. longtap: true, //默认为false
  6. swipe: true, //默认为true
  7. drag: true, //默认为true
  8. hold:false,//默认为false,不监听
  9. release:false//默认为false,不监听
  10. }
  11. });

注意:dragstart、drag、dragend共用drag开关,swipeleft、swiperight、swipeup、swipedown共用swipe开关

  1. 你要监听的对象.addEventListener("swipeleft",function(){
  2. console.log("你正在向左滑动");
  3. });

遮罩

在popover、侧滑菜单等界面,经常会用到蒙版遮罩;比如popover弹出后,除popover控件外的其它区域都会遮罩一层蒙版,用户点击蒙版不会触发蒙版下方的逻辑,而会关闭popover同时关闭蒙版;再比如侧滑菜单界面,菜单划出后,除侧滑菜单之外的其它区域都会遮罩一层蒙版,用户点击蒙版会关闭侧滑菜单同时关闭蒙版。

遮罩蒙版常用的操作包括:创建、显示、关闭,如下代码:

  1. var mask = mui.createMask(callback);//callback为用户点击蒙版时自动执行的回调;
  2. mask.show();//显示遮罩
  3. mask.close();//关闭遮罩
  4. 遮罩css样式: .mui-backdrop

滑动导航选择

mui提供了图片轮播、可拖动式图文表格、可拖动式选项卡、左右滑动9宫格组件,这些组件都用到了mui框架的slide插件,有较多共同点。首先,Dom内容构造基本相同,都必须有一个.mui-slider的父容器;其次,当拖动切换显示内容时,均会触发slide事件(可拖动式选项卡在点击选项卡标题时,也会触发slide事件),通过该事件的detail.slideNumber参数可以获得当前显示项的索引(第一项索引为0,第二项为1,以此类推),利用该事件,可在显示内容切换时,动态处理一些业务逻辑。

HTML部分:

  1. <div class="mui-slider">
  2. <!--选项卡标题区-->
  3. <div class="mui-slider-indicator mui-segmented-control mui-segmented-control-inverted">
  4. <a class="mui-control-item" href="#item1">待办公文</a>
  5. <a class="mui-control-item" href="#item2">已办公文</a>
  6. <a class="mui-control-item" href="#item3">全部公文</a>
  7. </div>
  8. <div class="mui-slider-progress-bar mui-col-xs-4"></div>
  9. <div class="mui-slider-group">
  10. <!--第一个选项卡内容区-->
  11. <div id="item1" class="mui-slider-item mui-control-content mui-active">
  12. <ul class="mui-table-view">
  13. <li class="mui-table-view-cell">待办公文1</li>
  14. <li class="mui-table-view-cell">待办公文2</li>
  15. <li class="mui-table-view-cell">待办公文3</li>
  16. </ul>
  17. </div>
  18. <!--第二个选项卡内容区,页面加载时为空-->
  19. <div id="item2" class="mui-slider-item mui-control-content"><ul class="mui-table-view">
  20. <li class="mui-table-view-cell">待办公文1</li>
  21. <li class="mui-table-view-cell">待办公文2</li>
  22. <li class="mui-table-view-cell">待办公文3</li>
  23. </ul></div>
  24. <!--第三个选项卡内容区,页面加载时为空-->
  25. <div id="item3" class="mui-slider-item mui-control-content"></div>
  26. </div>
  27. </div>

JavaScript部分

  1. var item2Show = false,item3Show = false;//子选项卡是否显示标志
  2. document.querySelector('.mui-slider').addEventListener('slide', function(event) {
  3. if (event.detail.slideNumber === 1&&!item2Show) {
  4. //切换到第二个选项卡
  5. //根据具体业务,动态获得第二个选项卡内容;
  6. var content = 'er';
  7. //显示内容
  8. document.getElementById("item2").innerHTML = content;
  9. //改变标志位,下次直接显示
  10. item2Show = true;
  11. } else if (event.detail.slideNumber === 2&&!item3Show) {
  12. //切换到第三个选项卡
  13. //根据具体业务,动态获得第三个选项卡内容;
  14. var content = 'san';
  15. //显示内容
  16. document.getElementById("item3").innerHTML = content;
  17. //改变标志位,下次直接显示
  18. item3Show = true;
  19. }
  20. });

图片轮播

支持循环

HTML部分:

  1. <div class="mui-slider">
  2. <div class="mui-slider-group mui-slider-loop">
  3. <!--支持循环,需要重复图片节点-->
  4. <div class="mui-slider-item mui-slider-item-duplicate"><a href="#"><img src="images/2.jpg" /></a></div>
  5. <div class="mui-slider-item"><a href="#"><img src="images/0.jpg" /></a></div>
  6. <div class="mui-slider-item"><a href="#"><img src="images/1.jpg" /></a></div>
  7. <div class="mui-slider-item"><a href="#"><img src="images/2.jpg" /></a></div>
  8. <!--支持循环,需要重复图片节点-->
  9. <div class="mui-slider-item mui-slider-item-duplicate"><a href="#"><img src="images/0.jpg" /></a></div>
  10. </div>
  11. </div>

不支持循环和循环不同的是没有再第一条和最后一条后面加入内容

HTML部分:

  1. <div class="mui-slider">
  2. <div class="mui-slider-group">
  3. <div class="mui-slider-item"><a href="#"><img src="images/0.jpg" /></a></div>
  4. <div class="mui-slider-item"><a href="#"><img src="images/1.jpg" /></a></div>
  5. <div class="mui-slider-item"><a href="#"><img src="images/2.jpg" /></a></div>
  6. <!--<div class="mui-slider-item"><a href="#"><img src="4.jpg" /></a></div>-->
  7. </div>
  8. </div>

JavaScript部分相同:

  1. //获得slider插件对象
  2. var gallery = mui('.mui-slider');
  3. gallery.slider({
  4. interval:5000//自动轮播周期,若为0则不自动播放,默认为0;
  5. });
  6. document.querySelector('.mui-slider').addEventListener('slide', function(event) {
  7. //注意slideNumber是从0开始的;
  8. alert("你正在看第"+(event.detail.slideNumber+1)+"张图片");
  9. });

注意:如果ajax获得图片后,需要在写入图片以后,需要从新调用一下

  1. gallery.slider();

自定义导航

第一步:将一下代码写在header(mHeader) 和 content(mBody) 之间

  1. 首页
  2. 科技
  3. 娱乐
  4. 财经
  5. 北京
  6. 军事
  7. 社会
  8. 汽车
  9. 视频
  10. 美女

第二步:引入writebug_nav.css 和writebug_nav.js

第三步:执行函数

  1. writebug_nav(function(index,data){ // index 为点击索引 data为点击导航的文本内容
  2. console.log(index);
  3. console.log(data);
  4. });

Ajax-get请求

  1. // get测试请求地址 http://test.write-bug.com/link_app/get?state=index&num=0
  2. mui.get('接口地址',{ //请求接口地址
  3. state:'index' // 参数 键 :值
  4. num:'0'
  5. },function(data){ // data为服务器端返回数据
  6. //获得服务器响应 ...
  7. console.log(data);
  8. },'json'
  9. );

Ajax-post请求

  1. // post测试请求地址 http://test.write-bug.com/link_app/post
  2. mui.post('接口地址',{ //请求接口地址
  3. state:'index', // 参数 键 :值
  4. num:'0'
  5. },
  6. function(data){ //data为服务器端返回数据
  7. //自己的逻辑
  8. },'json'
  9. );

照相机

  1. var cmr = plus.camera.getCamera();
  2. cmr.captureImage( function ( p ) {
  3. //成功
  4. plus.io.resolveLocalFileSystemURL( p, function ( entry ) {
  5. var img_name = entry.name;//获得图片名称
  6. var img_path = entry.toLocalURL();//获得图片路径
  7. }, function ( e ) {
  8. console.log( "读取拍照文件错误:"+e.message );
  9. } );
  10. }, function ( e ) {
  11. console.log( "失败:"+e.message );
  12. }, {filename:'_doc/camera/',index:1} ); // “_doc/camera/“ 为保存文件名

访问相册

  1. plus.gallery.pick( function(path){
  2. img.src = path;//获得图片路径
  3. }, function ( e ) {
  4. console.log( "取消选择图片" );
  5. }, {filter:"image"} );

蜂鸣提示音

  1. switch ( plus.os.name ) { //判断设备类型
  2. case "iOS":
  3. if ( plus.device.model.indexOf("iPhone") >= 0 ) { //判断是否为iPhone
  4. plus.device.beep();
  5. console.log = "设备蜂鸣中...";
  6. } else {
  7. console.log = "此设备不支持蜂鸣";
  8. }
  9. break;
  10. default:
  11. plus.device.beep();
  12. console.log = "设备蜂鸣中...";
  13. break;
  14. }

手机震动

  1. switch ( plus.os.name ) { //判断设备类型
  2. case "iOS":
  3. if ( plus.device.model.indexOf("iPhone") >= 0 ) { //判断是否为iPhone
  4. plus.device.vibrate();
  5. console.log("设备振动中...");
  6. } else {
  7. console.log("此设备不支持振动");
  8. }
  9. break;
  10. default:
  11. plus.device.vibrate();
  12. console.log("设备振动中...");
  13. break;
  14. }

弹出菜单

弹出菜单的原理主要是通过锚点进行的,如果需要多个弹出菜单,可以在a标签内设置锚点,对应相应的div的id即可

  1. <a href="#popover">打开弹出菜单</a> // href 定义锚点
  2. <div id="popover" class="mui-popover"> //id 对应锚点
  3. <ul class="mui-table-view">
  4. <li class="mui-table-view-cell"><a href="#">Item1</a></li>
  5. <li class="mui-table-view-cell"><a href="#">Item2</a></li>
  6. <li class="mui-table-view-cell"><a href="#">Item3</a></li>
  7. <li class="mui-table-view-cell"><a href="#">Item4</a></li>
  8. <li class="mui-table-view-cell"><a href="#">Item5</a></li>
  9. </ul>
  10. </div>

设备信息

  1. plus.device.model //设备型号
  2. plus.device.vendor //设备的生产厂商
  3. plus.device.imei // IMEI 设备的国际移动设备身份码
  4. plus.device.uuid // UUID 设备的唯一标识
  5. // IMSI 设备的国际移动用户识别码
  6. var str = '';
  7. for ( i=0; i<plus.device.imsi.length; i++ ) {
  8. str += plus.device.imsi[i];
  9. }
  10. plus.screen.resolutionWidth*plus.screen.scale + " x " + plus.screen.resolutionHeight*plus.screen.scale ;
  11. //屏幕分辨率
  12. plus.screen.dpiX + " x " + plus.screen.dpiY; //DPI每英寸像素数

手机信息

  1. plus.os.name //名称
  2. plus.os.version //版本
  3. plus.os.language //语言
  4. plus.os.vendor //厂商
  5. //网络类型
  6. var types = {};
  7. types[plus.networkinfo.CONNECTION_UNKNOW] = "未知";
  8. types[plus.networkinfo.CONNECTION_NONE] = "未连接网络";
  9. types[plus.networkinfo.CONNECTION_ETHERNET] = "有线网络";
  10. types[plus.networkinfo.CONNECTION_WIFI] = "WiFi网络";
  11. types[plus.networkinfo.CONNECTION_CELL2G] = "2G蜂窝网络";
  12. types[plus.networkinfo.CONNECTION_CELL3G] = "3G蜂窝网络";
  13. types[plus.networkinfo.CONNECTION_CELL4G] = "4G蜂窝网络";
  14. var network = types[plus.networkinfo.getCurrentType()];

发送短信

  1. <a href=“sms:10086">发送短信
  2. var msg = plus.messaging.createMessage(plus.messaging.TYPE_SMS);
  3. msg.to = ['13800138000', '13800138001'];
  4. msg.body = 'WRITE-BUG https://www.write-bug.com';
  5. plus.messaging.sendMessage( msg );

拨打电话

  1. <a href="tel:10086">拨打电话</a>

发送邮件

  1. <a href="mailto:write-bug@writebug.com">发送邮件到WRITE-BUG</a>

本地存储

  1. //设置
  2. plus.storage.setItem('键','值'); -> plus.storage.setItem('name','writebug');
  3. //查询
  4. plus.storage.getItem('键'); -> var name = plus.storage.getItem('name');
  5. //删除
  6. plus.storage.removeItem('键'); -> plus.storage.removeItem('name');
  7. //全部清除
  8. plus.storage.clear();
  9. //HTML5自带 - 设置
  10. localStorage.setItem('键','值'); -> localStorage.setItem('name','writebug');
  11. //HTML5自带 - 查询
  12. localStorage.getItem('键'); -> var name = localStorage.setItem('name');
  13. //HTML5自带 - 删除
  14. localStorage.removeItem('键'); -> localStorage.removeItem('name');

图片上传

  1. //初始上传地址
  2. var server="http://test.write-bug.com/upload_file.php";
  3. var files=[]; //图片存放的数组 可以上传一个,或者多个图片
  4. //上传图片
  5. function upload_img(p){
  6. //又初始化了一下文件数组 为了支持我的单个上传,如果你要一次上传多个,就不要在写这一行了
  7. //注意
  8. files=[];
  9. var n=p.substr(p.lastIndexOf('/')+1);
  10. files.push({name:"uploadkey",path:p});
  11. //开始上传
  12. start_upload();
  13. }
  14. //开始上传
  15. function start_upload(){
  16. if(files.length<=0){
  17. plus.nativeUI.alert("没有添加上传文件!");
  18. return;
  19. }
  20. //原生的转圈等待框
  21. var wt=plus.nativeUI.showWaiting();
  22. var task=plus.uploader.createUpload(server,
  23. {method:"POST"},
  24. function(t,status){ //上传完成
  25. alert(status);
  26. if(status==200){
  27. //资源
  28. var responseText = t.responseText;
  29. //转换成json
  30. var json = eval('(' + responseText + ')');
  31. //上传文件的信息
  32. var files = json.files;
  33. //上传成功以后的保存路径
  34. var img_url = files.uploadkey.url;
  35. //ajax 写入数据库
  36. //关闭转圈等待框
  37. wt.close();
  38. }else{
  39. console.log("上传失败:"+status);
  40. //关闭原生的转圈等待框
  41. wt.close();
  42. }
  43. });
  44. task.addData("client","");
  45. task.addData("uid",getUid());
  46. for(var i=0;i<files.length;i++){
  47. var f=files[i];
  48. task.addFile(f.path,{key:f.name});
  49. }
  50. task.start();
  51. }
  52. // 产生一个随机数
  53. function getUid(){
  54. return Math.floor(Math.random()*100000000+10000000).toString();
  55. }

地理位置

直接获取地理位置

  1. plus.geolocation.getCurrentPosition( geoInfo, function ( e ) {
  2. alert( "获取位置信息失败:"+e.message );
  3. } );

监听地理位置

  1. var watchId; //开关 函数外层定义
  2. if ( watchId ) {
  3. return;
  4. }
  5. watchId = plus.geolocation.watchPosition( function ( p ) {
  6. alert( "监听位置变化信息:" );
  7. geoInfo( p );
  8. }, function ( e ) {
  9. alert( "监听位置变化信息失败:"+e.message );
  10. });

停止监听地理位置

  1. if ( watchId ) {
  2. alert( "停止监听位置变化信息" );
  3. plus.geolocation.clearWatch( watchId );
  4. watchId = null;
  5. }
  6. //获得具体地理位置
  7. //获取设备位置信息
  8. function geoInfo(position){
  9. var timeflag = position.timestamp;//获取到地理位置信息的时间戳;一个毫秒数;
  10. var codns = position.coords;//获取地理坐标信息;
  11. var lat = codns.latitude;//获取到当前位置的纬度;
  12. var longt = codns.longitude;//获取到当前位置的经度
  13. var alt = codns.altitude;//获取到当前位置的海拔信息;
  14. var accu = codns.accuracy;//地理坐标信息精确度信息;
  15. var altAcc = codns.altitudeAccuracy;//获取海拔信息的精确度;
  16. var head = codns.heading;//获取设备的移动方向;
  17. var sped = codns.speed;//获取设备的移动速度;
  18. //百度地图申请地址
  19. // http://lbsyun.baidu.com/apiconsole/key
  20. // http://api.map.baidu.com/geocoder/v2/?output=json&ak=你从百度申请到的Key&location=纬度(Latitude),经度(Longitude)
  21. // http://api.map.baidu.com/geocoder/v2/?output=json&ak=BFd9490df8a776482552006c538d6b27&location=40.065639,116.419413
  22. //详细地址
  23. //http://api.map.baidu.com/geocoder/v2/?ak=eIxDStjzbtH0WtU50gqdXYCz&output=json&pois=1&location=40.065639,116.419413
  24. var baidu_map = "http://api.map.baidu.com/geocoder/v2/?output=json&ak=BFd9490df8a776482552006c538d6b27&location="+lat+','+longt;
  25. mui.get(baidu_map,{ //请求的地址
  26. },
  27. function(data){ //服务器返回响应,根据响应结果,分析是否登录成功; ...
  28. var result = data['result'].addressComponent;
  29. // 国家
  30. var country = result['country'];
  31. //城市
  32. var city = result['city'];;
  33. //地址
  34. var address = result['province'] + result['district'] + result['street'];
  35. //data 有很多信息,大家如果需要可以for in出来看下
  36. },'json'
  37. );
  38. }

设置IOS状态栏

  1. mui.plusReady(function(){
  2. if(mui.os.ios){
  3. //UIStatusBarStyleDefault //字体深色
  4. //UIStatusBarStyleBlackOpaque //字体浅色
  5. plus.navigator.setStatusBarStyle('UIStatusBarStyleBlackOpaque');
  6. plus.navigator.setStatusBarBackground("#007aff"); //背景颜色
  7. }
  8. })

手机通讯录

  1. mui.plusReady(function(){
  2. //访问手机通讯录 plus.contacts.ADDRESSBOOK_PHONE
  3. //访问SIM卡通讯录 plus.contacts.ADDRESSBOOK_SIM
  4. plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE,function(addressbook){
  5. addressbook.find(null,function (contacts){
  6. for(var a in contacts){
  7. //这里是安卓手机端的获取方式 ios的不太一样,如果需要这块代码可以联系老师获得
  8. var user = contacts[a].displayName; //联系人
  9. var phone = contacts[a].phoneNumbers[0].value; //手机号码
  10. }
  11. },function ( e ) {alert( "Find contact error: " +e.message );},{multi:true});
  12. });
  13. });

启动页设置

设置手动关闭启动页

  1. manifest.json -> plus -> autoclose 改为 false

关闭启动页

  1. plus.navigator.closeSplashscreen();

PHP后台搭建

在开发工具内下载 AppServ 和 ThinkPHP,AppServ是本地服务器,ThinkPHP是后台框架

  1. ThinkPHP采用单入口模式 index -> 控制器 -> 方法
  2. index.php 内书写如下:
  3. define("APP_NAME",'WEB'); //站点名称
  4. define("APP_PATH",'./WEB/'); //站点路径
  5. define("APP_DEBUG",true);//开启调试模式
  6. require("./ThinkPHP/ThinkPHP.php");// 引入框架文件

JSON转换

  1. JSON.parse()和JSON.stringify()
  2. 1.parse 用于从一个字符串中解析出json 对象。例如
  3. var str='{"name":"zxd学院","age":"23"}'
  4. JSON.parse(str) 得到:
  5. Object: age:"23"
  6. name:"zxd学院"
  7. ps:单引号写在{}外,每个属性都必须双引号,否则会抛出异常
  8. 2.stringify用于从一个对象解析出字符串,例如
  9. var a={a:1,b:2}
  10. JSON.stringify(a)得到:
  11. '{"a":1,"b":2}'

隐藏本页面中滚动条

  1. var self = plus.webview.currentWebview();
  2. self.setStyle({
  3. bounce: 'none', //禁止弹动
  4. scrollIndicator: 'none' //隐藏滚动条
  5. });

首次启动欢迎页

首先引入writebug_welcome.css 和 writebug_welcome.js 文件

  1. <div id="slider" class="mui-slider" >
  2. <div class="mui-slider-group">
  3. <!-- 第一张 -->
  4. <div class="mui-slider-item">
  5. <img src="img/shuijiao.jpg">
  6. </div>
  7. <!-- 第二张 -->
  8. <div class="mui-slider-item">
  9. <img src="img/muwu.jpg">
  10. </div>
  11. <!-- 第三张 -->
  12. <div class="mui-slider-item">
  13. <img src="img/cbd.jpg">
  14. </div>
  15. <!-- 第四张 -->
  16. <div class="mui-slider-item">
  17. <img src="img/yuantiao.jpg">
  18. <button id="dy_enter">立即进入</button>
  19. </div>
  20. </div>
  21. <div class="mui-slider-indicator">
  22. <div class="mui-indicator mui-active"></div>
  23. <div class="mui-indicator"></div>
  24. <div class="mui-indicator"></div>
  25. <div class="mui-indicator"></div>
  26. </div>
  27. </div>
  1. writebug_welcome({
  2. preLoadUrl:'main.html',//预加载页面url
  3. preLoadId:'main',//预加载页面id
  4. });

数据库增删改查和接口

  1. Class UserAction extends Action {
  2. /**
  3. * 添加数据
  4. */
  5. public function add(){
  6. $data['phone'] = '1380013800';
  7. $data['name'] = 'yidong';
  8. // M = model M('你要操作的数据表')->方法
  9. $re = M('user')->add($data);
  10. //输出
  11. echo $re;
  12. // 添加数据返回值 是数据的id
  13. }
  14. /**
  15. * 修改数据
  16. */
  17. public function mod(){
  18. $data['phone'] = '130013000';
  19. $id = 1;
  20. $re = M('user')->where("`id`='$id'")->save($data);
  21. echo $re;
  22. //修改数据 返回值为1是成功 0为失败
  23. }
  24. /**
  25. * 删除数据
  26. */
  27. public function del(){
  28. $id = '2';
  29. $re = M('user')->where("`id`='$id'")->delete();
  30. echo $re;
  31. // 删除 返回值为1也是成功 0 为失败
  32. }
  33. /**
  34. * 查询数据
  35. */
  36. public function select(){
  37. //单条带条件查询
  38. $id = '1';
  39. $arr1 = M('user')->where("`id`='$id'")->find();
  40. // dump($arr1);
  41. // 多条不带条件查询 查询数据库内所有的数据 不建议使用
  42. $arr2 = M('user')->select();
  43. // dump($arr2);
  44. // 多条带条件查询
  45. $phone = '1380013800';
  46. $arr3 = M('user')->where("`phone`='$phone'")->select();
  47. // dump($arr3);
  48. // 排序
  49. // asc 正序
  50. // desc 倒序
  51. $arr4 = M('user')->where("`phone`='$phone'")->order("id desc")->select();
  52. // dump($arr4);
  53. // 分页 limit
  54. // limit(参数1); 一个参数的情况下 拿多少条数据
  55. // limit(参数1,参数2); 二个参数的情况下 第一个参数是从多少条开始拿,第二个参数还是拿多少条
  56. // $arr5 = M('user')->order("id desc")->limit(2)->select();
  57. // dump($arr5);
  58. $arr6 = M('user')->order("id desc")->limit(2,2)->select();
  59. // dump($arr6);
  60. //返回json数据 给我们APP
  61. echo json_encode($arr6);
  62. // 接口地址
  63. // http://127.0.0.1/www/xianshang14/index.php/User/select
  64. }
  65. }

推送

注册个推,获得APPKEY、APPID、MASTERSECRET

推送信息必须打包安装手机后才能使用,主要是通过client_id来进行对每个用户进行推送,首先我们需要在数据库的用户表内添加一个client_id 的字段(在用户注册的时候或者在每次登录的时候存入用户的新client_id,保证推送的有效性),为存放我们用户的client_id,比如这里是个商城,你购买完商品,系统会推送一条信息给你,你只需要告诉程序,你要推送人的手机号码,标题,内容即可(如需要点击信息到达订单页面,需要用透传来实现),服务器获得手机号码以后会在数据库内查找,并获得该用户的client_id,然后实现推送。这里要根据自己的情况来写逻辑,比如WRITE-BUG课堂的分类,前端,后端,数据库等分类,如果我有一个课程上线,我可以推送给这些对某一类感兴趣的学员。当然更多的逻辑需要你自己来写,群发我们可以理解成,循环发送多个单条的(单条发送已经测试没问题,群发没测试,大家可以自己测试一下,有问题随时反馈过来)。

由于推送信息的多样性,本次封装仅对本APP注册用户进行推送,如需要全员推送,可直接使用个推官网创建信息的方式直接推送。

推送步骤:

  • 右上角下载推送包

  • single.php (推送单个普通推送/可透传,点击信息可打开APP,透传可写逻辑,透传需要) (透传格式:{“path”:“course”,id:“2”}
    openPath.php (推送打开页面信息,点击信息可在浏览器打开你传入的URL)
    download.php (推送下载信息,点击信息可下载你传入URL的文件)

  • 简单粗暴的设置一下这3个文件内的14行APPKEY,15行APPID,16行MASTERSECRET为你在个推得到的APPKEY、APPID、MASTERSECRET

如下我只写了一个实例,单条普通信息推送。

PHP端代码:

在PHP Action文件夹内建立了一个 PushAction.class.php 的文件

  1. Class PushAction extends Action {
  2. //单个信息推送 透传
  3. public function single(){
  4. $title = $_GET['title_data'];
  5. $content = $_GET['content_data'];
  6. $phone = $_GET['phone_data'];
  7. $pass = $_GET['pass_data'];
  8. if($title == '' || $content == '' || $phone == ''){
  9. exit;
  10. }
  11. $user = M('user')->where("`phone`='$phone'")->find();
  12. $cid = $user['client_id'];
  13. $url = 'http://' .$_SERVER['HTTP_HOST'] . . '/Push/single?title='.$title.'&content='.$content.'&cid='.$cid.'&pass='.$pass;
  14. $html = file_get_contents($url);
  15. echo $html;
  16. }
  17. }

APP端代码 我在index文件中:

  1. // 监听在线消息事件
  2. plus.push.addEventListener( "receive", function( msg ) {
  3. if ( msg.aps ) { // Apple APNS message
  4. // alert( "接收到在线APNS消息:" );
  5. } else {
  6. // alert( "接收到在线透传消息:" );
  7. }
  8. var login_phone = localStorage.getItem('你存入的登录信息');
  9. var content = msg.content;
  10. var json = eval('('+content+')');
  11. var path = json.path;
  12. var id = json.id;
  13. //订单
  14. if(path == 'order'){
  15. if(login_phone){
  16. dui.jump('./Home/order.html','order');
  17. }
  18. }else if(path == 'course'){
  19. localStorage.setItem('writebug_cid',id);
  20. dui.jump('./Course/course_detail.html','course_detail');
  21. }else if(path == 'message'){
  22. if(login_phone){
  23. if(id == 'system'){
  24. dui.jump('./Message/system_message.html','system_message');
  25. }else{
  26. dui.jump('./Message/chat_message.html','chat_message');
  27. }
  28. }
  29. }
  30. }, false );

以上PHP代码可以配合后台,给特定人群推送,逻辑需要大家实现了,因为每个APP的逻辑都不一样

浏览器打开新页面

  1. plus.runtime.openURL( url );

PDF浏览

IOS端内可以直接打开

安卓端方式

  • 调用本地第三方浏览器打开

    1. mui.plusReady(function(){
    2. plus.runtime.openFile( "./file/node_js.pdf" );
    3. });
  • 引入第三方js类打开

自定义下拉刷新

双webview写到父页面里面

  1. .mui-pull-top-pocket{
  2. top:100px !important;
  3. position: absolute;
  4. }
  5. .mui-pull-caption {
  6. background: red;;
  7. background-size: contain;
  8. background-repeat: no-repeat;
  9. background-position: center;
  10. width: 144px;
  11. height: 31px;
  12. font-size: 0px;
  13. }
  14. /*下拉刷新圆形进度条的大小和样式*/
  15. .mui-spinner {
  16. width: 32px;
  17. height: 32px;
  18. }
  19. .mui-spinner:after {
  20. background: red;
  21. }
  22. /*下拉刷新的箭头颜色*/
  23. .mui-icon-pulldown {
  24. color: #FF058B;
  25. }

即时聊天

即时聊天采用野狗无后端模式,野狗: https://www.wilddog.com/

引入文件

  1. <script src = "https://cdn.wilddog.com/js/client/current/wilddog.js" ></script>

写入数据

  1. // new Wilddog message 为自己定义的一个表或者空间,用于放我们的聊天记录
  2. var wd = new Wilddog('https://write-bug.wilddogio.com/message');
  3. btn.addEventListener('tap',function(){
  4. var content = text.value;
  5. //记录发布时间戳
  6. var date = new Date();
  7. var time = date.getTime();
  8. //插入数据
  9. //第一个参数单独的一个空间,比如两个人聊天,他们就是在单独的一个空间聊天, message 里面可以有很多个独立的空间,比如 张三和李四 是一个空间 王五和赵六又是一个空间
  10. //第二个参数是你发布信息的时间,我们以时间作为信息的依据,通过时间的排序我们的聊天记录
  11. //第三个参数是一个json,为我们的聊天信息,比如 昵称,头像,内容,表情,时间
  12. wd.child('1').child(time).set({
  13. 'name':'write-bug',
  14. 'content':content,
  15. 'time':time
  16. // ...更多
  17. });
  18. })

获得数据

  1. // 监听聊天内容变化
  2. var listen = "https://write-bug.wilddogio.com/message/1";
  3. var listen_wd = new Wilddog(listen);
  4. listen_wd.on('child_added',function(data){
  5. list.innerHTML += ''
  6. +' '+data.val().name+' '+data.val().time+''
  7. +' '+data.val().content+''
  8. +'';
  9. console.log(data.val().name);
  10. })

删除

  1. //1为空间名,1442293959023为某一条信息
  2. var ref = new Wilddog("https://writ-ebug.wilddogio.com/message/1/1442293959023");
  3. ref.remove()

时间转换函数

  1. function getLocalTime(nS) {
  2. var mydate = new Date(nS);
  3. var today = '';
  4. // today += mydate.getFullYear() + '年'; //返回年份
  5. // today += mydate.getMonth()+1 + '月'; //返回月份,因为返回值是0开始,表示1月,所以做+1处理
  6. // today += mydate.getDate() + '日'; //返回日期
  7. today += mydate.getHours() + ':';
  8. if(mydate.getMinutes() < 10){
  9. var min = '0'+mydate.getMinutes();
  10. }else{
  11. var min = mydate.getMinutes();
  12. }
  13. today += min + ':';
  14. today += mydate.getSeconds();
  15. return today;
  16. }

设置滚动条高度

  1. document.body.scrollTop = document.body.offsetHeight;

双击安卓返回键退出

  1. //监听安卓返回键
  2. var first = null;
  3. mui.back = function() {
  4. if (!first) {
  5. first = new Date().getTime();
  6. mui.toast('再按一次退出应用');
  7. setTimeout(function() {
  8. first = null;
  9. }, 1000);
  10. } else {
  11. if (new Date().getTime() - first < 1000) {
  12. plus.runtime.quit();
  13. }
  14. }
  15. }

QQ登录

  1. var auths={};
  2. mui.plusReady(function(){
  3. // 获取登录认证通道
  4. plus.oauth.getServices(function(services){
  5. for(var i in services){
  6. var service=services[i];
  7. auths[service.id]=service;
  8. }
  9. },function(e){
  10. outLine("获取登录认证失败:"+e.message);
  11. });
  12. });

调用认证事件

  1. // id 为 qq,weixin,weibo
  2. function login(id){
  3. console.log("----- 登录认证 -----");
  4. var auth=auths[id];
  5. if(auth){
  6. var w=plus.nativeUI.showWaiting();
  7. document.addEventListener("pause",function(){
  8. setTimeout(function(){
  9. w&&w.close();w=null;
  10. },2000);
  11. }, false );
  12. auth.login(function(){
  13. w&&w.close();w=null;
  14. console.log("登录认证成功:");
  15. console.log(JSON.stringify(auth.authResult));
  16. userinfo(auth);
  17. },function(e){
  18. w&&w.close();w=null;
  19. console.log("登录认证失败:");
  20. console.log("["+e.code+"]:"+e.message);
  21. plus.nativeUI.alert("详情错误信息请参考授权登录(OAuth)规范文档:http://www.html5plus.org/#specification#/specification/OAuth.html",null,"登录失败["+e.code+"]:"+e.message);
  22. });
  23. }else{
  24. console.log("无效的登录认证通道!");
  25. plus.nativeUI.alert("无效的登录认证通道!",null,"登录");
  26. }
  27. }
  28. // 获取用户信息
  29. function userinfo(a){
  30. console.log("----- 获取用户信息 -----");
  31. a.getUserInfo(function(){
  32. console.log("获取用户信息成功:");
  33. console.log(JSON.stringify(a.userInfo));
  34. var nickname=a.userInfo.nickname||a.userInfo.name;
  35. plus.nativeUI.alert("欢迎“"+nickname+"”登录!");
  36. },function(e){
  37. console.log("获取用户信息失败:");
  38. console.log("["+e.code+"]:"+e.message);
  39. plus.nativeUI.alert("获取用户信息失败!",null,"登录");
  40. });
  41. }
  42. // 注销登录
  43. function logoutAll(){
  44. console.log("----- 注销登录认证 -----");
  45. for(var i in auths){
  46. logout(auths[i]);
  47. }
  48. }
  49. function logout(auth){
  50. auth.logout(function(){
  51. outLine("注销\""+auth.description+"\"成功");
  52. },function(e){
  53. outLine("注销\""+auth.description+"\"失败:"+e.message);
  54. });
  55. }
上传的附件

keyboard_arrow_left上一篇 : 把修改/更新过的项目重新提交至github上 大数据 15、分类算法 -LR : 下一篇keyboard_arrow_right



primadonna
2019-03-06 21:42:11
分享到这里,做个备份吧~
Mockingjay
2019-03-07 08:54:46
很详细,有用
Naiiive
2019-03-07 13:40:02
厉害,好认真啊
Tenderne
2019-03-08 13:01:03
学习学习
楠柯一梦
2019-05-13 14:47:43
非常使用的分享,mark。

发送私信

生活就像骑自行车,只有不断前进,才能保持平衡

16
文章数
14
评论数
最近文章
eject