注释.
<script>
document.attachEvent('onmouseover',function(){
//这两个是附加在style/attribute上的标记名.
var pcn='overclass';
var pfn='overfunction';
//取得函数本身.
var f=new function(){return this.constructor.caller};
//为e添加一个class
function AddCls(e,c)
{
var a=e.className.split(' ');
for(var i=0;i<a.length;i++)if(a[i]==c)return;
e.className=a.join(' ')+' '+c;
}
//移初e上的某个class
function RmvCls(e,c)
{
var a=e.className.split(' ');
for(var i=0;i<a.length;i++)if(a[i]==c)a[i]='';
e.className=a.join(' ');
}
var xs=[];//执行overfunction时可能发生的错误列表.
//循环srcElement和所有父系,!f[p.uniqueID]指未关联的
for(var p=event.srcElement;p!=null&&!f[p.uniqueID];p=p.parentElement)
{
new function()
{
var e=p;
f[e.uniqueID]=true;//标记为关联的
var cls=e.style[pcn]||e.currentStyle[pcn]||e[pcn];//取得配置,优先级为代码所示
if(cls)AddCls(e,cls);//如果有定义overclass,那么为e添加overclass所指的class
//添加onmouse的监视
e.attachEvent('onmouseout',function(){
if(e.contains(event.toElement))return;//如果onmouseout是在e内部发生的,那么忽略
f[e.uniqueID]=false;//取消关联标记
if(cls)RmvCls(e,cls);//AddCls的反操作
e.detachEvent('onmouseout',new function(){return this.constructor.caller});//取消onmouseout的监视
}); var fun=e.style[pfn]||e.currentStyle[pfn]||e[pfn];//取得配置
//执行overfunction
if(!fun)return;
try{eval(fun)(e);}
catch(x){xs[xs.length]=x;}
}
}
//如果有错误,那么抛出最后一个错误
if(xs.length!=0)
throw(xs[xs.length-1]);
})
</script>