⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 taskmenu.js

📁 TaskMenu 3.0 用javascript写的模仿任务栏TaskMenu的程序
💻 JS
📖 第 1 页 / 共 2 页
字号:
//****************************************************
//                TaskMenu 3.0
//   		   静静的黎明 
//           http://www.docode.cn 
//**************************************************** 
/////////////////////////////////////////////////////////////////////////////////
var INF_IS_IEXPLORER = (navigator.userAgent.indexOf("MSIE") == -1)? false : true;
var INF_IS_MENU_BEHAVIOR_AUTO       = true;
var INF_IS_SCROLLBAR_ENABLED        = false;
///////////////////////////////////////////////////////
/////////////*** CONFIG ***////////////////////////////
var CFG_FRAME_COUNT                 = 6;
var CFG_DOCUMENT_MARGIN             = 12;
var CFG_MENU_SPACING                = 15;
var CFG_MENU_WIDTH                  = 185;
var CFG_SCROLLBAR_WIDTH             = 17;
var CFG_TITLEBAR_HEIGHT             = 25;
var CFG_TITLEBAR_LEFT_WIDTH         = 13;
var CFG_TITLEBAR_RIGHT_WIDTH        = 25;
var CFG_TITLEBAR_MIDDLE_WIDTH = CFG_MENU_WIDTH - CFG_TITLEBAR_LEFT_WIDTH - CFG_TITLEBAR_RIGHT_WIDTH;
var CFG_TITLEBAR_BORDER_WIDTH       = 0;
var CFG_MENUBODY_PADDING            = 9;
var CFG_MENUBODY_BORDER_WIDTH       = 1;
var CFG_SLEEP_TIME_BEGIN            = 20;
var CFG_SLEEP_TIME_END              = 60;
var CFG_ALPHA_STEP = Math.ceil( 100 / (CFG_FRAME_COUNT) );
var CFG_IS_SCROLLBAR_ENABLED        = true;
var CFG_IS_SPECIAL_HEAD_NODE        = false;

//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
if(new Array().push == null)
{
	//usage: array.push(Array); for ie5.0
	Array.prototype.push = function()
	{
		this[this.length] = arguments[0];
		return this.length;
	}
}
if(new Array().splice == null)
{
	/// usage: array.splice(startPos,deleteCount,[item1,item2,...]);for ie5.0
	Array.prototype.splice = function()
	{
		if(arguments.length < 2 || arguments[1] < 0) 
			return new Array();

		var endPoint1 = arguments[0];	
		if(endPoint1 < 0 && Math.abs(endPoint1) > this.length)
			endPoint1 = 0;

		var startPoint2 = (endPoint1 < 0)? (this.length + endPoint1 + arguments[1]) : (endPoint1 + arguments[1]);

		var bArray = this.slice(0,endPoint1);	
		var dArray = this.slice(endPoint1,startPoint2);
		var eArray = this.slice(startPoint2);
		var nArray = new Array();
		for(var i = 2; i < arguments.length; i++)
		{
			nArray.push(arguments[i]);
		}	
		var fArray = bArray.concat(nArray,eArray);

		for(var i = 0; i < fArray.length; i++)
		{
			this[i] = fArray[i];
		}
		this.length = fArray.length;
		
		return dArray;
	}
}
			
/////////////////////////////////////////////////////////////////		
function TaskMenuState(){}
TaskMenuState.uninited      =  0;
TaskMenuState.open          =  1;
TaskMenuState.close         =  2;
TaskMenuState.opening       =  4;
TaskMenuState.closing       =  8;
TaskMenuState.transforming  = 16;

