Giter Site home page Giter Site logo

ciaoca / cxcalendar Goto Github PK

View Code? Open in Web Editor NEW
164.0 6.0 55.0 395 KB

JavaScript date picker, support range, time, year, month. JavaScript 日期选择器插件,支持范围、日期、时间、月份、年份等多种类型。

Home Page: http://ciaoca.github.io/cxCalendar/

License: MIT License

CSS 22.90% JavaScript 76.86% HTML 0.23%
datepicker daterangepicker datetimepicker monthpicker timepicker yearpicker

cxcalendar's Introduction

cxCalendar

cxCalendar 是基于 JavaScript 的日期选择器插件,支持日期、时间、月份、年份等多种类型。

它灵活自由,你可以自定义外观,日期的范围,返回的格式等。

优点

  • 无第三方依赖
  • 支持单日期、日期范围
  • 支持 CSS 自定义样式
  • 支持多语言扩展
  • 全局仅有一个选择器,减少 DOM 污染

Demo: https://ciaoca.github.io/cxCalendar/

从 v3.0 开始,已移除 jQuery 的依赖,如果需要使用旧版,可查看 v2 分支

preview

安装方法

浏览器端引入

<link rel="stylesheet" href="cxcalendar.css">
<script src="cxcalendar.js"></script>

从 NPM 安装,作为模块引入

npm install cxcalendar3
import 'cxcalendar.css';
import cxCalendar from 'cxcalendar3';

使用

// 绑定到输入框
cxCalendar.attach(document.getElementById('input'));

// 动态调用,适合 input 可能会新增或删除的情况
document.body.addEventListener('focus', (e) => {
  if (e.target.nodeName.toLowerCase() === 'input') {
    cxCalendar(e.target);
  };
});

设置默认参数

cxCalendar.defaults.type = 'datetime';
cxCalendar.defaults.language = {
  monthList: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], 
  weekList: ['Sun', 'Mon', 'Tur', 'Wed', 'Thu', 'Fri', 'Sat'] 
};

API 接口

cxCalendar(document.getElementById('input')); // 立即显示日期选择器
cxCalendar.attach(document.getElementById('input'));
cxCalendar.detach(document.getElementById('input'));
名称 说明
attach(element, options) 绑定日期选择器
detach(element) 解除绑定

实例 API 接口

var input = document.getElementById('input');

// 获取实例
var api = cxCalendar.attach(input);
api.show();

// 销毁实例
cxCalendar.detach(input);
名称 说明
show() 显示面板
hide() 隐藏面板
getDate(format) 获取当前选择的日期
setDate(value) 设置日期值(时间戳或日期字符串)
clearDate() 清除日期值
setOptions(options) 设置参数

options 参数说明

