一个日历,兼容多种浏览器

无标题文档

/*******************************************************************************************

* 创建对象 var c = new Calendar("c"); document.write(c);
* 调用方法 c.show(arg1,arg2,arg3)
* 参数1: 文本输入框(必填). 如 onfocus="c.show(this)";
* 参数2: 按钮或其它可用单击事件的HTML元素(如果使用按钮方式则必填).
如 onclick="c.show(this,document.all.*)" *=文本输入框名称
* 参数3: 如果没有文本框没有值则使用该值初始化日历(选填).
如 onfocus="c.show(this,'2006-01-01')

* 注: 参数顺序不分先后. MSIE6/Opera8/FireFox1.5 下测试通过

************************如果您使用本日历控件 请保留该信息 谢谢! ***************************
* http://2lin.net
* Email:caoailin@gmail.com
* QQ:38062022
* Creation date: 2006-10-29
*********************************************************************************************/

function Calendar(objName)
{
this.style = {

borderColor : "#909eff", //边框颜色
headerBackColor : "#909EFF", //表头背景颜色
headerFontColor : "#ffffff", //表头字体颜色
bodyBarBackColor : "#f4f4f4", //日历标题背景色
bodyBarFontColor : "#000000", //日历标题字体色
bodyBackColor : "#ffffff", //日历背景色
bodyFontColor : "#000000", //日历字体色
bodyHolidayFontColor : "#ff0000", //假日字体色
watermarkColor : "#d4d4d4" //背景水印色

};

this.Obj = objName;
this.date = null;

this.mouseOffset = null;
this.dateInput = null;
this.timer = null;

this.drag = false;
};

Calendar.prototype.toString = function()
{
var str = this.getStyle();
str += '

\n';
str += '

';
str += this.getHeader();
str += this.getBody();
str += '

';
return str;
};

Calendar.prototype.getStyle = function()
{
var str = '\n';
str += '.calendar{position:absolute;width:142px;height:174px;background-color:'+this.style.bodyBackColor+';border:1px solid ' + this.style.borderColor + ';left:0px;top:0px;z-index:9999;}\n';
str += '.cdrHeader{background-color:'+ this.style.headerBackColor +';width:140px;height:22px;font-size:12px;color:'+this.style.headerFontColor+';}\n';
str += '.cdrWatermark{position:absolute;left:0px;top:55px;width:140px;font-family: Arial Black;font-size:50px;color:'+this.style.watermarkColor+';z-index:1;text-align:center;}\n';
str += '.cdrBodyBar{background-color:' + this.style.bodyBarBackColor + ';font-size:12px;color:' + this.style.bodyBarFontColor + ';width:140px;height:20px;}\n';
str += '.cdrBody{width:140px;font-size:12px;cursor:pointer;color:' + this.style.bodyFontColor + ';}\n';
str += '.dayOver{border:1px solid black;background-color:#f4f4f4;}\n';
str += '.menuOver{background-color:'+this.style.headerBackColor+';color:'+this.style.headerFontColor+';font-size:12px;}\n';
str += '.headerOver{border:1px solid black;background-color:#f4f4f4;color:black;cursor:default;}\n';
str += '.cdrMenu{font-size:12px;border:1px solid #000000;background-color:#ffffff;cursor:default;width:100%}\n';
str += '\n';
return str;

};

Calendar.prototype.getHeader = function()
{
var str = '

\n';
str += '

\n';
str += '

\n';
str += '

\n';
str += '

\n';
str += '

\n';
str += '

\n';
str += '

0 0 > >>

\n';
return str;
};

Calendar.prototype.getBody = function()
{
var n = 0;
var str = '

\n';
str += '

\n';
str += '

\n';
for(i = 0; i ';
for(j = 0; j

\n';
}
str += '

';
}
str += '

\n';
str += '

今天

\n';
return str;
};

Calendar.prototype.getYearMenu = function(year)
{

var str = '

\n';
for(i = 0; i

\n';
str += '

';
}

str += '

\n';
str += '

' + _year + '年
\n';
str += '

\n';
str += '
\n';
str += '

>>

';

var _menu = this.getObjById("cdrMenu");
_menu.innerHTML = str;

};

Calendar.prototype.getMonthMenu = function()
{

var str = '

\n';
for(i = 1; i

\n';
}
str += '

'+i+'月

';

var _menu = this.getObjById("cdrMenu");
_menu.innerHTML = str;
};

