/**
* cmp核,cmp的全部框架和提供的一些框架内实用的工具类,包括<br>
* <ul>
* <li>语言环境判断</li>
* <li>运行环境判断</li>
* <li>网络环境判断</li>
* <li>设备型号</li>
* <li>ajax</li>
* <li>页面跳转历史堆栈</li>
* <li>html模板引擎</li>
* <li>手机端事件处理等</li>
* <li>常用的js原生对象进行扩展</li>
* </ul>
*
* @module Core
*/
/**
* html模板引擎
* @namespace cmp
* @class tpl
* @constructor
* @param {String} str;模板html字符串
* @param {Object} data:插入的数据
* @example
* ```
* <script>
* cmp.tpl("<span><%=this.id %></span><div><% if(d){ %><span>hah</span><% }else{ %> sahhdas<% } %></div>",{id:"123456"})//模板和jsp的格式一致
* </script>
* ```
* @returns {String} 返回有数据展示的组装后的Html字符串
*/
/**
* 程序运行平台类<br>
* @class platform
*/
/**
* 获取当前登录语言环境
* @namespace cmp
* @method language
* @example
* ```
* <script>
* cmp.language
* </script>
* ```
* @returns {String} 语言环境<br>
* <ul>
* <li>zh-CN:简体中文环境</li>
* <li>zh-TW:繁体中文环境</li>
* <li>en:英文环境</li>
* </ul>
*/
/**
* 获取移动端平台环境
* @namespace cmp
* @method os
* @returns {Boolean} 移动端平台环境<br>
* <ul>
* <li>cmp.os.mobile:是否为移动终端</li>
* <li>cmp.os.ios:是否为ios终端</li>
* <li>cmp.os.android:android终端或uc浏览器</li>
* <li>cmp.os.iPhone:是否为iPhone或者QQHD浏览器</li>
* <li>cmp.os.iPad:是否iPad</li>
* </ul>
* @example
* ```
* <script>
* cmp.os
* </script>
* ```
*/
/**
* 获取移动端平台版本号
* @namespace cmp
* @method version
* @returns {String} 移动端平台版本号<br>
* @example
* ```
* <script>
* cmp.os.version
* </script>
* ```
*/
/**
* 获取程序运行平台环境
* @namespace cmp
* @method platform
* @returns {Boolean} 移动端平台环境<br>
* <ul>
* <li>cmp.platform.wechat:判断是否是微信的壳</li>
* <li>cmp.platform.CMPShell:判断是否是CMP的壳</li>
* </ul>
* @example
* ```
* <script>
* cmp.platform
* </script>
* ```
*/
/**
* 获取移动设备信息
* @namespace cmp
* @method info
* @returns {Object}CMPDevice 获取移动设备信息<br>
* <ul>
* <li>CMPDevice.available:设备</li>
* <li>CMPDevice.platform:设备平台</li>
* <li>CMPDevice.version:设备版本</li>
* <li>CMPDevice.uuid:设备id</li>
* <li>CMPDevice.model:设备型号</li>
* <li>CMPDevice.manufacturer:设备生成厂家</li>
* <li>CMPDevice.enbrand:设备牌子(英文)</li>
* <li>CMPDevice.cnbrand:设备牌子(中文)</li>
* </ul>
* @example
* ```
* <script>
* cmp.device.info()
* </script>
* ```
*/
/**
* 获取平台运行m3工程的ip地址,用于数据请求的ip拼接,如http://10.5.6.240:88
* @namespace cmp
* @method serverIp
* @returns {String} m3工程ip地址<br>
* 兼容cmp和微信端
* @example
* ```
* <script>
* cmp.serverIp//该值为常量
* </script>
* ```
*/
/**
* 获取平台运行m3工程,如http://10.5.6.240:88/seeyon
* @namespace cmp
* @method origin
* @returns {String} m3工程<br>
* 兼容cmp和微信端
* @example
* ```
* <script>
* cmp.origin//该值为常量
* </script>
* ```
*/
/**
* 获取平台运行m3工程(seeyon工程),如http://10.5.6.240:88/seeyon
* @namespace cmp
* @method seeyonbasepath
* @returns {String} m3工程<br>
* 兼容cmp和微信端
* @example
* ```
* <script>
* cmp.seeyonbasepath//该值为常量
* </script>
* ```
*/
/**
* 获取平台运行m3工程,当前登录人员token值
* @namespace cmp
* @method token
* @returns {String} 当前登录人员token值<br>
* 适配微信端
* @example
* ```
* <script>
* cmp.token//该值为常量
* </script>
* ```
*/
/**
* 获取平台运行m3工程,当前登录人员信息
* @namespace cmp
* @method member
* @returns {Object} 当前登录人员信息<br>
* 适配cmp壳
* @example
* ```
* <script>
* cmp.member//该值为常量
* </script>
* ```
*/
/**
* 封装的部分移动端常用的事件:<br>
* @class event
*/
/**
* 监听页面的ready事件,兼容了cmp壳和微信、pc端<br>
* <span style="color:red">!cmp壳必须通过此ready才能入口</span>
* @method ready
* @namespace cmp.event
* @param {Function} fn ready后的回调函数,即呈现的入口函数
* @example
* ```
* <script>
* cmp.ready(function (){});
* </script>
* ```
*/
/**
* 主动触发事件
* @method trigger
* @namespace cmp.event
* @param {String} type 主动触发的事件类型,比如click,tap等
* @param {Object} dom 主动触发事件的dom对象
* @example
* ```
* <script>
* cmp.event.trigger("tap",dom1);
* </script>
* ```
*/
/**
* cmp封装的点击事件,优化了在手机端,tap、click事件的延迟问题和点穿问题
* @method click
* @namespace cmp.event
* @param {Object} dom 绑定事件的dom
* @param {Function} fun 事件绑定的回调函数
* @example
* ```
* <script>
* cmp.event.click(dom1,function(){
* //do something
* });
* </script>
* ```
*/
/**
* 移动端长按事件 默认长按700毫秒就会促发事件
* @method touchHold
* @namespace cmp.event
* @param {Object} dom 绑定事件的dom
* @param {Function} fun 事件绑定的回调函数
* @example
* ```
* <script>
* cmp.event.touchHold(dom1,function(){
* //do something
* });
* </script>
* ```
*/
/**
* 页面缓存<br>
* 封装了H5原生的localStorage和sessionStorage的增删改查
* @class storage
*/
/**
* 保存缓存数据
* @method save
* @namespace cmp.storage
* @param {String} key 保存的缓存的key名字
* @param {String} value 保存的key对应的value值
* @param {Boolean} scope 是否启用sessionStorage,true :启用,false,不启用,使用的是localStorage
* @example
* ```
* <script>
* cmp.storage.save("name","cmp");
* </script>
* ```
*/
/**
* 获取缓存数据
* @method get
* @namespace cmp.storage
* @param {String} key 获取的缓存的key名字
* @param {Boolean} scope 是否启用sessionStorage,true :启用,false,不启用,使用的是localStorage
* @example
* ```
* <script>
* cmp.storage.get("name");
* </script>
* ```
* @return {String} 返回缓存的数据
*/
/**
* 需要删除的缓存数据
* @method delete
* @namespace cmp.storage
* @param {String} key 获取的缓存的key名字
* @param {Boolean} scope 是否启用sessionStorage,true :启用,false,不启用,使用的是localStorage
* @example
* ```
* <script>
* cmp.storage.delete("name");
* </script>
* ```
*/
/**
* 清空所有缓存数据
* @method deleteAll
* @namespace cmp.storage
* @param {Boolean} scope 是否启用sessionStorage,true :启用,false,不启用,使用的是localStorage
* @example
* ```
* <script>
* cmp.storage.deleteAll();
* </script>
* ```
*/
/**
* 获取所有缓存数据的个数
* @method size
* @namespace cmp.storage
* @param {Boolean} scope 是否启用sessionStorage,true :启用,false,不启用,使用的是localStorage
* @example
* ```
* <script>
* cmp.storage.size();
* </script>
* ```
* @return {Number} 返回个数
*/
/**
* 将dom抽取成json数据,用于页面跳转前,将页面状态的数据进行记忆
* @method dom2json
* @namespace cmp.storage
* @param {Array} domains 需要被抽取成json数据的dom的id数组,该dom数组的id,应该包括,页面中的textarea,input,select有输入情况的控件
* @example
* ```
* <script>
* cmp.storage.dom2json(["input1","input2","textarea1"]);
* </script>
* ```
* @return {Object} 返回组装好的json对象
*/
/**
* 将json数据回填进之前记忆的dom中
* @method json2dom
* @namespace cmp.storage
* @param {Object} json 将json对象,跳转之前记忆的数据
* @example
* ```
* <script>
* cmp.storage.json2dom({});
* </script>
* ```
*/
/**
* ajax
* @namespace cmp
* @class ajax
* @constructor
* @param {Object} options 配置参数
* @param {String} options.type ajax请求类型,"GET"或者"POST",默认get
* @param {String/Object} [options.data] 请求参数,接受字符串,或者formData
* @param {String} options.url 请求地址
* @param {Object} [options.headers] 请求header
* @param {String} [options.dataType] 参数类型 默认json,接受formData
* @param {Number} [options.timeout] 请求超时设置,默认60000(单位:毫秒)
* @param {Function} [options.success] 请求成功回调
* @param {Function} [options.error] 请求失败回调
*
* @example
* ```
* <script>
* cmp.ajax({
* type:"POST",
* data:JSON.stringify(body),
* url:"http://xxxxx",
* header:{
* 'Content-Type': 'application/json; charset=utf-8',
* 'Accept-Language' : "zh-CN",
* },
* dataType:"json",
* success:function(result){
* //do something with success result;
* },
* error:function(error){
* //do something with error
* }
* });
* </script>
* ```
*/
/**
* webview 操作(只支持在cmp壳里进行操作)
* @class webview
*/
/**
* 打开webview<br>
* <span style="color:red;">在一个应用中不能开启太多的webview,最多三个,这样会导致性能问题</span>
* @method openWebView
* @namespace cmp
* @constructor
* @param {Object} options 配置参数
* @param {String} options.url 需要webview装载的url地址
* @param {Boolean} [options.isNew] 是否是新开的一个webview,默认:true
* @param {String} options.header 原生导航栏标题
* @param {Boolean} [options.useNativebanner] 是否显示原生导航栏,默认:false,如果为true:android端原生导航栏会占一个高度为44px导航栏,ios端是64像素
* @param {Number} [options.iOSStatusBarStyle] ios状态栏颜色0=黑色 1=白色
* @param {Function} [options.success] 成功回调
* @param {Function} [options.error] 失败回调
*
* @example
* ```
* <script>
* cmp.openWebView({
* url: "",
* isNew: true,
* header: "header",
* useNativebanner:false, //是否显示原生导航栏
* "iOSStatusBarStyle":"", // ios状态栏颜色0=黑色 1=白色
* success: null,
* error: null
* });
* </script>
* ```
*/
/**
* openWebView的扩展<br>
* 只打开主webview,其他的子webview全部被关闭
* @namespace cmp
* @method openRootWebView
* @constructor
* @param {Object} options 配置参数
* @param {String} options.url 需要webview装载的url地址
* @param {Boolean} [options.isNew] 是否是新开的一个webview,默认:true
* @param {String} options.header 原生导航栏标题
* @param {Boolean} [options.useNativebanner] 是否显示原生导航栏,默认:false,如果为true:android端原生导航栏会占一个高度为44px导航栏,ios端是64像素
* @param {Number} [options.iOSStatusBarStyle] ios状态栏颜色0=黑色 1=白色
* @param {Function} [options.success] 成功回调
* @param {Function} [options.error] 失败回调
*
* @example
* ```
* <script>
* cmp.openRootWebView({
* url: "",
* isNew: true,
* header: "header",
* useNativebanner:false, //是否显示原生导航栏
* "iOSStatusBarStyle":"", // ios状态栏颜色0=黑色 1=白色
* success: null,
* error: null
* });
* </script>
* ```
*/
/**
* 关闭当前webview
* @namespace cmp
* @method closeWebView
* @constructor
* @param {Object} options 配置参数
* @param {Function} [options.success] 成功回调
* @param {Function} [options.error] 失败回调
*
* @example
* ```
* <script>
* cmp.closeWebView({
* success: null,
* error: null
* });
* </script>
* ```
*/
/**
* 判断当前程序运行的webview是否是主webview<br>
* @namespace cmp
* @method isRootWebView
* @constructor
* @param {Object} options 配置参数
* @param {Function} [options.success] 判断成功后的回调,会将判断值以{value:1}返回,如果value为1说明是主webview,如果为0则不是
* @param {Function} [options.error] 失败回调
*
* @example
* ```
* <script>
* cmp.isRootWebView({
* success: function(result){
* var value = result.value;
* if(value == 1){
* //是主webview
* }else {
* //不是主webview
* }
* },
* error: null
* });
* </script>
* ```
*/
/**
* 页面转场<br>
* <ul>
* <li>为了避免在移动端,页面之间跳转在下一个页面还没有渲染出内容时,出现白屏的情况</li>
* <li>自定义跳转的动画切换,目前只提供从左向右和从右向左的动画,android是盖了一个进度圈</li>
* <li>当开始页面转场时,一个历史记录堆栈会被创建,并开始向这个堆栈存取删堆栈等操作</li>
* <li>该转场机制包含页面前进回退等一套,页面业务逻辑的堆栈,处理了模块与模块之间跳转页面历史记录堆栈混乱</li>
* <li>页面之间传参和取参</li>
* </ul>
* @class href
*/
/**
* 跳转到下一页<br>
* 当跳转时,当前页面的url会进入历史记录堆栈中,如果是传有参数,该参数和当前url一起被记录进历史记录中
* @namespace cmp.href
* @method next
* @constructor
* @param {String} url 需要跳转的页面
* @param {String/Object} [params] 传递到下一个页面的参数
* @param {String/Object} [options] 跳转到下一页的动画效果,
* <ul>
* <li>String:"left":从右向左(默认);"right":从左到右</li>
* <li>Object:{
* animated:true//是否开启动画(默认true),
* direction:"left"/"right" //动画方向
* }</li>
* </ul>
*
* @example
* ```
* <script>
* cmp.href.next("http://seeyon/m3/app/xxx.html",{data:"haha"},"left");
* </script>
* ```
*/
/**
* 返回上一页或返回上N页<br>
* 当返回上一页时,组件会进行堆栈的删除,回退几个页面就删除几个堆栈<br>
* <span style="color:red;">特别说明一下,开发在next几个页面,回退时就最多回退next的几个,不然,组件如果判断出超出了堆栈,则默认回退到前一个页面,如果堆栈中都没有了,则会关闭当前的webview</span>
* @namespace cmp.href
* @method back
* @constructor
* @param {Number} [backIndex] 需要回退的页面数,默认不传,是回退上一页(注:请传正数)
* @param {String/Object} [queryParams] 回退页面时传递的参数,接受字符串和Object
* <ul>
* <li>String:如果是字符串,则等于queryParams即传给前面页面的search,如:"?backData=haha",该字符串会被拼接上回退的url地址上</li>
* <li>Object:{
* queryParams:"?backData=haha"
* data:{name:"haha"}//存入缓存的数据
* }</li>
* </ul>
*
* @example
* ```
* <script>
* cmp.href.back(5,{
* queryParams:"?backData=haha",
* data:{name:"haha"}
* });
* </script>
* ```
*/
/**
* 跳转到指定页面<br>
* 当调用此方式进行跳转,页面和参数不会进入历史记录的堆栈中
* @namespace cmp.href
* @method go
* @constructor
* @param {String} url 需要跳转的页面
* @param {String/Object} [params] 传递到下一个页面的参数
* @param {String/Object} [options] 跳转到下一页的动画效果,
* <ul>
* <li>String:"left":从右向左(默认);"right":从左到右</li>
* <li>Object:{
* animated:true//是否开启动画(默认true),
* direction:"left"/"right" //动画方向
* }</li>
* </ul>
*
* @example
* ```
* <script>
* cmp.href.go("http://seeyon/m3/app/xxx.html",{data:"haha"},"left");
* </script>
* ```
*/
/**
* 关闭页面,并清空历史记录堆栈<br>
* 当调用此方法时,页面会被关闭,历史记录被清空,常常用于开发者认为再回退就应该关闭页面的情况<br>
* 如果是cmp壳端,效果是关闭当前webview;微信端是退出微协同
* @namespace cmp.href
* @method closePage
* @constructor
* @example
* ```
* <script>
* cmp.href.closePage();
* </script>
* ```
*/
/**
* 获取跳转传递参数<br>
* 页面next或go到指定页面时,在该页面获取到跳转前传递的参数
* @namespace cmp.href
* @method getParam
* @constructor
* @param {String} [paramKey] 获取传递参数指定的key的值,默认:不传值,将存入的数据全部返回
* @example
* ```
* <script>
* cmp.href.getParam();
* </script>
* ```
* @return {String/Object} 返回传递数据,或传递数据的指定的key值
*/
/**
* 获取back回退传递参数<br>
* 页面back到指定页面时,在该页面获取到跳转前传递的参数
* @namespace cmp.href
* @method getBackParam
* @constructor
* @param {String} [paramKey] 获取传递参数指定的key的值,默认:不传值,将存入的数据全部返回
* @example
* ```
* <script>
* cmp.href.getBackParam();
* </script>
* ```
* @return {String/Object} 返回传递数据,或传递数据的指定的key值
*/
/**
* 弹框类<br>
* 封装了一套统一风格的弹出类提示框
* <ul>
* <li>alert</li>
* <li>comfirm</li>
* <li>.....</li>
* </ul>
* @class notification
*/
/**
* 三个选项的提示框
* @namespace cmp
* @method judge
* @param {String} msg 消息内容
* @param {Function} [callback] 警告消失时执行的回调函数(默认:关闭组件)
* @param {String} [title] 警告标题,(默认:judge)
* @param {String} [btnLabels] 按钮名称,(默认:YES,NO,Cancel)
* @param {String} [icon] 提示内容中的图标路径
* @example
* ```
* <script>
* cmp.notification.judge("进行判断的提示",function(index){
* if(index == 0){
* //点击了第一个按钮
* }else if(index == 1){
* //点击了第二个按钮
* }else if(index == 2){
* //点击了第三个按钮
* }
* },"提示",["确定","否","取消"],"http://www.baidu.com/log.png");
* </script>
* ```
*/
/**
* 警告框
* @namespace cmp
* @method alert
* @param {String} msg 消息内容
* @param {Function} [callback] 警告消失时执行的回调函数(默认:关闭组件)
* @param {String} [title] 警告标题,(默认:Alert)
* @param {String} [btnName] 按钮名称,(默认:OK)
* @example
* ```
* <script>
* cmp.notification.alert("进行alert的提示",function(){
* //do something after tap button
* },"提示","确定");
* </script>
* ```
*/
/**
* 确认框
* @namespace cmp
* @method confirm
* @param {String} msg 消息内容
* @param {Function} callback 当点击确认消息按钮时(索引是:0|1),确认消息消失时调用
* @param {String} [title] 警告标题(默认:Confirm)
* @param {Array} [btnLabels]按钮名称数组(默认:['OK','Cancel'])
* @param {String} [icon] 用于弹出框装饰性的标识,可以传任何可以用于html显示的图片、css处理好的文字等,如:<br>
* <ul>
* <li>如果是图片:"< img src='http://...' style='width:12px;height:12px'>"</li>
* <li>如果是文字:"< div style='...'>需要显示的文字< /div>"</li>
* </ul>
* @example
* ```
* <script>
* cmp.notification.confirm("进行确认的提示",function(index){
* if(index == 0){
* //点击了第一个按钮
* }else if(index == 1){
* //点击了第二个按钮
* }
* },"确认",["确定","取消"],"http://www.baidu.com/log.png");
* </script>
* ```
*/
/**
* 自动消失提示框,常用于移动端不需要操作的提示,简化移动端的交互操作
* @namespace cmp
* @method toast
* @param {String} msg 提醒消息内容
* @param {String} [position] 提示框在页面显示的位置,接受以下值:<br>
* <ul>
* <li>top:在页面顶部显示</li>
* <li>center:在页面中间显示</li>
* <li>bottom:在页面底部显示(默认)</li>
* </ul>
* @param {Number} [time] 消息显示时间(单位:毫秒;默认:2000)
* @example
* ```
* <script>
* cmp.notification.toast("自动消失的提示框","center",1000);
* </script>
* ```
*/
/**
* 可输入提示框
* @method prompt
* @namespace cmp
* @param {String} title 可选,警告标题,默认是Prompt
* @param {Function} callback 当点击确认消息按钮时(索引是:1|2|3),确认消息消失时调用
* @param {Array} [btnLabels] 可选,按钮名称数组,默认是['OK','Cancel']
* @param {String} [placeholder] 可选,输入控件的提示占位符,默认空字符串
* @param {String} [defaultVal] 可选,输入控件的默认值,默认空字符串
* @param {Number} [type] 可选,输入框的类型,默认text,其中,1,text ,2,password,3,number
* @example
* ```
* <script>
* cmp.notification.prompt("输入提示框",function(){
* if(index == 0){
* //点击了第一个按钮
* }else if(index == 1){
* //点击了第二个按钮
* }
* },["确认","取消"],"这是一个输入占位符","默认值","text");
* </script>
* ```
*/
/**
* 只适用于iOS平台的获取iOS设备在设置中对应用的消息推送的开关状态
* @method getPushState
* @namespace cmp
* @param {Function} callback 回调函数,组件将处理结果返回,格式:<br>
* <ul>
* <li>true:允许通知</li>
* <li>false:不允许,非iOS平台会一直返回false</li>
* </ul>
* @example
* ```
* <script>
* cmp.notification.getPushState("输入提示框",function(result){
* //do something with result
* });
* </script>
* ```
*/
/**
* 进一步封装的弹框类<br>
* 符合大多数情况的弹框提示使用
* @class dialog
*/
/**
* 成功提示函数
* @method success
* @namespace cmp
* @param {String} msg 提示的消息内容
* @param {Function} [callback] 当点击确认消息按钮时,组件返回按钮索引(索引是:0|1),确认消息消失时调用(默认:组件自动关闭)
* @param {String} [title] 警告标题,默认是Success
* @param {Array} [btnLabels] 可选,按钮名称数组,默认是['OK','Cancel']
* @example
* ```
* <script>
* cmp.dialog.success("成功提示",function(index){
* //do something with result
* },"成功",["确认","取消"]);
* </script>
* ```
*/
/**
* 错误提示函数
* @method error
* @namespace cmp
* @param {String} msg 提示的消息内容
* @param {Function} [callback] 当点击确认消息按钮时,组件返回按钮索引(索引是:0|1),确认消息消失时调用(默认:组件自动关闭)
* @param {String} [title] 警告标题,默认是Success
* @param {Array} [btnLabels] 可选,按钮名称数组,默认是['OK','Cancel']
* @example
* ```
* <script>
* cmp.dialog.error("错误提示",function(index){
* //do something with result
* },"错误",["确认","取消"]);
* </script>
* ```
*/
/**
* 异常提示函数
* @method failure
* @namespace cmp
* @param {String} msg 提示的消息内容
* @param {Function} [callback] 当点击确认消息按钮时,组件返回按钮索引(索引是:0|1),确认消息消失时调用(默认:组件自动关闭)
* @param {String} [title] 警告标题,默认是Success
* @param {Array} [btnLabels] 可选,按钮名称数组,默认是['OK','Cancel']
* @example
* ```
* <script>
* cmp.dialog.failure("异常提示",function(index){
* //do something with result
* },"异常",["确认","取消"]);
* </script>
* ```
*/
/**
* 警告提示函数
* @method warning
* @namespace cmp
* @param {String} msg 提示的消息内容
* @param {Function} [callback] 当点击确认消息按钮时,组件返回按钮索引(索引是:0|1),确认消息消失时调用(默认:组件自动关闭)
* @param {String} [title] 警告标题,默认是Success
* @param {Array} [btnLabels] 可选,按钮名称数组,默认是['OK','Cancel']
* @example
* ```
* <script>
* cmp.dialog.warning("警告提示",function(index){
* //do something with result
* },"警告",["确认","取消"]);
* </script>
* ```
*/
/**
* 表形式操作框组弹出框,常见于移动端弹出拍照、选择相册的选择操作中
* @method actionSheet
* @namespace cmp
* @param {Array} items 操作组item,格式:<br>
* [
* {key:1,name:'操作组item1'},
* {key:2,name:'操作组item2'}
* ]
* @param {String} [cancelText] 最底部 取消按钮的显示文本 (默认:Cancel)
* @param {Function} [selCallback] item被点击选择的回调函数 组件将该item的信息格式传入<br>
* {key:1,name:"操作组item1"}
* @param {Function} [cancelCallback] 点击取消按钮的回调函数(默认:关闭组件)
* @example
* ```
* <script>
* cmp.dialog.actionSheet([{key:1,name:"操作组item1"}],"取消",function selectedCallback(result){
* //do something with result
* },function cancelCallback(){
* //do something with tap cancel button
* });
* </script>
* ```
*/
/**
* 弹出一个list对话框(可滚动),常用于有多条数据需要以列表的形式展示和选择的时候
* @method list
* @namespace cmp
* @param items items数组,格式:<br>
* [
* 'item1','item2','item3'
* ]
* @param [cancelText] 最底部 取消按钮的显示文本 默认 Cancel
* @param [selCallback] item选择回调函数,将返回参数传入,格式:"item1"
* @param [cancelCallback] 点击取消按钮的回调函数(默认:组件自动关闭)
* @example
* ```
* <script>
* cmp.dialog.list([{key:1,name:"操作组item1"}],"list标题","取消",function selectedCallback(result){
* //do something with result
* },function cancelCallback(){
* //do something with tap cancel button
* });
* </script>
* ```
*/
/**
* 显示或则关闭进度弹出框,经常用于页面加载或者文件上传时等待的动画提示
* @method loading
* @namespace cmp
* @param {Boolean|String} [isShow] <br>
* <ul>
* <li>true/不定义:显示组件</li>
* <li>false:不显示组件</li>
* <li>String:字符串的话显示圈圈下面的文字</li>
* </ul>
* @example
* ```
* <script>
* cmp.dialog.loading(); / cmp.dialog.loading(false); /cmp.dialog.loading("加载中...");
* </script>
* ```
*/
/**
* 模拟的Map<br>
* @class map
*/
/**
* 通过调用此方法,构建一个新的Map对象,进行map的类似操作
* @method build
* @namespace cmp
* @constructor
* @example
* ```
* <script>
* var map = cmp.map.build() //生成一个map对象
* map.put("key","value");//向该map对象存入数据
* var value = map.get("key");//获取对应key的值
* map.remove("key") //删除map中的key
* map.clear() //清空map
* var keys = map.keys() //获取map中所有的key,以数组的方式返回
* var values = map.values()//获取map中所有的value,以数组的方式返回
* map.containsKey("key") //判断map中是否包含某个key值
* map.containsValue("value") //判断map中是否包含某个value值
* var length = map.size() //获取map存入数据的个数
* map.isEmpty() //判断map是否为空
* </script>
* ```
* @return {Object} map 对象<br>
*/
/**
* 移动端物理回退键监听机制,由于在移动端,android手机的物理回退键和微信浏览器左上角回退按钮的存在,当页面中有弹窗出现时,用户点击了回退键,
* 默认是回退到了上一个页面,并不是用户想要的关闭弹框,由于这个缺陷的存在,cmp提供一套回退按钮监听机制,使各模块开发处理该问题时
* 统一处理,并达到,低耦合状态,其机制为:<br>
* 当进入回退按钮机制时,全部模块或应用需要对回退按钮进行监听时,进入一个堆栈状态,即:先进后出原则,先被放入堆栈中的回退方法,最后被执行,
* 各模块开发统一在这个堆栈里操作,进出栈由开发者自行控制,各模块开发,只需要把自己的堆栈逻辑处理好,cmp进行统一管理
* <ul>
* <li>cmp壳端:监听android物理回退键</li>
* <li>微信端:监听android物理回退键+微信浏览器左上角自带回退按钮android和ios</li>
* </ul>
* @class backbutton
*/
/**
* 想要进入回退按钮监听机制,需要调这个函数,兼容了cmp端和微信端
* @method backbutton
* @namespace cmp
* @constructor
* @example
* ```
* <script>
* cmp.backbutton();
* </script>
* ```
*/
/**
* 开发者者调用此方法将需要监听回退键执行的函数放入堆栈
* @method push
* @namespace cmp
* @constructor
* @param {Function} func 需要回退按钮执行的函数
* @example
* ```
* <script>
* cmp.backbutton.push(closeSelectOrg);
* </script>
* ```
*/
/**
* 开发者者调用此方法将需要监听回退键执行的函数取出堆栈,并将这个栈顶函数进行trigger执行<br>
* 其取出的即为堆栈中的栈顶,一般用在:<br>
* 如一个弹框,有一个关闭按钮,该关闭按钮的事件绑定就应该将该的主动调用的事件,将堆栈中的栈顶退出,避免已经关闭了该弹框,栈中的函数还存在,导致和其他模块的栈冲突
* @method pop
* @namespace cmp
* @constructor
* @example
* ```
* <script>
* cmp.backbutton.pop();
* </script>
* ```
*/
/**
* 工具类<br>
* @class util
*/
/**
* 对象合并工具,生成一个新对象
* @namespace cmp
* @method extend
* @param {Object} object1;被合并的对象
* @param {Object} object2:合并的对象
* @example
* ```
* <script>
* cmp.extend({key1:null,key2:"key2default"},{key1:"key1Value",key2:"key2newValue"}) //合并的值为{key1:"key1Value",key2:"key2Value"}
* </script>
* ```
* @returns {Object} 返回一个合并后的新对象
*/
/**
* uuid 生成器
* @namespace cmp
* @method buildUUID
* @param {Number} [len] 自定义生成的uuid的长度(可以不定义)
* @example
* ```
* <script>
* cmp.buildUUID()
* </script>
* ```
* @returns {String} uuid
*/
/**
* 将timestamps 转为 yyyy-MM-dd hh:mm格式(此方法兼容了时区导致的时间不与中国时间同步的问题)
* @namespace cmp
* @method time
* @param {Number} ms 毫秒值(1970年至今的毫秒数)
* @param {Boolean} withDate 是否包含日期 不传默认不包含日期
* @example
* ```
* <script>
* cmp.time(182738127,true)
* </script>
* ```
* @returns {String} 日期格式的字符串,如2016-08-31 8:10:10
*/
/**
* 添加可直接append html字符串的方法
* @namespace cmp
* @method append
* @param {HtmlObject} parent //父容器
* @param {String} html //html字符串(请注意需要传html格式的字符串)
* @example
* ```
* <script>
* var parent = document.getElementById("parent");
* var htmlString = "<div class='cmp-class' style="color:red">被append进行的html</div>"
* cmp.append(parent,htmlString)
* </script>
* ```
*/
/**
* 在指定的元素的前面添加 html字符串
* @namespace cmp
* @method before
* @param {HtmlObject} target //指定的html元素
* @param {String} html //html字符串(请注意需要传html格式的字符串)
* @example
* ```
* <script>
* var target = document.getElementById("target");
* var htmlString = "<div class='cmp-class' style="color:red">被before进行的html</div>"
* cmp.before(target,htmlString)
* </script>
* ```
*/
/**
* 在指定的元素的后面添加html字符串
* @namespace cmp
* @method after
* @param {HtmlObject} target //指定的html元素
* @param {String} html //html字符串(请注意需要传html格式的字符串)
* @example
* ```
* <script>
* var target = document.getElementById("target");
* var htmlString = "<div class='cmp-class' style="color:red">被before进行的html</div>"
* cmp.after(target,htmlString)
* </script>
* ```
*/
/**
* 获取指定元素的绝对top值
* @namespace cmp
* @method getTop
* @param {HtmlObject} target //指定的html元素
* @example
* ```
* <script>
* var target = document.getElementById("target");
* cmp.getTop(target)
* </script>
* ```
* @returns {Number} 返回元素处于页面中的绝对top值
*/
/**
* 获取指定元素的绝对left值
* @namespace cmp
* @method getLeft
* @param {HtmlObject} target //指定的html元素
* @example
* ```
* <script>
* var target = document.getElementById("target");
* cmp.getLeft(target)
* </script>
* ```
* @returns {Number} 返回元素处于页面中的绝对left值
*/
/**
* 查询指定元素的所有父元素
* @namespace cmp
* @method parents
* @param {HtmlObject} target 指定的html元素
* @param {String} attr 过滤属性,如果定义了attr参数,则查询指定元素的父元素中有该属性的父元素
* @example
* ```
* <script>
* var target = document.getElementById("target");
* cmp.parents(target,"binded") //获取所有有binded属性的父元素
* </script>
* ```
*/
/**
* 对常用的js原生对象扩展,提供常用的方法,包括:<br>
* <ul>
* <li>Date对象扩展</li>
* <li>String对象扩展</li>
* <li>Array对象扩展</li>
* </ul>
* @class ObjectExtension
*/
/**
* 给Date对象添加格式化函数
* @namespace cmp
* @method format
* @param format 格式化字符串
* @example
* ```
* <script>
* var date = new Date();
* var formatDate = date.format("yyyy-MM-dd hh:mm:ss")
* //formatData = 2012-12-12 12:12:12
* </script>
* ```
* @returns {String} 日期格式化字符串,如2012-12-12
*/
/**
* String trim方法,替换所有空格,换行符、tab符
* @namespace cmp
* @method trim
* @example
* ```
* <script>
* var str = "cmp is a very goodle ";
* str = str.trim()
* //str = cmpisaverygoodle
* </script>
* ```
* @returns {String} 无空格、换行符、tab的字符串
*/
/**
* 获取该字符串的字符长度,兼容中文(两个字符的情况)
* @namespace cmp
* @method getBytesLength
* @example
* ```
* <script>
* var str = "cmp is a very 中国 goodle ";
* var length = str.getBytesLength()
* //length = 26
* </script>
* ```
* @returns {Number} 字符串的字符长度
*/
/**
* 截取字符串的最大长度
* @namespace cmp
* @method getLimitLength
* @param {Number} maxlengh 截取的字符串的最大长度
* @param {String|Boolean} [symbol] 是否截取完后带上后缀,如:...
* @example
* ```
* <script>
* var str = "helloworld";
* var nexStr = str.getLimitLength(5,"...");
* //nexStr = hello...;
* </script>
* ```
* @returns {String} 截取长度后的字符串
*/
/**
* 替换字符串中的特殊转义符,以使字符串在html被正确解释
* @namespace cmp
* @method escapeHTML
* @example
* ```
* <script>
* var str = "helloworld<javascript>alert(\"haha\")</javascript><span>lala</span>&&'\"<br>换个行";
* var nexStr = str.escapeHTML();
* //nexStr = helloworld<javascript>alert("haha")</javascript><span;>lala</span>&'" 换个行
* </script>
* ```
* @returns {String} 无html转义的字符串
*/
/**
* 判断字符串是否以某个字符开头
* @namespace cmp
* @method startsWith
* @param {String} prefix 前缀字符
* @example
* ```
* <script>
* var str = "cmp is a very 中国 goodle ";
* var result = str.startsWith("c");
* //result = true
* </script>
* ```
* @returns {Boolean}
*/
/**
* 判断字符串是否以某个字符结尾
* @namespace cmp
* @method endsWith
* @param {String} subfix 后缀字符
* @example
* ```
* <script>
* var str = "cmp is a very 中国 goodle ";
* var result = str.endsWith("e")
* //result = true
* </script>
* ```
* @returns {Boolean}
*/
/**
* 判断数组是否有某个item
* @namespace cmp
* @method inArray
* @param {String|Number|Object} item 存在于数组中任何可能的值
* @example
* ```
* <script>
* var arr = ["value1","value2"];
* var result = arr.inArray("value2");
* //result = true
* </script>
* ```
* @returns {Boolean}
*/
/**
* 删除数组中某个item(前提是保证这个item存在于该数组中)
* @namespace cmp
* @method delItem
* @param {String|Number|Object} item 存在于数组中任何可能的值
* @example
* ```
* <script>
* var arr = ["value1","value2"];
* var newArr = arr.delItem("value2");
* //newArr = ["value1"]
* </script>
* ```
* @returns {Array} 新数组
*/