easyui扩展-日期范围选择.
https://github.com/dangrossman/bootstrap-daterangepicker
* 特性:
* (1)基本功能->支持日期范围选取
* (2)右边日期必须大于左边,否则无法'确认'提交.
(2.1)左边日历选中某个日期后,右边日历会计算可以选择的日期. 不能选择的日期颜色呈灰色.
(2.2)'确定'时会再次判断左边日期是否小于右边. 若不满足会对右边日历对应文本框进行变色提示.
* (3)支持required验证.继承自easyui validatebox .
基于[jQuery EasyUI 1.4.2],暂时使用的easyloader加载,测试的.
|-jquery-easyui-1.4.2
|-my
|-easyloader_daterangebox.html
|-plugins
|-jquery.daterangebox.js
|-jquery.combo - 副本.js
|-jquery.combo.js
|-src
|-easyloader.js
|-themes
|-default
|-daterangebox.css
|-easyloader.js
|-easyloader - 副本.js
在plugins目录下新增文件 jquery.daterangebox.js
/**
* jQuery EasyUI 1.4.2
*
* Copyright (c) 2009-2015 www.jeasyui.com. All rights reserved.
*
* Licensed under the GPL license: http://www.gnu.org/licenses/gpl.txt
* To use it on other terms please contact us at info@jeasyui.com
*
*/ (function($){ /**
* Add:
*/
function createRoot(target){ var state = $.data(target, 'daterangebox');
var opts = state.options; //Add:
var leftRoot, rightRoot; // if (!state.topbar){
var panel = $(target).combo('panel').css('overflow','hidden');
state.topbar = $('<table cellspacing="0" cellpadding="0" style="width:100%;"><tr></tr></table>').appendTo(panel);
var tr = state.topbar.find('tr');
var td1 = $('<td></td>').appendTo(tr).css('width', '60%');
var td2 = $('<td></td>').appendTo(tr).css('width', '40%'); //td1 ->
state.leftInput = $('<input>'), state.rightInput = $('<input>');
$.each([state.leftInput, state.rightInput],function(i, n){
if(i==1){
$('<span>-</span>').css({'margin': '0 5px'}).appendTo(td1);
}
n.css('width',80).appendTo(td1);
n.textbox();
n.textbox('readonly',true);
}); //td2 ->
state.zConfirmBtn = $('<a href="javascript:void(0);">确定</a>'),
state.zCancelBtn = $('<a href="javascript:void(0);">取消</a>');
$.each([state.zConfirmBtn,state.zCancelBtn],function(i,n){
n.css({'float': 'right','width': '60px'}).appendTo(td2);
n.linkbutton();
}); state.zConfirmBtn.on('click', function(){
var lv = state.leftInput.textbox('getValue');
var rv = state.rightInput.textbox('getValue');
if( lv!='' && rv!='' ){
var lt = new Date(lv.replace(/-/g,'/')).getTime(),
rt = new Date(rv.replace(/-/g,'/')).getTime();
if( rt >= lt ){
$(target).combo('setValue', lv+' - '+rv).combo('setText', lv+' - '+rv);
//
$(target).combo('hidePanel');
}else{
state.rightInput.textbox('textbox').parent('span').addClass('daterangebox-alert-border');
}
}
});
state.zCancelBtn.on('click', function(){
$(target).combo('hidePanel');
});
} /**
* if the calendar isn't created, create it.
* 创建日历
*/
if (!state.calendar){ var panel = $(target).combo('panel').css('overflow','hidden'); //Add:
leftRoot = $('<div class="daterangebox-calendar-left"></div>').css('float','left').appendTo(panel); //Update:
var cc = $('<div class="daterangebox-calendar-inner"></div>').prependTo(leftRoot); state.calendar = $('<div></div>').appendTo(cc).calendar(); $.extend(state.calendar.calendar('options'), {
fit:true,
//border:false,
border:true,
onSelect:function(date){
var target = this.target;
var opts = $(target).daterangebox('options');
setValueLeft(target, opts.formatter.call(target, date)); //点击日历后,隐藏日历面板.
//$(target).combo('hidePanel'); opts.onSelect.call(target, date);
}
});
} //state.calendar
if (!state.calendarRight){ var panel = $(target).combo('panel').css('overflow','hidden'); //Add:
rightRoot = $('<div class="daterangebox-calendar-right"></div>').css('float','left').appendTo(panel); //Update:
var cc = $('<div class="daterangebox-calendar-inner"></div>').prependTo(rightRoot); state.calendarRight = $('<div></div>').appendTo(cc).calendar(); $.extend(state.calendarRight.calendar('options'), {
fit:true,
//border:false,
border:true,
onSelect:function(date){
var target = this.target;
var opts = $(target).daterangebox('options');
setValueRight(target, opts.formatter.call(target, date)); //点击日历后,隐藏日历面板.
//$(target).combo('hidePanel'); opts.onSelect.call(target, date);
}
});
} } /**
* create date box
*/
function createBox(target){ var state = $.data(target, 'daterangebox');
var opts = state.options; //在'onShowPanel'触发时会执行一系列的函数.
$(target).addClass('daterangebox-f').combo($.extend({}, opts, {
onShowPanel:function(){
//bindEvents(this);
//setButtons(this);
setCalendar(this);
setValue(this, $(this).daterangebox('getText'), true);
opts.onShowPanel.call(this);
},
required:true
}));
//
$(target).combo('textbox').attr('readonly',true); createRoot(target); $(target).combo('textbox').parent().addClass('daterangebox');
//$(target).daterangebox('initValue', opts.value); //
function setCalendar(target){
var panel = $(target).combo('panel'); var leftDiv = panel.children('div.daterangebox-calendar-left');
var rightDiv = panel.children('div.daterangebox-calendar-right'); var cc = $(leftDiv).children('div.daterangebox-calendar-inner');
var ccRight = $(rightDiv).children('div.daterangebox-calendar-inner'); //_outerWidth 在jquery.parser.js中有定义.
//panel.children()._outerWidth(panel.width());
panel.children().not('table')._outerWidth(panel.width()/2); state.calendar.appendTo(cc);
state.calendarRight.appendTo(ccRight); //important
state.calendar[0].target = target;
state.calendarRight[0].target = target; if (opts.panelHeight != 'auto'){
var height = panel.height();
//panel.children().not(cc).each(function(){
$(leftDiv).children().not(cc).each(function(){
height -= $(this).outerHeight();
}); cc._outerHeight(height);
ccRight._outerHeight(height); } state.calendar.calendar('resize');
state.calendarRight.calendar('resize');
}
} function controlRightCalendar(state, leftTime){
//右边的日期必须大于或等于左边的日期.
state.calendarRight.calendar({
validator: function(date){
if(date.getTime() >= leftTime){
return true;
}
return false;
},
styler: function(date){
if(date.getTime() >= leftTime){
return '';
}
return 'color:#cccccc';
}
});
$.parser.parse(state.calendarRight);
} function setValueLeft(target, value, remainText){
var state = $.data(target, 'daterangebox');
var opts = state.options; state.calendar.calendar('moveTo', opts.parser.call(target, value));
state.leftInput.textbox('setValue', value);
//
var leftTime = new Date(value.replace(/-/g, '/')).getTime();
controlRightCalendar(state, leftTime);
} function setValueRight(target, value, remainText){
var state = $.data(target, 'daterangebox');
var opts = state.options; state.calendarRight.calendar('moveTo', opts.parser.call(target, value));
state.rightInput.textbox('setValue', value);
state.rightInput.textbox('textbox').parent('span').removeClass('daterangebox-alert-border');
} /**
*
*/
function setValue(target, value, remainText){
var state = $.data(target, 'daterangebox');
var opts = state.options;
var leftVal = '', rightVal = ''; if(value){
var valArr = value.split(' - ');
leftVal = $.trim(valArr[0]);
rightVal = $.trim(valArr[1]);
} var leftDate = opts.parser.call(target, leftVal), ld = leftDate;
//
controlRightCalendar(state, new Date(ld.getFullYear()+'/'+(ld.getMonth()+1)+'/'+ld.getDate()).getTime());
state.calendar.calendar('moveTo', leftDate);
state.calendarRight.calendar('moveTo', opts.parser.call(target, rightVal)); } /**
* 构造方法.
*/
$.fn.daterangebox = function(options, param){ if (typeof options == 'string'){
var method = $.fn.daterangebox.methods[options];
if (method){
//当 method 是"daterangebox"定义的方法是,直接调用.
return method(this, param);
} else {
//否则,调用combo对应的方法.
return this.combo(options, param);
}
} options = options || {}; return this.each(function(){ var state = $.data(this, 'daterangebox'); if (state){
$.extend(state.options, options);
} else {
//在元素上存放(set)数据. 除了'cloneFrom'方法外,其他地方都是获取(get).
$.data(this, 'daterangebox', {
// 拷贝 $.fn.daterangebox.defaults 数据.
options: $.extend({}, $.fn.daterangebox.defaults, $.fn.daterangebox.parseOptions(this), options)
});
}
//
createBox(this);
});
}; $.fn.daterangebox.methods = { //测试发现,'options'方法在内部调用非常频繁.
options: function(jq){
var copts = jq.combo('options');
return $.extend($.data(jq[0], 'daterangebox').options, {
width: copts.width,
height: copts.height,
originalValue: copts.originalValue,
disabled: copts.disabled,
readonly: copts.readonly
});
}, //暴露给用户使用的API.获得calendar对象.
calendar: function(jq){ // get the calendar object
return $.data(jq[0], 'daterangebox').calendar;
}, initValue: function(jq, value){
return jq.each(function(){
var opts = $(this).daterangebox('options');
var value = opts.value;
if (value){
//下文有定义'formatter','parser'方法.
value = opts.formatter.call(this, opts.parser.call(this, value));
}
//最终还是会调用'combo'的方法, 并且还调用'setText'方法
$(this).combo('initValue', value).combo('setText', value);
});
},
setValue: function(jq, value){
return jq.each(function(){
//调用本模块定义的'setValue'函数.
setValue(this, value);
});
},
reset: function(jq){
return jq.each(function(){
var opts = $(this).daterangebox('options');
// opts.originalValue -> 来自combo -> 为空字符串.
$(this).daterangebox('setValue', opts.originalValue);
});
}
}; //此方法可提供给子类使用.譬如下面的"$.fn.combo.parseOptions(target)".
$.fn.daterangebox.parseOptions = function(target){
return $.extend({}, $.fn.combo.parseOptions(target), $.parser.parseOptions(target));
}; $.fn.daterangebox.defaults = $.extend({}, $.fn.combo.defaults, {
//panelWidth:180,
panelWidth:400,
panelHeight:'auto', /*currentText:'Today',
closeText:'Close',*/ formatter:function(date){
var y = date.getFullYear();
var m = date.getMonth()+1;
var d = date.getDate();
return (m<10?('0'+m):m)+'/'+(d<10?('0'+d):d)+'/'+y;
},
parser:function(s){
if (!s) return new Date();
var ss = s.split('/');
var m = parseInt(ss[0],10);
var d = parseInt(ss[1],10);
var y = parseInt(ss[2],10);
if (!isNaN(y) && !isNaN(m) && !isNaN(d)){
return new Date(y,m-1,d);
} else {
return new Date();
}
}, onSelect:function(date){}
});
})(jQuery);
在themes\default目录下新增daterangebox.css文件
.daterangebox-calendar-inner {
height: 180px;
} .daterangebox-calendar-inner2 {
height: 180px;
} .daterangebox-calendar-left{} .daterangebox-calendar-right{} .daterangebox-alert-border{
border: 1px solid red;
} .daterangebox-button {
height: 18px;
padding: 2px 5px;
text-align: center;
}
.daterangebox-button a {
font-size: 12px;
font-weight: bold;
text-decoration: none;
opacity: 0.6;
filter: alpha(opacity=60);
}
.daterangebox-button a:hover {
opacity: 1.0;
filter: alpha(opacity=100);
}
.daterangebox-current,
.daterangebox-close {
float: left;
}
.daterangebox-close {
float: right;
}
.daterangebox .combo-arrow {
background-image: url('images/datebox_arrow.png');
background-position: center center;
}
.daterangebox-button {
background-color: #F4F4F4;
}
.daterangebox-button a {
color: #444;
}
需要修改一些文件.
将src目录下的easyloader.js拷贝到根目录下,作如下修改. 在modules上添加对daterangebox的支持.
var modules = {
//daterangebox:
daterangebox:{
js:'jquery.daterangebox.js',
css:'daterangebox.css',
dependencies:['calendar','combo','linkbutton']
},
在my目录(新增的测试目录)下增加测试文件easyloader_daterangebox.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>easyuiloader daterangebox</title> <!-- 1.4.2 -->
<script type="text/javascript" src="../jquery.min.js"></script>
<script type="text/javascript" src="../easyloader.js"></script> <script type="text/javascript">
//
$(function(){
$('body').css({
'margin':'10px 20px'
}); var input1 = $('<input>').appendTo($('body')).attr('id', 'dd').attr('type','text'); easyloader.locale = "zh_CN";
easyloader.base = "../";
using('daterangebox', function(){
$('#dd').daterangebox();
});
});
</script>
</head>
<body> </body>
</html>
要让例子程序正确运行,还需要修改下plugin目录下的jquery.combo.js文件. 原因是目前项目用的是低版本1.4.2见博文
src下没有jquery.combo.js的源文件,不过没关系,我已经测试过,直接修改148行.
//_21.panel("panel").show().css({zIndex:($.fn.menu?$.fn.menu.defaults.zIndex++:$.fn.window.defaults.zIndex++),left:-999999});
_21.panel("panel").show().css({zIndex:($.fn.menu?$.fn.menu.defaults.zIndex++:($.fn.window?$.fn.window.defaults.zIndex++:99)),left:-999999});
easyui扩展-日期范围选择.的更多相关文章
- EasyUI扩展方法
EasyUI扩展方法: 1.我想指定textarea的行,但editor:{type:'textarea', options: {rows:'4'}}这样写不行.请问大家怎么配置才是指定行的啊? 配置 ...
- 表单(中)-EasyUI Combogrid 组合网格、EasyUI Numberbox 数字框、EasyUI Datebox 日期框、EasyUI Datetimebox 日期时间框、EasyUI Calendar 日历
EasyUI Combogrid 组合网格 扩展自 $.fn.combo.defaults 和 $.fn.datagrid.defaults.通过 $.fn.combogrid.defaults 重写 ...
- jquery easyUi columns日期格式化
jquery easyUi columns日期格式化 方法一 Date.prototype.format = function (format) { var o = { "M+" ...
- DOM扩展-Selectors API(选择符 API)、元素遍历
DOM扩展 对DOM的两个主要扩展是SelectorsAPI(选择符API)和HTML5 SelectorsAPI(选择符API)是由W3C发起制定的一个标准,致力于浏览器原生支持CSS查询,Sele ...
- jquery easyui datagrid 获取Checked选择行(勾选行)数据
原文:jquery easyui datagrid 获取Checked选择行(勾选行)数据 getSelected:取得第一个选中行数据,如果没有选中行,则返回 null,否则返回记录. getSel ...
- 日期时间范围选择插件:daterangepicker使用总结
分享说明: 项目中要使用日期时间范围选择对数据进行筛选;精确到年月日 时分秒;起初,使用了layui的时间日期选择插件;但是在IIE8第一次点击会报设置格式错误;研究了很久没解决,但能确定不是layu ...
- EasyUI扩展——自定义列排序匹配字段
一些特殊情况下希望实现:单击某些列,但是排序要按照自定义指定另外的列排序 easyui扩展: 如果不写sort属性则按照默认该列的field排序 $.fn.datagrid.defaults.onBe ...
- 雷林鹏分享:jQuery EasyUI 扩展
jQuery EasyUI 扩展 Portal(制作图表.列表.球形图等) 数据网格视图(DataGrid View) 可编辑的数据网格(Editable DataGrid) 可编辑的树(Editab ...
- easyUI datebox 日期空间斜杠格式化。例如将日期空间中显示2017-03-13,改为2017/03/13
easyUI datebox 日期空间斜杠格式化 将日期空间中显示2017-03-13,改为2017/03/13 //日期控件斜杠格式化 function formatDate(date){ if( ...
随机推荐
- 2015南阳CCPC C - The Battle of Chibi DP
C - The Battle of Chibi Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description Cao Cao made up a ...
- Uestc_suibian 暑假集训总结
唉,终于组队了,终于可以只BB了,我就BB,我就不上! 和Xiper以及chenxh组队了- 下面是总结: day1 第一天吃饱喝足,然后就上路了,我一开始就看到了C题大水题,但是我不敢想象这道题居然 ...
- JAVA线程池简介
一 简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.uti ...
- android150 笔记
1. 什么是Activity? 四大组件之一,一般的,一个用户交互界面对应一个activity,界面的容器. setContentView() ,// 要显示的布局 button.setOnclick ...
- c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿
c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿 虽然const_cast是用来去除变量的const限定,但是static_cast ...
- iframe自适应高度的多种方法方法小结
对于自适应高度的代码有很多,可效率什么的考虑进来好代码就不多见了,不过思路倒是差不多的 不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是 ifram ...
- Session fixation--wiki
http://en.wikipedia.org/wiki/Session_fixation In computer network security, session fixation attacks ...
- IOS网络请求框架AFNetworking和ASIHttpRequest对比
ASI基于CFNetwork框架开发,而AFN基于NSURL. ASI更底层,请求使用创建CFHTTPMessageRef进行,使用NSOperationQueue进行管理,ASIHTTPReques ...
- cocos2d-x之jni使用(对接Android各种sdk)
游戏弄完了,要发布到各个平台,ios.Android是肯定少不了的,那么本文就来讲讲Android平台对接代理商付费sdk.各渠道.五大运营商.广告.分享.数据统计等等少不了的jni调用,接sdk真是 ...
- IDL中File_Search函数用法详解(转)
来自:http://blog.sina.com.cn/s/blog_764b1e9d01014ajp.html 在利用IDL进行批处理时,通常用到file_search函数进行输入路径文件的搜索,现根 ...