Calendar.prototype.show = function(arg1, arg2 , arg3)
{
if (arguments.length > 3 || arguments.length == 0)
{
alert("对不起!传入参数不对!" );
return;
}

var _date = null;
var _evObj = null;
var _initValue = null

for(i = 0; i = _obj.clientHeight)
{
_obj.style.top = _target.y + _evObj.clientHeight;
}
else
{
_obj.style.top = _target.y - _obj.clientHeight;
}

};

Calendar.prototype.hide = function()
{
var obj = this.getObjById("Calendar");
obj.style.display = "none";
};

Calendar.prototype.bindDate = function(date)
{

var _monthDays = new Array(31,30,31,30,31,30,31,31,30,31,30,31);
var _day = 1;
var _arr = date.split('-');
var _date = new Date(_arr[0],_arr[1]-1,_arr[2]);
if(isNaN(_date)) _date = new Date();
this.date = _date;
this.bindHeader();
var _year = _date.getFullYear();
var _month = _date.getMonth();

_monthDays[1] = ((_year%4==0)&&(_year%100!=0)||(_year%400==0))?29:28;

for(i = 0; i = new Date(_year,_month,1).getDay() && _day 999 && _year 999 && _year 12) {_month = 1; _year++;}
}
else
{
alert("年份超出范围(1000-9999)!");
}

this.bindDate(_year + '-' + _month + '-' + _date);
};

Calendar.prototype.onMouseMove = function (evt)
{
evt = evt || window.event;

if(this.drag && evt.button == 1)
{
var obj = this.getObjById("Calendar");
var mousePos = this.mouseCoords(evt);
obj.style.left = mousePos.x - this.mouseOffset.x;
obj.style.top = mousePos.y - this.mouseOffset.y;
}
}

Calendar.prototype.onDragStart = function (evt)
{
evt = evt || window.event;

var obj = this.getObjById("Calendar");
this.mouseOffset = this.getMouseOffset(obj,evt);
this.drag = true;
}

Calendar.prototype.onDragEnd = function (evt)
{
this.drag = false;
}

Calendar.prototype.mouseCoords = function(ev)
{
if(ev.pageX || ev.pageY){
return {x:ev.pageX, y:ev.pageY};
}
return {
x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
y:ev.clientY + document.body.scrollTop - document.body.clientTop
};
}

Calendar.prototype.getPosition = function(e)
{
var left = 0;
var top = 0;
while (e.offsetParent){
left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
top += e.offsetTop + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
e = e.offsetParent;
}

left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
top += e.offsetTop + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);

return {x:left, y:top};
}

