634 lines
17 KiB
JavaScript
634 lines
17 KiB
JavaScript
/*
|
||
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;
|
||
//<span>
|
||
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");
|
||
}
|
||
|
||
})
|
||
|
||
});
|
||
|