• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JavaScript > js前端日历控件(悬浮、拖拽、自由变形)

js前端日历控件(悬浮、拖拽、自由变形)

作者:草根鞋 字体:[增加 减小] 来源:互联网 时间:2017-05-11

草根鞋通过本文主要向大家介绍了js前端日历控件(悬浮、拖拽、自由变形)等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

很少发现网上有简洁好用的自定义前端控件的贴子,最近项目中需要,自己YY开始写前端控件,在此给大家分享

控件是基于jQuery.UI的Widget写的,写起来就方便很多,使用起来跟普通jQuery控件一样$(#id).control(option),看着眼熟吧,下面就开始了。

首先说下控件的依赖包,加载控件的时候必须先加载jQuery, jQuqery.UI, 另外jquery-ui.css

这个包也需要引用,此包主要应用了jQuery拖拽和放缩的样式,控件样式方面大家自由发挥,给了个自己写的默认样式包 (献丑了)。 

控件本身支持颜色自定义,可根据日期自定义日历上某日的颜色,另外可悬浮,拖拽,自由变形算是卖点吧,哈哈 

控件包加载是这样的:

<link href="../../Content/themes/base/jquery-ui.css" rel="external nofollow" rel="stylesheet" />
<link href="../../Content/datePrinter.css" rel="external nofollow" rel="stylesheet" />

<script src="../../Scripts/default/jquery-ui-1.8.20.min.js"></script>
<script src="../../Scripts/control/datePrinter.js"></script>

</div>

控件中的核心部分就是打印选中月的日历,是参考网上的代码,偷懒嘛,欢迎认领

例如页面代码如下:

<input type="text" id="datepickerInput"/>

调用的写法:

var dpCon = $("#datepickerInput").datePrinter({
      initDate: "2017-4-5", //初始化日期
      language: "EN", //语言
      resizable: true, //可自由变形
      draggable: true, //可悬浮拖拽
      showYearAndMonth: true, //是否显示年月下拉框
      getColor: getColor, //自定义颜色接口
      chooseDone: chooseDone //选中日历某日执行事件接口
    });

    //选中日期时让日历消失 当然此处可以执行比较复杂的业务,如服务器数据请求
    function chooseDone(date) {
      dpCon.datePrinter("dpHide");
    }

    //自定义日期颜色
    function getColor(day){
      if(day == 3 || day==7 || day==15)
        return "dpdisabled";
      else if(day== 5 || day==18 || day==23)
        return "dpyellow";
      else
        return "dpenable";
    }

    //获取当前选中的日期 调用控件提供的API getSelectDate
    dpCon.datePrinter("getSelectDate");

</div>

这样子就给上面的input text控件注册了一个日历控件,在点击input时,日历就会浮出,效果如下

 

你可能注意到右下角的小三角了,鼠标放上去之后可以随意变化日历的长宽,另外在日历上按住鼠标左键可以随意移动日期控件的位置,不挤占页面位置

 下面这段是打印日历的代码,供参考:

//默认获取当前日期
    var today = option.initDate ? option.initDate : new Date();
    this.options.initDate = today;
    //获取日期中的年份
    var y = today.getFullYear(),
    //获取日期中的月份(需要注意的是:月份是从0开始计算,获取的值比正常月份的值少1)
    m = today.getMonth(),
    //获取日期中的日(方便在建立日期表格时高亮显示当天)
    d = today.getDate(),
    //获取当月的第一天
    firstday = new Date(y, m, 1),
    //判断第一天是星期几(返回[0-6]中的一个,0代表星期天,1代表星期一,以此类推)
    dayOfWeek = firstday.getDay() == 0 ? 7 : firstday.getDay(),
    //创建月份数组
    days_per_month = new Array(31, 28 + self._isLeap(y), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
    //确定日期表格所需的行数
    str_nums = Math.ceil((dayOfWeek + days_per_month[m] - 1) / 7);
    //二维数组创建日期表格
    for (i = 0; i < str_nums; i += 1) {
      var tr = '<tr>';
      for (k = 0; k < 7; k++) {
        //为每个表格创建索引,从0开始
        var idx = 7 * i + k;
        //将当月的1号与星期进行匹配
        var day = idx - dayOfWeek +2;
        var styleName = self._getColor(day);
        if (option.getColor && typeof (option.getColor) == 'function')
          styleName = option.getColor(day);
        styleName += " dateTD";

        (day <= 0 || day > days_per_month[m]) ?
        //索引小于等于0或者大于月份最大值就用空表格代替
        (day = ' ', styleName = "dpBlank") : (day = idx - dayOfWeek + 2);
        day == d ? tr += '<td class="' + styleName + ' today">' + day + '</td>' :
        //高亮显示当天
        tr += '<td class="' + styleName + '">' + day + '</td>';
      }
      tr += '</tr>';
      self._dpTable.append(tr);
      tr = "";
    }


</div>

以前都是写后台,玩前端的时间不长,有不对的地方欢迎指正

datePrinter.js的全部代码如下:

var _datePrinter_tmpl_CN = "<tr><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th><th>日</th></tr>";
var _datePrinter_tmpl_EN = "<tr><th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th><th>Sun</th></tr>";

Date.prototype.Format = function (fmt) { //author: meizz 
 var o = {
  "M+": this.getMonth() + 1,     //月份 
  "d+": this.getDate(),     //日 
  "h+": this.getHours(),     //小时 
  "m+": this.getMinutes(),     //分 
  "s+": this.getSeconds(),     //秒 
  "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
  "S": this.getMilliseconds()    //毫秒 
 };
 if (/(y+)/.test(fmt))
  fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
 for (var k in o)
  if (new RegExp("(" + k + ")").test(fmt))
   fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
 return fmt;
}

$.widget("ui.datePrinter", {
 options: {
  initDate: null,
  language: null, // CN,EN
  resizable: false,
  draggable: false,
  width: "240px",
  dateFormat:'yyyy/MM/dd',
  getColor: null, //自定义颜色
  showYearAndMonth: false,
  chooseDone: function (selectDate) { return selectDate }, //选中日期后执行的自定义事件
  autoId:null //控件Id
 },
 _dpTable: null,
 _dpRoot:null,
 _selectDate:null, //选中日期
 _create: function () {
  var self = this, option = this.options, ele = this.element;
  $(ele).after("<div class='dpRoot'></div>");
  self._dpRoot = $(ele).parent().find('div.dpRoot');
  self._dpRoot.empty();

  self._dpRoot.append("<div class='dpTitle' style='text-align:right;background-color:#e8edf4; width:" + option.width +
   "'><select class='selYear'></select><select class='selMonth'></select><a style='color:#000;text-decoration:none;font-size:18px;padding-left:10px; padding-right:10px;width:10px;' href='javascript:void(0);'>x</a></div>");
  self._dpRoot.append("<table style='width:" + option.width + "' cellspacing='0'></table>");
  option.autoId = self._newGuid();
 },
 _init: function () {
  var self = this, option = this.options, ele = this.element;
  if (option.initDate && typeof option.initDate == 'string')
   option.initDate = new Date(option.initDate.replace("-", "/"));

  //初始化日历
  self._initDate();

  //点击事件
  self._dpTable.delegate("td", "click", function () {
   if (!$(this).hasClass("dpBlank")) {
    self._dpTable.find("td").removeClass("today");
    $(this).addClass("today");
    //控件设置值
    $.proxy(self._setDate($(this).text()), self);

    if (option.chooseDone && typeof (option.chooseDone) == 'function')
     $.proxy(option.chooseDone(self._selectDate), self);
   }
  });

  if (option.resizable)
   self._dpRoot.resizable({
    minHeight: self._dpRoot.css("height").replace("px",''),
    minWidth:option.width.replace("px",''),
    resize: function



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-11基于canvas的二维码邀请函生成插件
  • 2017-05-11ThinkPHP+jquery实现“加载更多”功能代码
  • 2017-05-11Bootstarp 基础教程之表单部分实例代码
  • 2017-05-11JavaScript两个变量交换值的实现方法
  • 2017-05-11angular实现表单验证及提交功能
  • 2017-05-11jQuery简单实现MD5加密的方法
  • 2017-05-11使用JavaScript触发过渡效果的方法
  • 2017-05-11js制作可以延时消失的菜单
  • 2017-12-17js回调函数与 数组的一些方法
  • 2017-05-11jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 详解Vue2 无限级分类(添加,删除,修改)
    • js判断手机系统是android还是ios
    • 关于vuex的学习实践笔记
    • jquery操作select取值赋值与设置选中实例
    • 基于Bootstrap框架实现图片切换
    • js实现动态显示时间效果
    • JavaScript实现的鼠标响应颜色渐变效果完整实例
    • js中数组插入、删除元素操作的方法
    • 微信小程序 TLS 版本必须大于等于1.2问题解决
    • js 控制 history 返回事件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有