zoukankan      html  css  js  c++  java
  • easyui扩展-日期范围选择.

    参考: http://www.5imvc.com/Rep 

    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="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, {
    				 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);
    

    在themesdefault目录下新增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});
    

      

  • 相关阅读:
    HDU2159 二维完全背包
    HDU1401 BFS
    HDU2842 矩阵乘法
    CF2.E
    CF2.D
    *HDU2254 矩阵乘法
    CF2.C
    *HDU1907 博弈
    博弈
    *HDU2147 博弈
  • 原文地址:https://www.cnblogs.com/juedui0769/p/5120051.html
Copyright © 2011-2022 走看看