function TaskMenuItem(strLabel,strIcon,strCommand)
{
	this.label      = strLabel;
	this.icon       = strIcon;
	this.command    = strCommand;
	this.hItem      = null;
	this.hLabel     = null;
	this.hIcon      = null;
	this.hLabelCell = null;
	this.container  = null;
	this.operTimer  = null;
	this.tranTimer  = null;
	this.operStep   = 0;
	this.tranStep   = 0;
	this.operCount  = 0;
	this.tranCount  = 0;

	this.init = function()
	{
		(this.hLabel = document.createElement("FONT")).reflectClass = this;
		with(this.hLabel)
		{	
			reflectClass = this;
		}
		with(this.hItem = document.createElement("TABLE"))
		{	
			cellPadding = 0;
			cellSpacing = 0;
			style.width = "100%";
		}
		(itemRow = this.hItem.insertRow(0)).className="MenuItemRow";
		with(blankCell = itemRow.insertCell(0))
		{
			style.width = (CFG_MENUBODY_PADDING - 2) +"px";
		}
		with(iconCell = itemRow.insertCell(1))
		{
			align  = "RIGHT";
			style.cssText = "width:18px;vertical-align:top;padding-top:3px";						
			with(this.hIcon = iconCell.appendChild(document.createElement("DIV")))
			{
				className = "IconContainer";
			}
		}
		
		with(this.hLabelCell = itemRow.insertCell(2))
		{
			style.padding = "2px " + CFG_MENUBODY_PADDING +"px 2px 5px";
			appendChild(this.hLabel);				
		}
		with(this)
		{
			setIcon(icon);	setLabel(label); setCommand(command);
		}
	}

	this.getLabel = function()
	{
		return this.label;
	}

	this.setLabel = function(strLabel)
	{
		this.hLabel.innerHTML = this.label = strLabel;
	}
	this.getIcon = function()
	{
		return this.icon;
	}

	this.setIcon = function(strIcon)
	{
		this.icon = strIcon;

		while(this.hIcon.firstChild != null)
		{
			this.hIcon.removeChild(this.hIcon.firstChild);
		}

		if(this.icon != null)
		{
			with(this.hIcon)
			{				
				style.width = "18px";
				parentNode.style.width = "18px";
				with(appendChild(new Image()))
				{
					src= this.icon;
				}
			}
		}
		else
		{
			this.hIcon.style.width = "0px";
			this.hIcon.parentNode.style.width = "0px";
		}
	}

	this.getCommand = function()
	{
		return this.command;
	}

	this.setCommand = function(strCommand)
	{
		if( (this.command = strCommand) != null)
		{
			JS.addListener(this.hLabel,"mouseover",TaskMenuItem.onMouseBehavior,false);
			JS.addListener(this.hLabel,"mouseout",TaskMenuItem.onMouseBehavior,false);
			JS.addListener(this.hLabel,"click",TaskMenuItem.onClick,false);
			this.hLabel.className = "MenuItemLabel";
		}		
		else
		{
			JS.removeListener(this.hLabel,"mouseover",TaskMenuItem.onMouseBehavior,false);
			JS.removeListener(this.hLabel,"mouseout",TaskMenuItem.onMouseBehavior,false);
			JS.removeListener(this.hLabel,"click",TaskMenuItem.onClick,false);
			this.hLabel.className = "MenuItemLabelDisabled";
		}
	}

	this.runCommand = function()	
	{
		try
		{	
			eval(this.command);	
		}
		catch(ex)
		{	
			alert("Javascript Error:" + ex.description);	
		}
	}

	this.cloneNode = function()
	{
		return new TaskMenuItem(this.label,this.icon,this.command);
	}

	this.init();
}

TaskMenuItem.onMouseBehavior = function()
{
	with(JS.getSourceElement(arguments[0]))
	{
		if(arguments[0].type.toUpperCase() == "MOUSEOVER")
			className = "MenuItemLabelMouseOver";
		
		else
			className = "MenuItemLabel"; 
	}	
}

TaskMenuItem.onClick = function()
{
	var refClass = JS.getSourceElement(arguments[0]).reflectClass;
	if(refClass != null) refClass.runCommand();
}