Calendar.prototype.getMouseOffset = function(target, ev)
{
ev = ev || window.event;
var docPos = this.getPosition(target);
var mousePos = this.mouseCoords(ev);
return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

Calendar.prototype.showMenu = function(isyear)
{
var _menu = this.getObjById("cdrMenu");

if(isyear != null)
{

var _obj = (isyear)? this.getObjById("currentYear") : this.getObjById("currentMonth");

if(isyear)
{
this.getYearMenu(this.date.getFullYear() - 5);
}
else
{
this.getMonthMenu();
}

_menu.style.top = _obj.offsetTop + _obj.offsetHeight;
_menu.style.left = _obj.offsetLeft;
_menu.style.width = _obj.offsetWidth;

}

if (this.timer != null) clearTimeout(this.timer);

_menu.style.display="";

}

Calendar.prototype.hideMenu = function()
{
var _obj = this.getObjById("cdrMenu");
this.timer = window.setTimeout(function(){_obj.style.display='none';},500);
}

Number.prototype.NaN0 = function()
{
return isNaN(this) ? 0 : this;
}

Date.prototype.toFormatString = function(fs)
{
return this.getFullYear() + fs + (this.getMonth() + 1) + fs + this.getDate();
}

/*****************************************************结束************************************************************/

var c = new Calendar("c");
document.write(c);

普通调用:

按钮调用:

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

(0)

相关推荐

  • 一个日历,兼容多种浏览器

    无标题文档 /******************************************************************************************* * 创建对象 var c = new Calendar("c"); document.write(c); * 调用方法 c.show(arg1,arg2,arg3) * 参数1: 文本输入框(必填). 如 onfocus="c.show(this)"; * 参数2: 按钮

  • js行号显示的文本框实现效果(兼容多种浏览器 )

    利用js打造的一个非常实用简易的文本编辑框,可以显示行号并且同时兼容ie和firefox等主流浏览器,如下效果图: 以下是该效果的源码: <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <title>显示行号的文本框效果,兼容ie.火狐等浏览器</title> <style type=&q

  • Javascript多种浏览器兼容写法分析第1/3页

    示例代码: <body> <table border="1" cellspacing="0" cellpadding="0" id="apple" > <tbody> <tr> <td id="banana" style="color:red" >不吃苹果</td> </tr> </tbody>

  • Bootstrap编写一个兼容主流浏览器的受众门户式风格页面

    上一次写的<Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面>(点击打开链接)部分老一辈的需求可能对这种后现代的风格并不满意,没关系,我们完全可以改变布局拉成门户式的风格,他们马上就接受了: 首先,门户式的布局的大概你要清楚,这一才利于我们快速布局开头是一个较小的巨幕,后是一个导航栏,这里还是用到了按钮组接着是各个专栏,这里是关于bootstrap栅格系统与面板的运用,最后是版权信息,这里还是一个面板. 反正个人觉得这种门户式的布局风格烂大街,但不知道为何似乎很受众的样子. 我们需

  • 兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)

    小项目龙里中学多媒体教室管理系统中后台管理用到了iframe.由于要动态载入内容,所以需要iframe自适应内容页的高度.用谷歌搜索到很多答案,其中成功的是这段代码 复制代码 代码如下: <script type="text/javascript"> function SetCwinHeight() { var iframeid = document.getElementById("maincontent1"); //iframe id if (docu

  • 兼容主流浏览器的JS复制内容到剪贴板

    现在浏览器种类也越来越多,诸如 IE.Firefox.Chrome.Safari等等,因此现在要实现一个js复制内容到剪贴板的小功能就不是一件那么容易的事了. 在FLASH 9 时代,有一个通杀所有浏览器的js复制内容到剪贴板的方案: 这个方案是一个最流行的方法: 著名的Clipboard Copy解决方案 利用一个clipboard.swf作为桥梁,复制内容到剪贴板. 原理是:创建一个隐藏的flash文件,同时给给flash的变量FlashVars 赋值"clipboard=..",

  • Javascript iframe交互并兼容各种浏览器的解决方法

    在Web前端开发中,我们经常会用到iframe这个控件. 但是这个控在内.外交互时,往往各个浏览器所用的关键字不同,很是麻烦,为了能够得到子iframe中的window对象,各家浏览器有着各家的指定,有的是window,有的是contentWindow等等也许还有我们不知道的. 但是从子页面访问父层页面,其本上大家都是window.parent就可以了. 那么通过这个特征,我们可以在子页面中,把自身的window对象传递给父页面就可以了,这样父页面就很轻松的访问子页面,再也不用靠虑如何从ifra

  • javascript 兼容各个浏览器的事件

    调用事件: 事件对象 什么是事件对象?在触发dom上的事件是都会产生一个事件对象event.例如鼠标点击的时候,自己就会产生比如点击的类型啊 还要那个元素发出的 dom 事件对象   type 属性用于获取事件对象, target属性 用于获取事件目标,stopPropagation()方法 阻止事件冒泡 preventDefault阻止事件的默认行为 IE中的事件对象  type 属性 用于获取事件对象, srcElement属性 用于获取事件目标 cancelBubble属性  用于阻止事件

  • css实现兼容各个浏览器的技巧的代码

    在编写css样式表的时候常常会碰到一写浏览器兼容的问题,象是不同内核的浏览器显示就不一定相同,不同版本的的浏览器也会产生上下兼容的问题,如何解决这些问题成了我们苦恼的问题,如果你对css hack技术很了解的话,那这就是太简单不过了,不过对于那些不怎么解的人来说可真成了他们所苦恼的事.在这就从 赵磊官方博客 引来一篇文章来介绍兼容各个浏览器的技巧.但是你也不要认为只要是浏览器显示出现差错就事浏览器的问题,也很可能是你的结构不好,建议你好好去学习一下语义结构,毕竟盖房子要先搭钢筋的. 1,盒解释器

  • 纯JavaScript实现的兼容各浏览器的添加和移除事件封装

    //事件处理兼容各种浏览器,采用能力检测方法,所谓能力检测,就是有能力就做,没有能力就不做 //定义一个处理事件的对象,兼容各种浏览器,dom2级事件处理和ie事件,如果这两个事件都不兼容,就采用dom0级处理 var eventUtil ={ addEvent:function(element,type,handler){ if (element.addEventListener) { //非IE浏览器采用dom2级事件处理,type为事件类型如:click,handler为事件处理函数,fa

随机推荐