如果是knockout监听对象那么可封装
define(function (require) {
'use strict';
var lib = {
ko: require('ko'),
$: require('jquery'),
_: require('lodash'),
jedate: require('jedate'),
};
var model = {
user: require('oa!app/model/IBP/User'),
};
var helper = {
settings: require('app/helper/settings'),
func: require('oa!app/helper/func'),
date: require('oa!app/helper/date'),
};
var registerOAChecked = function () {
lib.ko.bindingHandlers['oa-checked'] = {
init: function (element, valueAccessor) {
if (element.type == 'radio' && typeof valueAccessor()() == "boolean" && typeof valueAccessor()() ) {
element.checked = true;
}
lib.$(element).on('change', function () {
var type = element.type;
var checked = element.checked;
var value = element.value;
var rawValue = valueAccessor();
if (type == 'checkbox') {
if (rawValue() instanceof Array) {
checked ? rawValue.push(value) : rawValue.remove(value);
} else {
rawValue(checked);
}
} else if (type == 'radio') {
rawValue(value);
}
});
},
update: function (element, valueAccessor) {
}
};
}
var registerOADate = function () {
var getjeDateFormat = function (type) {
switch (type) {
case 'year':
return "YYYY年";
case 'month':
return "YYYY-MM";
case 'date':
return "YYYY-MM-DD";
case 'time':
return "hh:mm:ss";
case 'datetime':
return "YYYY-MM-DD hh:mm:ss";
case 'shortdatetime':
return "YYYY-MM-DD hh:mm";
default:
return "YYYY-MM-DD hh:mm:ss";
}
}
var getDateFormat = function (type) {
switch (type) {
case 'year':
return "yyyy";
case 'month':
return "yyyy-MM";
case 'date':
return "yyyy-MM-dd";
case 'time':
return "hh:mm:ss";
case 'datetime':
return "yyyy-MM-dd hh:mm:ss";
case 'shortdatetime':
return "yyyy-MM-dd hh:mm";
default:
return "yyyy-MM-dd hh:mm:ss";
}
}
lib.ko.bindingHandlers['om-date'] = {
init: function (element, valueAccessor) {
var rawValue = valueAccessor();
var $el = lib.$(element);
var type = $el.attr('data-format');
var enable = $el.attr('data-enable')||'true';
$el.attr('readonly', 'readonly');
var options = {
zIndex: 100000,
festival: false,
isShow: false,
choosefun: function (elem, val, date) {
rawValue(date?date:val.replace('-','/').replace('年',''))
},
clearfun: function (elem, val, date) {
rawValue('')
},
okfun: function (elem, val, date) {
rawValue(date ? date : val.replace('-', '/').replace('年', ''))
},
format: getjeDateFormat(type),
};
$el.click(function () {
var setTimeoutEvent = setTimeout(function () {
var inputEl = lib.$('.jedatehms input');
if (inputEl.length > 0) {
inputEl.attr('readonly', 'readonly');
} else {
setTimeoutEvent();
}
}, 50);
})
if (enable=='true')$el.jeDate(options);
var value = rawValue();
if (value) {
if (typeof (value) == 'string') value = value.replace(/-/g, '/');
$el.val(helper.date.format(new Date(value), getDateFormat(type)));
}
},
update: function (element, valueAccessor) {
var rawValue = valueAccessor();
var $el = lib.$(element);
var type = $el.attr('data-format');
var value = rawValue();
if (value) {
var formatType = getDateFormat(type);
if (formatType == "yyyy-MM") {
value = value + "-01";
}
if (typeof (value) == 'string') value = value.replace(/-/g, '/');
$el.val(helper.date.format(new Date(value), formatType));
} else {
$el.val('');
}
},
};
}
var registerOAPower = function () {
lib.ko.bindingHandlers['oa-power'] = {
update: function (element, valueAccessor) {
var rawValue = valueAccessor();
var showOrHide = function (check) {
check ? lib.$(element).show() : lib.$(element).hide();
}
if (typeof rawValue == 'boolean') {
showOrHide(rawValue);
} else if (typeof rawValue == 'string') {
model.user.checkOperationPower(rawValue).done(showOrHide);
} else if (lib.ko.isObservable(rawValue)) {
showOrHide(rawValue());
}
},
}
}
var registerOASrc = function () {
lib.ko.bindingHandlers['oa-src'] = {
update: function (element, valueAccessor) {
var src = '', rawValue = valueAccessor(), settings = helper.settings.get();
if (typeof (rawValue) == 'string') {
src = rawValue;
} else if (lib.ko.isObservable(rawValue)) {
src = rawValue() + '';
}
if (settings.isAbsUrl) {
if (src && src.indexOf('http://') != -1) {
src = src;
} else {
if (src && src.indexOf('@') != -1 && src.indexOf('@') == 0) {
src = settings.siteUrl + src.replace('@','');
} else {
src = settings.siteUrl + '/..' + src;
}
}
} else {
if (src && src.indexOf('@') != -1 && src.indexOf('@') == 0) {
src ='..'+ src.replace('@', '');
} else {
if (src.indexOf('//') == 0) {
src = src.replace('//', '/');
} else {
src = src;
}
}
}
if (lib.$(element).attr('class')&&lib.$(element).attr('class').indexOf('lazy')!=-1) {
lib.$(element).attr('src', 'data:image/gif;base64,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');
lib.$(element).attr('data-src', src);
} else {
lib.$(element).attr('src', src);
}
}
}
}
var registerOAClick = function () {
lib.ko.bindingHandlers['oa-click'] = {
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var thinClick = helper.func.thinCall(valueAccessor());
lib.$(element).on('click', function () {
thinClick(viewModel, element);
});
},
};
}
var registerOAFormat = function () {
var isValidDate = function (date) {
return date.getTime() === date.getTime();
}
var updateDate = function ($el, oldValue, rawValue) {
var value = new Date(oldValue);
if (isValidDate(value)) {
$el.val(helper.date.format(value, rawValue));
} else {
$el.val('');
}
}
var updateNumber = function ($el, oldValue, rawValue) {
var value = parseFloat(oldValue);
if (lib._.isNumber(value)) {
$el.val(value.toFixed(fixed.replace('#.', '').length));
} else {
$el.val(0);
}
}
lib.ko.bindingHandlers['oa-format'] = {
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var $el = lib.$(element);
var oldValue = $el.val();
var rawValue = valueAccessor();
switch (rawValue) {
case 'yyyy-MM-dd hh:mm:ss':
case 'yyyy-MM-dd':
case 'hh:mm:ss':
updateDate($el, oldValue, rawValue);
break;
case '#':
case '#.#':
case '#.##':
case '#.###':
case '#.####':
updateNumber($el, oldValue, rawValue);
break;
}
}
};
}
var obj = {
start: function (cb) {
registerOAChecked();
registerOADate();
registerOAPower();
registerOASrc();
registerOAClick();
registerOAFormat();
if (cb) cb();
},
};
return obj;
});
页面直接 <input type="text" style="width: 10rem;" data-format="date" data-bind="om-date:dPurDate" />即可
而如果是页面加载完了要动态构建html,那么这样写就不生效了,那么就要重新定义一个方法才行,如下:
getDateControl: function (el, choosefun, clearfun, okfun) {
var options = {
zIndex: 100000,
festival: false,
isShow: false,
choosefun: function (elem, val, date) {
if (choosefun) choosefun(elem, val, date);
console.log(date);
},
clearfun: function (elem, val, date) {
if (clearfun) clearfun(elem, val, date);
console.log(date);
},
okfun: function (elem, val, date) {
if (okfun) okfun(elem, val, date);
console.log(date);
},
format: 'YYYY-MM-DD',
};
var selEl =el;
selEl.click(function () {
var setTimeoutEvent = setTimeout(function () {
var inputEl = helper.$('.jedatehms input');
if (inputEl.length > 0) {
inputEl.attr('readonly', 'readonly');
} else {
setTimeoutEvent();
}
}, 50);
})
selEl.jeDate(options);
},
然后页面<input type="text" name="dArriveDate"/>
调用如下: helper.date.getDateControl($("[name='dArriveDate']"));这样就给每个动态构建的指定名称的文本框绑定相应的日期控件事件了
date: require('oa!app/helper/date'),