function TaskMenu(strLabel,menuState)
{
	this.menuID;
	this.label       = strLabel;
	this.state       = menuState;
	this.items       = [];
	this.hLabel      = null;
	this.hArrayCell  = null;
	this.titlebar    = null;
	this.menuBody    = null;
	this.previous    = null;
	this.next        = null;
	this.background  = null;
	this.operationTimer;
	this.transformTimer;
	this.invalidateTimer
	this.operationStep;
	this.transformStep;
	this.operationSleep;
	this.transformSleep;

	this._getAlphaOpacity = function()
	{
		try
		{
			if(INF_IS_IEXPLORER)	
				return this.menuBody.filters.alpha.opacity;

			else
				return this.menuBody.style.MozOpacity * 100;
		}
		catch(ex)
		{
			return 100;
		}	
	}

	this._setAlphaOpacity = function(n)
	{
		try
		{
			if(INF_IS_IEXPLORER)
				this.menuBody.filters.alpha.opacity = n;

			else
				this.menuBody.style.MozOpacity = n / 100;
		}
		catch(ex)
		{}	
	}
	this._clearItem = function()
	{
		for(var i =0; i< this.items.length; i++)
		{
			this.items[i].container = null;
		}
		this.items = new Array();
	}

	this._clearMenu = function()
	{
		if(this.menuBody == null) return;

		while(this.menuBody.firstChild != null)
			this.menuBody.removeChild(this.menuBody.firstChild);
	}

	this._setMenuFixed = function(bFlag)
	{
		if(this.menuBody == null) return;

		if(bFlag == true)	
		{
			this.menuBody.style.overflow = "hidden";
		}
		else
		{
			this.menuBody.style.overflow = "visible";
			this.menuBody.style.height   = "auto";	
		}			
	}

	this._setMenuHeight = function(height)
	{
		if(INF_IS_IEXPLORER)
			this.menuBody.style.height = height + "px";

		else
			this.menuBody.style.height = ( height - (2 * CFG_MENUBODY_PADDING + CFG_MENUBODY_BORDER_WIDTH) ) + "px";
	}

	this._getMenuHeight = function()
	{
		if(INF_IS_IEXPLORER)
			return this.menuBody.scrollHeight + CFG_MENUBODY_BORDER_WIDTH;

		else
		{
			var scrollHeight = 0;
			for(var i = 0; i < this.menuBody.childNodes.length; i++)
			{
				scrollHeight += this.menuBody.childNodes[i].offsetHeight;			
			}

			return scrollHeight + CFG_MENUBODY_BORDER_WIDTH + 2 * CFG_MENUBODY_PADDING;
		}
	}
	
	this._getScrollWidth = function()
	{
		return (INF_IS_SCROLLBAR_ENABLED)? CFG_SCROLLBAR_WIDTH : 0
	}
	
	this._fixMenuWidth = function(value)
	{
		var titlebarWidth = ( CFG_MENU_WIDTH + ( (INF_IS_IEXPLORER)? 0 : ( -2 * CFG_TITLEBAR_BORDER_WIDTH ) ) );
		var menuBodyWidth = ( CFG_MENU_WIDTH + ( (INF_IS_IEXPLORER)? 0 : ( -2 * CFG_MENUBODY_BORDER_WIDTH ) ) );
		var labelCell = this.titlebar.firstChild.rows[0].cells[1];
		var scrollbarWidth = this._getScrollWidth();

		this.hLabel.style.width   = (CFG_TITLEBAR_MIDDLE_WIDTH - scrollbarWidth) + "px";
		labelCell.style.width     = (CFG_TITLEBAR_MIDDLE_WIDTH - scrollbarWidth) + "px";
		this.titlebar.style.width = (titlebarWidth - scrollbarWidth) + "px";
		this.menuBody.style.width = (menuBodyWidth - scrollbarWidth) + "px";
		
		this._invalidate(true);
	}

	this._fixedMenuPosWhileClose = function()
	{	
		var scrollHeight = this._getMenuHeight();
		this._setMenuHeight(scrollHeight);
		this.menuBody.style.top = (this.titlebar.offsetTop + CFG_TITLEBAR_HEIGHT - scrollHeight) + "px";
		this.menuBody.style.clip = "rect(" + scrollHeight +" auto " + scrollHeight + " auto)";	
		this._setAlphaOpacity(0);
	}

	this._attachState = function(state)
	{
		switch(state)
		{
			case TaskMenuState.open:
			case TaskMenuState.close:
			case TaskMenuState.opening:
			case TaskMenuState.closing:
				this.state >>= 4;
				this.state <<= 4;
			case TaskMenuState.transforming:
				this.state |= state;
			break;
			case TaskMenuState.uninited:
				this.state = state;
			break;
		}
	}

	this._removeState = function(state)
	{
		if(this.state & state)	this.state ^= state;	
	}

	this._invalidate = function(bForce)
	{
		if(INF_IS_MENU_BEHAVIOR_AUTO == true || bForce == true)
		{
			this.invalidate();
		}
	}

	this._extend = function()
	{
		if(this.state & TaskMenuState.close)
		{
			this._fixedMenuPosWhileClose();
			this._removeState(TaskMenuState.transforming);
		}
		else
		{
			if(this.menuBody.offsetHeight + this.transformStep < this._getMenuHeight())
			{
				this._setMenuHeight(this.menuBody.offsetHeight + this.transformStep);
				this.transformTimer = setTimeout("TaskMenu.collection[" + this.menuID + "]._extend()",this.transformSleep += 5);
			}
			else
			{
				this._setMenuHeight(this._getMenuHeight());		
				this._removeState(TaskMenuState.transforming);	
			}
		}
		if(this.next != null) this.next._moveTo();
		TaskMenu._refreshAll();
	}

	this._shorten = function()
	{
		if(this.state & TaskMenuState.close)
		{
			this._fixedMenuPosWhileClose();
			this._removeState(TaskMenuState.transforming);
		}
		else
		{	
			if(this.menuBody.offsetHeight + this.transformStep > this._getMenuHeight())
			{	
				this._setMenuHeight(this.menuBody.offsetHeight + this.transformStep);
				this.transformTimer = setTimeout("TaskMenu.collection[" + this.menuID + "]._shorten()",this.transformSleep += 5);
			}
			else
			{
				this._setMenuHeight(this._getMenuHeight());
				this._removeState(TaskMenuState.transforming);
			}
		}
		if(this.next != null) this.next._moveTo();
		TaskMenu._refreshAll();
	}

	this._appendItems = function()
	{
		if(this.menuBody == null || this.items.length == 0)return;

		for(var i = 0; i < this.items.length; i++)
			this.menuBody.appendChild(this.items[i].hItem);
	}

	this._isSpecialHeadNode = function()
	{
		return CFG_IS_SPECIAL_HEAD_NODE && this == TaskMenu.headNode;
	}
	
	this._open = function()
	{
		var titlebarBottom = this.titlebar.offsetTop + CFG_TITLEBAR_HEIGHT;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -