/* author:dushaobin email:shaobin.du@3g2win.com description:appcan常用插件 created:2014,08.18 update:chenxue:xue.chen3g2win.com */ /*global appcan,window */ appcan.use("detect", function($, detect) { if (detect.os.ios) { var viewport = document.getElementsByName("viewport"); var scale = window.devicePixelRatio ? (1 / window.devicePixelRatio) : 1; $("[name='viewport']").attr("content", "width=device-width,target-densitydpi=device-dpi,initial-scale=" + scale + ", minimum-scale=" + scale + ", maximum-scale=" + scale); var fontsize = $("body").css("font-size"); $("body").css("font-size", parseInt(fontsize) * window.devicePixelRatio + "px"); } }) appcan.extend(function(app, exports, module) { var $ = appcan.require('dom'); var appWin = appcan.require('window'); var locStorage = appcan.require('locStorage'); var view = appcan.require('view'); /* * 兼容pc,移动设备的封装 * @param String className 要更改的class * @param Functon fun 执行结束后的回调 * * */ function isWindows() { if(window.navigator.platform == "Win32") return true; if (!('ontouchstart' in window)) return true; } function button(selector, className, fun) { $(selector).on(isWindows() ? "mousedown" : "touchstart", function() { appcan.touch(className, fun); }) } function updateSwitch(obj) { var value = obj.attr("data-checked") || 'false'; value = (value == 'false' ? 'true' : 'false'); obj.attr("data-checked", value); value == 'false' ? obj.addClass("switch-active") : obj.removeClass("switch-active"); value == 'false' ? obj.removeClass("bc-head") : obj.addClass("bc-head"); } function switchBtn(selector, css, cb) { if ( typeof css == 'function') { cb = css; css = null; } var obj = $(selector); for (var i = 0; i < obj.length; i++) { var value = $(obj[i]).attr("data-checked") || 'false'; value == 'false' ? $(obj[i]).removeClass( css ? css : "bc-head") : $(obj[i]).addClass( css ? css : "bc-head"); } $(selector).on("tap", function(evt) { var obj = $(evt.currentTarget); var value = obj.attr("data-checked") || 'false'; value = (value == 'false' ? 'true' : 'false'); obj.attr("data-checked", value); value == 'false' ? obj.removeClass( css ? css : "bc-head") : obj.addClass( css ? css : "bc-head"); value = value == 'false'?false:true; cb(obj, value); }) } function select(sel, cb) { $("select",$(sel))[0].selectedIndex = -1; var tl =$(sel).find("div[class=text]"); var sl =$(sel).find('select'); var op =sl.find('option'); var index =parseInt(sl.attr('selectedIndex')); if(index != -1){ tl.html(sl[0].options[index].text); } $("select", $(sel)).on("change", function(evt) { var ele = $(evt.currentTarget); appcan.selectChange(evt.currentTarget); cb && cb(ele, ele.val()); }); } function touch(className, fun) { var ele = window.event.currentTarget || window.event.srcElement; var eventType = window.event.type; var hasTouch = ('ontouchstart' in window); var $ele = $(ele); var ed = $ele.data('inline_event_data'); if (ed) { return; } ed = {}; ed.clickFun = $ele.attr('onclick'); ed.startFun = $ele.attr('ontouchstart') || $ele.attr('onmousedown'); ed.endFun = $ele.attr('ontouchend') || $ele.attr('onmouseup'); ed.startClassName = className; ed.startCallFun = fun; ed.endClassName = ed.startClassName; ed.endCallFun = ed.startCallFun; $ele.data('inline_event_data', ed); $ele.attr('onclick', ''); $ele.attr('ontouchstart', ''); $ele.attr('onmousedown', ''); $ele.attr('ontouchend', ''); $ele.attr('onmouseup', ''); if (hasTouch) { //set click and change css $ele.on('touchstart', function() { if (!ed.startClassName) { return; } $(this).addClass(ed.startClassName); }); $ele.on('touchend', function() { if (!ed.endClassName) { return; } $(this).removeClass(ed.endClassName); }); $ele.on('touchcancel', function() { if (!ed.endClassName) { return; } $(this).removeClass(ed.endClassName); }); $ele.on('tap', function() { if (appcan.isFunction(ed.startCallFun)) { ed.startCallFun.apply(this, [].slice.call(arguments)); } var f = new Function(ed.clickFun); f(); }); } else { //just change css $ele.on('mousedown', function() { if (!ed.startClassName) { return; } var that = this; $(this).addClass(ed.startClassName); setTimeout(function(){ $(that).removeClass(ed.endClassName); },300); }); $ele.on('mouseup', function() { if (!ed.endClassName) { return; } $(this).removeClass(ed.endClassName); }); $ele.on('click', function() { if (appcan.isFunction(ed.startCallFun)) { ed.startCallFun.apply(this, [].slice.call(arguments)); } var f = new Function(ed.clickFun); f(); }); } //bind webkitTransitionEnd event $ele.addClass(ed.startClassName); $ele.on('webkitTransitionEnd', function() { }); } /* * 设置相关check元素选中 * @param Event e 点击该元素的事件 * @param Function callback 执行结束后事件回调 todo:同步执行函数没有必要用回调 * * */ function elementFor(e, callback) { var forEle; e = e || window.event; if (e.currentTarget) { forEle = e.currentTarget.previousElementSibling; } else { forEle = e.previousElementSibling; } var $forEle = $(forEle); if ($forEle.prop('tagName') === 'INPUT') { if ($forEle.attr('type') === 'checkbox') { forEle.checked = !forEle.checked; $forEle.trigger("change"); } if ($forEle.attr('type') === 'radio' && !forEle.checked) { forEle.checked = 'checked'; $forEle.trigger("change"); } } if (appcan.isFunction(callback)) { callback(e, forEle.checked); } } /* * 如果是win平太设置body 默认字体 * * */ function initFontsize() { var platform = window.navigator.platform; if (platform.toLowerCase().indexOf('win') > -1 || platform.toLowerCase().indexOf('wow') > -1) { var fs = locStorage.getVal('defaultfontsize'); if (fs) { $('body').css('font-size', fs); } } } /* 下拉列表控件 @param ELE id 下拉列表select标签的对象 */ var selectChange = function(sel) { var sl = $(sel)[0]; if (sl) { var sp = sl.parentElement; // if (sp) { var ch = sp.getElementsByTagName('div')[0]; var t = sl.options[sl.selectedIndex].text; if (ch) { $(ch).html(t); } } } }; /* 字符组去除后面空格 @param Object e event对象 @param Boolean col 布尔值 */ var fold = function(e, col) { e = e || window.event; var a = e.currentTarget.nextElementSibling; if (a.nodeName == 'DIV') { var $a = $(a); if (col) { $a.removeClass('col-c'); } else { $a.addClass('col-c'); } } }; /* parseInt @param String s 字符串 */ var toInt = function(s) { return parseInt(s); }; /* 停止事件的传播 @param Object t */ var stopPropagation = function(t) { if (!t.cancelClick) { t.cancelClick = true; t.addEventListener('click', function() { event.stopPropagation(); }, true); } }; /* * 用指定元素的样式打开一个弹框 * @param String eleId 指定元素的id * @param String url 要打开的连接地址 * @param Int left 距左边的距离 * @param Int top 距上边的距离 * @param String name 窗口名称,默认为id * @param String * */ function openPopoverByEle(eleId, url, left, top, type, name) { if (!eleId) { return; } var ele = $('#' + eleId); appWin.openPopover({ name : ( name ? name : eleId), url : url, left : left, top : top, width : ele.width(), height : ele.height(), type:(type || 0) }); } /* * 简单的模版插件 * * */ var tmpl = function() { var config = { evaluate : /<%([\s\S]+?)%>/g, interpolate : /<%=([\s\S]+?)%>/g, escape : /\${([\s\S]+?)}/g }; var args = [].slice.call(arguments); args.push(config); return view.render.apply(this, args); }; var tmplAppend = function() { var config = { evaluate : /<%([\s\S]+?)%>/g, interpolate : /<%=([\s\S]+?)%>/g, escape : /\${([\s\S]+?)}/g }; var args = [].slice.call(arguments); args.push(config); return view.appendRender.apply(this, args); }; /* * 打开一个新窗口 * @param String name 窗口的名字 * @param String url 要加载的地址 * @param Int aniId 动画效果 * @param int tpye 窗口的类型 0:普通窗口 1:OAuth 窗口 2:加密页面窗口 4:强制刷新 8:url用系统浏览器打开 16:view不透明 32:隐藏的winwdow 64:等待popOver加载完毕后显示 128:支持手势 256:标记opn的window上一个window不隐藏 512:标记呗open的浮动窗口用友打开wabapp @param animDuration 动画时长 * */ function openWinWithUrl(name, url, aniId, type, animDuration) { if (!name) { return; } appcan.window.open({ name : name, data : url, aniId : (aniId || 10), type : (type || 0), animDuration : (animDuration || 300) }); } /* * 关闭窗口 * * */ function closeWin(aniId) { aniId = aniId || -1; appWin.close(aniId); } /* * 设置localstorage的值 * * */ function setLocalVal(key, val) { return locStorage.setVal(key, val); } /* * 获取localstorage的值 * * */ function getLocalVal(key) { return locStorage.getVal(key); } /* * * 在窗口中执行脚本 * * * */ function execScriptInWin(name, scriptContent) { if (!name || !scriptContent) { return; } appWin.evaluateScript({ name : name, scriptContent : scriptContent }); } /* * 初始弹动,无回调方法 */ function initBounce() { appWin.setBounceType('0', 'rgba(255,255,255,0)', 0); appWin.setBounceType('1', 'rgba(255,255,255,0)', 0); } /* * 获取当前对象内属性的个数 * */ function objLength(obj) { var c = 0; if (!obj) { return c; } if (appcan.isArray(obj)) { return obj.length; } else { if (!appcan.isPlainObject(obj)) { return c; } for (var i in obj) { c++; } return c; } } /* * * 获取模版中的开始结束回调 * * @param String k1 last: 或者 first: * */ function getTempCallback(d, c, k1, k2, l) { var q = c.match(/(first:|last:)(\"|\'*)([^\"\']*)(\"|\'*)/); if (!q) { return; } if (q[1] == k1) { if (q[2] == '\"' || q[2] == '\'') { return q[3]; } else { return d[q[3]]; } } else if (q[1] == k2 && l > 1) { return ""; } } /* * * * */ function oldTemp(t, d, i, l, cb) { //匹配出 ${内容} return t.replace(/\$\{([^\}]*)\}/g, function(m, c) { if (c.match(/index:/)) { return i; } if (c.match(/cb:/) && cb) { return cb(d, c.match(/cb:(.*)/)); } if (i == 0) { var s = getTempCallback(d, c, "first:", "last:", l); if (s) { return s; } } if (i == (l - 1)) { var s = getTempCallback(d, c, "last:", "first:", l); if (s) { return s; } } var ar = c.split('.'); var res = d; for (var key in ar) { res = res[ar[key]]; } return res || ""; }); }; /* * * 根据指定的列表返回对应的数据 * */ var oldTempRenderList = function(t, dd, l, cb, scb) { var r = ""; var index = 0; for (var i in dd) { if (scb) { scb(0, i, dd[i]); } var rr = oldTemp(t, dd[i], index, l, cb); if (scb) { scb(1, rr, dd[i]); } r += rr; index++; } return r; }; /* * * 返回指定的数据 * */ function oldTempRender(t, dd, cb) { return oldTemp(t, dd, -1, -1, cb); } /* 按顺序执行 */ function series(tasks,callback){ if(appcan.isFunction(tasks)){ callback = tasks; tasks = []; } callback = appcan.isFunction(callback) ? callback : function() { }; var errData = 0; var resData = null; var taskIdx = 0; function nextTask(){ if(taskIdx >= tasks.length){ callback(0); return; } var tsk = tasks[taskIdx]; if(tsk && appcan.isFunction(tsk)){ try{ if(tsk(function(err,data){ if(err === 0){ taskIdx++; nextTask(); }else{ //结束任务 callback(err,data); return; } }) === false){ //结束任务 callback(0); return; } }catch(e){ callback(e); } } } nextTask(); } //for emulator $(document).ready(function() { }); initFontsize(); module.exports = { elementFor : elementFor, touch : touch, initFontsize : initFontsize, openPopoverByEle : openPopoverByEle, resizePopoverByEle : appWin.resizePopoverByEle, tmpl : tmpl, tmplAppend : tmplAppend, openWinWithUrl : openWinWithUrl, closeWin : closeWin, closePopover : appWin.closePopover, setLocVal : setLocalVal, getLocVal : getLocalVal, execScriptInWin : execScriptInWin, bringPopoverToFront : appWin.bringPopoverToFront, initBounce : initBounce, evaluatePopoverScript : appWin.evaluatePopoverScript, alert : appWin.alert, getObjLength : objLength, getTempCallback : getTempCallback, temp : oldTemp, tempRenderList : oldTempRenderList, tempRender : oldTempRender, stopPropagation : stopPropagation, toInt : toInt, selectChange : selectChange, fold : fold, button : button, select : select, "switch": switchBtn, switchBtn : switchBtn, series:series, updateSwitch:updateSwitch }; }); appcan.ready(function(){ appcan.widgetOne.getPlatform(function(err,data,dataType,opId){ if(data=="0"){ $("body").addClass("uh_ios"); } }) });