HTML组件库(之一:splitter)
微软自从在浏览器大战中战胜网景后,其HTML技术逐步走向组件化,从简单的javascript到scrptlet再到behavior技术,渐趋成熟。新版本的IE内部集成了许多很有用的behavior,在微软的站点上亦有免费的behavior库可供下载。其最新的web controls更是提供了几个强大的组件(工具栏,制表(TAB),树等)。用它们来构筑web程序倍感方便。从本文开始,我将推出一系列HTML组件的实现。这次给大家的是一个水平的splitter。(作为练习,希望大家把这个组件加上垂直方向split的功能)
源码一:splitter.htc
<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="oncontentready" ONEVENT="fnInit()" />
<PUBLIC:ATTACH EVENT="onmousedown" ONEVENT="fnGrab()" />
<public:event name="onsplit" ID=idsplit />
<SCRIPT LANGUAGE="JScript">
var giY=0; //全局变量,记载起始y坐标。
function fnInit() //初始化代码,给元素添加一个div元素,用于拖动。
{
var oDragWindow = window.document.createElement( "<div style='DISPLAY: none; FILTER: alpha( opacity=20 );POSITION: absolute;BACKGROUND-COLOR: black;overflow:hidden;'>" );
element.dragwindow = oDragWindow;
element.insertAdjacentElement( "beforeEnd" , oDragWindow );
}
function fnGrab() //当鼠标按下时,显示splitter,添加鼠标事件。
{
fnShowDragWindow();
window.document.attachEvent( "onmousemove" , fnMove );
window.document.attachEvent( "onscroll" , fnMove );
window.document.attachEvent( "onmousemove" , fnCheckState );
window.document.attachEvent( "onmouseup" , fnRelease );
window.document.attachEvent( "onselectstart", fnSelect );
}
function fnCheckState()
{
if( event.button != 1 ) fnRelease();
}
function fnSelect()
{
return false;
}
function fnMove() //移动鼠标时,亦同时移动splitter。
{
if (event.button != 1)
{
fnRelease();
return;
}
element.dragwindow.style.top = event.clientY + window.document.body.scrollTop;
if (event.clientY > window.document.body.clientHeight - 10 )
{
window.scrollBy(0, 10);
}
else if (event.clientY < 10)
{
window.scrollBy(event.clientX, -10);
}
}
function fnRelease() //当鼠标释放时,解除页面的鼠标事件,隐藏splitter,并触发onsplit事件。事件带有一个dy参数表示y轴方向的增量。
{
fnHideDragWindow()
var oEvent = createEventObject();
oEvent.dy = event.clientY-giY;
window.document.detachEvent( "onmousemove" , fnMove );
window.document.detachEvent( "onscroll" , fnMove );
window.document.detachEvent( "onmousemove" , fnCheckState );
window.document.detachEvent( "onmouseup" , fnRelease );
window.document.detachEvent( "onselectstart", fnSelect );
idsplit.fire(oEvent);
}
function fnShowDragWindow()
{
var iLeft=element.offsetLeft;
var o=element;
while(o.offsetParent){o=o.offsetParent;iLeft+=o.offsetLeft;}
element.dragwindow.style.height = element.offsetHeight;
element.dragwindow.style.top = event.clientY;
element.dragwindow.style.left = iLeft;
element.dragwindow.style.width = element.offsetWidth;
element.dragwindow.zIndex = 100;
element.dragwindow.style.display = "block";
giY=event.clientY;
}
function fnHideDragWindow()
{
element.dragwindow.style.display = "none";
element.dragwindow.style.height = "";
element.dragwindow.style.top = "";
element.dragwindow.style.left = "";
element.dragwindow.style.width = "";
element.dragwindow.zIndex = "";
}
</SCRIPT>
</PUBLIC:COMPONENT>
源码二:splitter.htm(测试页面)
<html>
<head>
<title>test splitter</title>
</head>
<body>
<div style="background:gray;height:60px;width:100%;">
</div>
<table style="width:100%;height:80%;backgroung:yellow;" cellspacing=10 cellpadding=0>
<tr>
<td rowspan=3 style="width:100px;background:green;">asd</td>
<td style="height:200px;background:blue;" id=box>asd</td>
</tr>
<tr>
<td style="background:black;height:5px;cursor:n-resize;behavior:url(splitter.htc)" onsplit="box.style.pixelHeight+=event.dy;window.status=(event.dy);"></td>
</tr>
<tr>
<td>asd</td>
</tr>
</table>
</body>
</html>
怎么样,很简单吧:)