Home > Web Front-end > JS Tutorial > Detailed explanation of how to use bootstrap time control daterangepicker

Detailed explanation of how to use bootstrap time control daterangepicker

小云云
Release: 2018-05-15 11:30:10
Original
5000 people have browsed it

This article mainly introduces how to use the bootstrap time control daterangepicker and various small bug fixes. It has certain reference value. Interested friends can refer to it. I hope it can help everyone.

Dual calendar time period selection plug-in - daterangepicker is a time control later in the bootstrap framework. It can set multiple time period options or customize the time period. The user can choose the starting time and The end time and the maximum span of the time period can be set in the program.

1. Reference

daterangepicker relies on monent.js and jquery. Therefore, monent.js, jquery, and bootstrap must be introduced before daterangepicker is introduced during use.

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="moment.js"></script>
<script type="text/javascript" src="daterangepicker.js"></script>
<link rel="stylesheet" type="text/css" href="bootstrap.css" />
<link rel="stylesheet" type="text/css" href="daterangepicker-bs3.css" />
Copy after login

Or when using modular programming, such as seaj.js, add

define("gallery/daterangepicker/1.3.7/daterangepicker",[" in front of the entire code compression jquery","moment","./daterangepicker-bs3.css"],
function(a){a("jquery");window.moment=a("moment"),a("./daterangepicker -bs3.css"),

(You can add the source code of daterangepicker.js in the middle) (I encountered it in the project at the moment, and I made it by myself. It can be used; it is not clear yet and needs to be improved. )

Add

define("gallery/daterangepicker/1.3.7/daterangepicker-bs3.css",[],function(){
 seajs.importStyle(".daterangepicker{position:absolute;color:inherit;.........}"
 )})
 })
Copy after login

at the end 2. Use

During use, you need to pay attention to the parameter configuration of datetimepicker (this can be checked on the official website to), what I want to explain here is that you can download the source code from the official website, configure the parameters according to its demo to understand its various uses

in the check box above Through selection, you can configure different parameters. Here is a brief explanation of the parameters you use in the project, and how to use them.

Due to the entire system of the project, there are double dates or single dates, or sometimes minutes and seconds. There are no hours, minutes and seconds. So the combination of pairs is divided into four situations:

So I use the following:

/**
 * 日历
 * @param obj eles 日期输入框
 * @param boolean dobubble 是否为双日期(true)
 * @param boolean secondNot 有无时分秒(有则true)
 * @return none
 */
