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( ...
随机推荐
- Codeforces Round #331 (Div. 2) B. Wilbur and Array 水题
B. Wilbur and Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/596/p ...
- Codeforces Testing Round #12 C. Subsequences 树状数组维护DP
C. Subsequences Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/597/probl ...
- ResultSet转成java类对象
在做web开发时遇到一个事情: 需要从mysql数据表中查询数据并遍历查询结果 这样最简单的方式是:查询到结果根据表中字段列表的顺序来一个个获取字段,但这样需要记住字段的顺序,操作起来不是那么方便.因 ...
- [置顶] How to dump redo log entry?
1.转储针对特定数据块(4号文件的第10-20号数据块)修改的 redo entry select file#,name,blocks from v$datafile; FILE# NAME ...
- iOS开发UI-利用Quartz2D 实现基本绘图(画三角形、矩形、圆、圆弧)
1.画三角形 运行结果如下 1.1具体实现步骤 1.1.1首先新建一个project,然后自定义一个view 1.2代码 #import "htingShapeView.h" @ ...
- C#多线程学习(一) 多线程的相关概念
什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序中的一个执行流,每个线程都有自己的专有寄 ...
- u检验、t检验、F检验、X2检验 (转)
http://blog.renren.com/share/223170925/14708690013 常用显著性检验 1.t检验 适用于计量资料.正态分布.方差具有齐性的两组间小样本比较.包括配对资料 ...
- c语言中的unsigned 和 signed
我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的 Integer type(整数形式)是C语言中的基本数 ...
- 探索 ConcurrentHashMap 高并发性的实现机制--转
ConcurrentHashMap 是 Java concurrent 包的重要成员.本文将结合 Java 内存模型,来分析 ConcurrentHashMap 的 JDK 源代码.通过本文,读者将了 ...
- Android(java)学习笔记78:设计模式之单例模式
单例模式代码示例: 1. 单例模式之饿汉式: package cn.itcast_03; public class Student { // 构造私有 private Student() { } // ...