cxCalendar(element, options);
cxCalendar.attach(element, options);
名称 类型 默认值 说明
date integer
string
undefined 默认日期(默认获取当前日期)
可使用时间戳或字符串
※ input 的 value 值优先级更高
startDate integer
string
undefined 起始日期(默认获取当前日期的一年前)
可使用时间戳或字符串
若设置值为 4 位数字,则转换为当年的1月1日
如: 2020 => 2020/1/1
endDate integer
string
undefined 结束日期(默认获取当前日期)
可使用时间戳或字符串
若设置值为 4 位数字,则转换为当年的12月31日
如: 2020 => 2020/12/31
type string 'date' 日期类型
'year' 年份
'month' 年份和月份
'date' 日期
'datetime' 日期和时间
'time' 时间
format string 'Y-m-d' 日期值格式
'Y' 年份,完整 4 位数字
'y' 年份,仅末尾 2 位数字
'm' 月份,数字带前导零(01-12)
'n' 月份(1-12)
'd' 月份中的第几天,有前导零(01-31)
'j' 月份中的第几天(1-31)
'H' 小时,24 小时格式,有前导零(00-23)
'G' 小时,24 小时格式(0-23)
'h' 小时,12 小时格式,有前导零(01-12)
'g' 小时,12 小时格式(1-12)
'i' 分钟,数字带前导零(00-59)
's' 秒,数字带前导零(00-59)
'a' 上午或下午名称
'timestamp' 时间戳(毫秒)
weekStart integer 0 星期开始于周几
0 星期日
1 星期一
2 星期二
3 星期三
4 星期四
5 星期五
6 星期六
lockRow boolean false 是否固定行数
每个月的日期数,可能会出现 5 行或 6 行
默认自适应,设为 true 则固定为 6 行
yearNum integer 20 年份每页条数
hourStep integer 1 小时间隔
minuteStep integer 1 分钟间隔
secondStep integer 1 秒间隔
disableWeek array [] 不可选择的日期(星期值)
0 星期日
1 星期一
2 星期二
3 星期三
4 星期四
5 星期五
6 星期六
例:[0,6] 表示所有周六、周日不可选择
disableDay array [] 不可选择的日期
'1' 每月 1 号
'1-5' 每年 1 月 5 日
'2020-1-1' 指定具体日期
※ 不要有前导零
mode string 'single' 选择模式
'single' 单选模式
'range' 范围模式
rangeSymbol string ' - ' 日期范围拼接符号
rangeMaxDay integer 0 日期范围最长间隔
rangeMaxMonth integer 0 月份范围最长间隔
rangeMaxYear integer 0 年份范围最长间隔
button object {} 操作按钮
today 选择现在
clear 清除已选值
默认自适应,若强制不需要可设置为 false,如 today: false
position string undefined 显示位置
'top'
'bottom'
'left'
'right'
'fixed' 自定义,配合 baseClass 使用
默认自适应,可参考:[Demo Position]
baseClass string undefined 追加样式名称
仅在面板容器增加 class,不会覆盖默认的 class
language string
object
undefined 语言配置
若为 string,将在语言配置文件中查找对应键名(需载入 cxcalendar.languages.js

date, startDate, endDate 的优先级与范围

  • date 早于 startDate 时,则为 startDate,晚于 endDate 时,则为 endDate
  • startDate 日期晚于 endDate 时,调整为 endDate 的一年前

date, startDate, endDate 支持的时间格式

日期连接符 - 可替换为 ./
月、日、时、分、秒,可为数字或带有前导零

  • y
  • y-m
  • y-m-d
  • y-m-d h:i
  • y-m-d h:i:s
  • m-d
  • m-d h:i
  • m-d h:i:s
  • h:i
  • h:i:s

data 属性参数

<input type="text" value="2020-12-1" data-start-date="2020" data-end-date="2021" data-format="Y/m/d" data-language="en">

※ data 属性参数优先级要高于调用时的 options 参数

名称 说明
data-start-date 起始日期
data-end-date 结束日期
data-type 日期类型
data-format 日期值格式
data-weekStart 星期开始于周几
data-year-num 年份每页条数
data-hour-step 小时间隔
data-minute-step 分钟间隔
data-second-step 秒间隔
data-lock-row 是否固定行数,值为 1 时视为 true ,例:data-lock-row="1"
data-disable-week 不可选择的日期(星期值),例:data-disable-week="0,6"
data-disable-day 不可选择的日期,例:data-disable-day="1,5-2,2021-2-11"
data-mode 选择模式
data-range-symbol 日期范围拼接符号
data-range-max-day 日期范围最长间隔
data-range-max-month 月份范围最长间隔
data-range-max-year 年份范围最长间隔
data-position 显示位置
data-base-class 追加样式名称
data-language 语言名称(仅支持 languages 已配置的键名)

操作按钮

  • 按钮文字在 css 中设置;
  • today 按钮会根据配置来决定是否存在。例如 startDateendDate 范围不包含当前时间,则不会存在;
  • confirm 按钮在选择时间和选择范围时存在,不支持配置。

多语言配置

cxcalendar.languages.js 文件中进行配置,载入即可根据用户的语言环境,自动显示对应的语言。

名称 默认值 说明
am '上午' 12小时制的上午名称
pm '下午' 12小时制的下午名称
monthList ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'] 月份的名称
weekList ['日', '一', '二', '三', '四', '五', '六'] 星期的名称(从周日开始排序)
holiday [] 节假日配置
// 自定义语言示例
'zh-cn': {
  am: '上午',
  pm: '下午',
  monthList: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
  weekList: ['日', '一', '二', '三', '四', '五', '六'],
  holiday: [
    {day: '1-1', name: '元旦'},  // 指定每年重复的节日
    {day: '2021-2-12', name: '春节'}  // 指定具体日期的节日
  ]
}

cxcalendar's People

Contributors

ciaoca avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

cxcalendar's Issues

月份列表显示不正确

当设定:type: "date",endDate:new Date()时;如,当前为5月份,
切换年份至之前的年份,例如,当前2023年,切换为2022年,
月份选择列表中的月份列表没有更新,还是2023年的1-5月,应为1-12月。

月份列表显示不正确

当设定:type: "date",endDate:new Date()时;如,当前为5月份,
切换年份至之前的年份,例如,当前2023年,切换为2022年,
月份选择列表中的月份列表没有更新,还是2023年的1-5月,应为1-12月。

报错反馈

line 358、line 363、line368 创建的是input元素,但用了 .html(),虽然JQ不会出现啥错误,但是当给一个元素使用 .html() 参数传的是一个 undefined 变量的话,会导致后面的appendTo报错,执行不下去。

建议:
1、初始化_html 这个变量的时候 ,把它初始化为空
2、创建完input后不要跟 .html() 函数,即去掉 .html(_html)

增加触发事件

默认是click事件

obj.bind("click",fun.show);

增加focus事件, 方便使用tab按键切换的用户.

清除日期值,没能彻底清除掉已选中的日期的状态,想还原成初始状态。

http://code.ciaoca.com/jquery/cxCalendar/demo/api
你好,
DOM页--API接口里的示例按钮:
1.点击“”设置日期值(2014.11.29)“
日历输入框显示 2014.11.29 00:00:00

2.点击“”清除日期值“”,日历输入框 为空

3.再点击日历输入框 ,打开日历选择器,
201.11.29 还存在高亮的选中状态,
如下图
qq 20180601164055

想去掉它的选中状态,类似还原成初始状态。

用了其它方法解决

月份

1645000828(1)
请问一下现在为什么不能选择1月份,是因为超过一年前的时间不能选择?

startDate指定时分秒的bug

var d = new Date();
d.setHours(9,0,0);
dateFirst.cxCalendar({startDate:d,type:'datetime',format:'YYYY-MM-DD HH:mm:ss'});

startDate 这个参数若只设置 时、分、秒时,
当指定的值大于当前时间则正常,否则就有异常了,正确值应该是第二天的指定时、分、秒

today按钮的bug

当点toda 按钮的时候得考虑data-start-date 、data-end-date两个参数的值,如果不在可选范围内,today得隐藏或 return 掉,不让可点。

另外提个建议:
有时候根据业务需要,有些特殊情况,如以下场景:
1、只要选择年
2、只需要月份
3、同时需要年和月
这些是可以考虑完善一下的。谢谢!

css样式与bootstrap冲突,及一个难以关闭选取框的缺陷修复

你好,我在项目中使用了你的日期组件,使用中碰到两个问题,反馈给你。

我的项目中同时用了bootstrap,我发现两者之间有点冲突,会导致日期选择框内的内容排列错乱,修复方法如下:
.cxcalendar增加一个样式:box-sizing:content-box;
同时增加一个新的样式:
.cxcalendar *{box-sizing:content-box}
或者您可以大修一下,使其在border-box下正常显示,与bootstrap兼容。

另一个问题,我一开始用的时候发现弹出的选取框没法关闭,只能选了日期后才能关闭,在页面中其它部分点击无法关闭,而你的演示页面上不存在这个问题。找了头天才找到原因,原因是那个遮罩层太小了,而你的演示页面上为body定义了minheight来避免这个问题。这是由于你在定义遮罩层大小时用的是body的宽、高引起的,修复如下:
var docWidth = document.body.clientWidth;
var docHeight = document.body.clientHeight;
改成如下,使用窗口的宽、高:
var docWidth = document.documentElement.clientWidth;
var docHeight = document.documentElement.clientHeight;

动态加载的数据无法绑定

动态加载的数据无法绑定

在页面里点击按钮新增一行tr input name="next_date" /tr,此条为append()添加,
$('input[name=next_date]').cxCalendar();无法绑定,在$(document)中也无法绑定,

望指教

如何触发选择日期后的事件

比如我要实时修改查询结果,当我点击日期后,立刻要调用我的一个函数,我用react 的 onChange事件取监听 监听不到 源码好像是用html() 实现 这东西好像不能触发事件(具体我也没去试)

jQuery cxCalendar的建议

建议:
1、在日期选择面板里增加两个按钮,一个清除按钮, 用于清除上一次选择的时间值,另一个快捷选择今天的按钮;
2、如果type值为:'datetime' 时,修改时间的交互方式不太友好,建议用select标签;
3、新增一个参数,限制不能选取周末;
4、增加一个接口,可以自定义添加哪些日期不让选择(如自定义节假日不让选择);
5、提供一个回调函数可以获取当前取值为当月和当年的第几周
希望能采纳,谢谢!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.