function calenders(eles,dobubble,secondNot){
 var singleNot,formatDate;
 if(dobubble ==true){
 singleNot = false;
 }else{
 singleNot = true;
 }
 if(secondNot ==true){
 formatDate = "YYYY-MM-DD HH:mm:ss";
 }else{
 formatDate = "YYYY-MM-DD";
 }
 
 $(eles).daterangepicker({
 "singleDatePicker": singleNot,//是否为单日期
 "timePicker": secondNot,//时间显示与否
 "timePicker24Hour": secondNot,//是否按24小时式来显示
 "timePickerSeconds": secondNot,//是否带秒
 "showDropdowns":true,//是否显示年月下拉选项,可以快速定位到哪一年哪一月
 "timePickerIncrement" :1,
 "linkedCalendars": false,//是否开始和结束连动,建议设为false,不然日期一直跳来跳去,首次使用者会觉得用户体检极度不佳
 "autoApply":true,//是否自动应用,不带时分秒的都可以实现在选择完日期后自动关闭,带时分秒时不会自动关闭
 "autoUpdateInput":false, //是否自动应用初始当前日期
 "locale": {
  "direction": "ltr",
  "format": formatDate,
  "separator": "~",
  "applyLabel": "Apply",
  "cancelLabel": "Cancel",
  "fromLabel": "From",
  "toLabel": "To",
  "customRangeLabel": "Custom",
  "daysOfWeek": [
  "Su",
  "Mo",
  "Tu",
  "We",
  "Th",
  "Fr",
  "Sa"
  ],
  "monthNames": [
  "一月",
   "二月",
   "三月",
   "四月",
   "五月",
   "六月",
   "七月",
   "八月",
   "九月",
   "十月",
   "十一月",
   "十二月"
  ],
  "firstDay": 1
 }
 }, function(start,end, label) {
 if(secondNot ==true&&dobubble ==true){
  $(eles).val($.trim(start.format(&#39;YYYY-MM-DD HH:mm:ss&#39;)+&#39;~&#39;+end.format(&#39;YYYY-MM-DD HH:mm:ss&#39;)));
 }else if(secondNot ==false&&dobubble ==true){
  $(eles).val($.trim(start.format(&#39;YYYY-MM-DD&#39;)+&#39;~&#39;+ end.format(&#39;YYYY-MM-DD&#39;)));
 }else if(secondNot ==false&&dobubble ==false){
  $(eles).val(start.format(&#39;YYYY-MM-DD&#39;));
 }else if(secondNot ==true&&dobubble ==false){
  $(eles).val(start.format(&#39;YYYY-MM-DD HH:mm:ss&#39;));
 }
 });
 //清空
 $(document).off(&#39;click&#39;,&#39;.clearBtns&#39;).on(&#39;click&#39;,&#39;.clearBtns&#39;,function(){
 $(eles).val(&#39;&#39;);
 })
}
Copy after login

Because daterangepicker does not have its own clearing function, and in project requirements, sometimes the date box is required. is empty, so I added a cross button behind the input box. As shown below, the code to achieve clearing can be used as a reference (there are various ways to implement this)

<p class="input-group">
 <input type="text" name="extractionDate11" id="extractionDate11" class="form-control dateStart" placeholder="请选择起始时间" readonly size="30">
 <p class="input-group-addon clearBtns">x</p>
 </p>
 <span class="caret"></span>
Copy after login

And for references in various situations:

Single date without hours, minutes and seconds: calenders("#bgrq",false,false);

Single date with hours and minutes Seconds: calenders('#inputDate',false,true);

Double dates without hours, minutes and seconds: calenders('#extractionDate11',true,false);

Double dates with hours, minutes and seconds :calenders('#extractionDate11',true,true);

3. Problem Solving

1. Click on the drop-down date box and click on the blank space. The date box is closed, and the value transfer problemBecause the function of daterangepicker is: after clicking on the drop-down date box, click elsewhere on the page, the date box is closed, and the previously selected date value is automatically saved to On the date box, and our habit is, such an operation is equivalent to canceling, so make a modification in the source code:

Search for the outsideClick method in the source code:

Change this.hide ()replace.

outsideClick: function(e) {
 var target = $(e.target);
 // if the page is clicked anywhere except within the daterangerpicker/button
 // itself then call this.hide()
 if (
 // ie modal dialog fix
 e.type == "focusin" ||
 target.closest(this.element).length ||
 target.closest(this.container).length ||
 target.closest(&#39;.calendar-table&#39;).length
 ) return;
 // this.hide();
 if (this.isShowing){
 $(document).off(&#39;.daterangepicker&#39;);
 $(window).off(&#39;.daterangepicker&#39;);
 this.container.hide();
 this.element.trigger(&#39;hide.daterangepicker&#39;, this);
 this.isShowing = false;
 }
 this.element.trigger(&#39;outsideClick.daterangepicker&#39;, this);
},
Copy after login

At the same time, the changes in the show method must be made. Otherwise, when the user selects dual dates, if he only selects one date and then clicks on the blank space, and the next time he clicks on the input box, an error will be reported and cannot be used anymore. .

/*this.oldStartDate = this.startDate.clone();
this.oldEndDate = this.endDate.clone();
this.previousRightTime = this.endDate.clone();*/

this.oldStartDate = this.startDate;
this.oldEndDate = this.endDate;
this.previousRightTime = this.endDate;
Copy after login

2. The problem that the date is initially empty

daterangepicker will automatically assign the current date to the bound input box at the beginning, that is, the parameter "autoUpdateInput":true/false, when it When it is true, the date will be automatically added. When false is selected, it will be initially empty. However, in some cases, it will not be automatically applied after the date is selected later. So we need to make some modifications (this is borrowed from this blog) Here we are a little clearer

(Quote: Here we can use the autoUpdateInput attribute, autoUpdateInput is used to open and close the daterangepicker selection, whether to automatically pass the value To the input[text] DOM attribute, by setting the initial autoUpdateInput to false, the initial value can be empty. This is only when the placeholder set in the input can be displayed normally. However, after setting this attribute, no matter how the daterangePikcer date is selected, There will be no value passed into the input, that is, there is no way to display the selected date normally, so you need to call $(id).data('daterangepicker').autoUpdateInput=true at the appropriate moment. Author Initially set to, the initial default value is empty. When the input of daterangepicker is clicked, autoUpadateInput=true, but then the input will automatically have a value regardless of whether the date is selected or not. So in order to modify this problem, I made it in the source code of daterangepicker. After modification, of course you can also change the required onclick event

In the source code, after autoUpdateInput is set to false, we want to change autoUpdateInput back when clicking OK, selecting the date and clicking range. , so set this.autoUpdateInput=true attribute in three places)

1)在1210行左右的clickRange方法中:添加可以如下对照以下代码:

clickRange: function(e) {
 var label = e.target.getAttribute(&#39;data-range-key&#39;);
 this.chosenLabel = label;
 if (label == this.locale.customRangeLabel) {
 this.showCalendars();
 // } else {
 }else if (!this.endDate && date.isBefore(this.startDate)) {
 this.autoUpdateInput=true;
  //special case: clicking the same date for start/end,
  //but the time of the end date is before the start date
  this.setEndDate(this.startDate.clone());
 } else { // picking end
 this.autoUpdateInput=true;


 var dates = this.ranges[label];
 this.startDate = dates[0];
 this.endDate = dates[1];

 if (!this.timePicker) {
  this.startDate.startOf(&#39;day&#39;);
  this.endDate.endOf(&#39;day&#39;);
 }

 if (!this.alwaysShowCalendars)
  this.hideCalendars();
 this.clickApply();
 }
},
Copy after login

2)、在1340行左右,两处添加 this.autoUpdateInput=true; 请对照以下:

} else if (!this.endDate && date.isBefore(this.startDate)) {
 this.autoUpdateInput=true;
 //special case: clicking the same date for start/end,
 //but the time of the end date is before the start date
 this.setEndDate(this.startDate.clone());
} else { // picking end
 this.autoUpdateInput=true;
 if (this.timePicker) {
 var hour = parseInt(this.container.find(&#39;.right .hourselect&#39;).val(), 10);
 if (!this.timePicker24Hour) {
  var ampm = this.container.find(&#39;.right .ampmselect&#39;).val();
  if (ampm === &#39;PM&#39; && hour < 12)
  hour += 12;
  if (ampm === &#39;AM&#39; && hour === 12)
  hour = 0;
 }
Copy after login

3)、在1400行左右,给clickApply方法中添加 this.autoUpdateInput=true;

clickApply: function(e) {
 this.autoUpdateInput=true;
 this.hide();
 this.element.trigger(&#39;apply.daterangepicker&#39;, this);
 },
Copy after login

相关推荐:

bootstrap中关于时间控件

bootstrap中的时间控件使用方法

js时间控件只显示年月

The above is the detailed content of Detailed explanation of how to use bootstrap time control daterangepicker. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template