然后就是.........................
// 鼠标移动 onMouseMove( X , Y , Shift )
// 鼠标移动用来获取监测区域.而其他的只对现有的检测区域下事件
addEventToList( "onMouseMove" );
function onMouseMove( Init* ){
mouseX = Init[0]; mouseY = Init[1];
if( eventList[ "onMouseMove" ][0] ){ handlerEvent( "onMouseMove" , "before" , Init* ); }
// 记录当前的范围内列表.然后对这个列表进行编辑
lastCheckRect = [];
lastCheckRect.assign( thisCheckRect );
// 对记录的列表进行操作编辑
for( var i = 0 ; i < checkBOXRect.count ; i++ ){
if( checkBOXRect[i].includedPos( Init[0] , Init[1] ) ){
// 当前区域不支持检测
if( !checkBOXRect[i].checkBOX ){ continue; }
// 列表里啥也没有
if( lastCheckRect.count == 0 ){ lastCheckRect.add( checkBOXRect[i] ); continue; }
// 列表里已经存在
if( lastCheckRect.find( checkBOXRect[i] ) != -1 ){ continue; }
for( var r = 0 ; r < lastCheckRect.count ; r++ ){
// 如果当前绝对高度要小于列表那个
if( checkBOXRect[i].absolute < lastCheckRect[r].absolute ){
// 如果那东西不允许穿透退出当前循环
if( lastCheckRect[r].penetration == 0 ){ break; }
// 允许穿透检测后方是否存在.如果不存在就挂上去.如果存在就结束本次循环
else{
if( r + 1 == lastCheckRect.count ){
lastCheckRect.add( checkBOXRect[i] );
break;
}
continue;
}
}
// 如果当前绝对高度要大于列表那个
if( checkBOXRect[i].absolute > lastCheckRect[r].absolute ){
// 那就检测自己这个是否允许穿透
if( checkBOXRect[i].penetration == 1 ){
// 如果允许穿透.插入进去就完了
lastCheckRect.insert( r , checkBOXRect[i] );
}else{
// 如果不允许穿透.清空列表
if( r == 0 ){
lastCheckRect = [ checkBOXRect[i] ];
}else{
for( var v = r ; v < lastCheckRect.count ; ){ delete lastCheckRect[v]; }
lastCheckRect.add( checkBOXRect[i] );
}
}
break;
}
// 如果当前绝对高度等于列表那个
if( checkBOXRect[i].absolute == lastCheckRect[r].absolute ){
// 这里的大小于跟上面的一样.也是最终判定出了高度不同.
if( checkBOXRect[i].order < lastCheckRect[r].order ){
if( lastCheckRect[r].penetration == 0 ){ break; }
else{
if( r + 1 == lastCheckRect.count ){
lastCheckRect.add( checkBOXRect[i] );
break;
}
continue;
}
}
if( checkBOXRect[i].order > lastCheckRect[r].order ){
if( checkBOXRect[i].penetration == 1 ){
lastCheckRect.insert( r , checkBOXRect[i] );
}else{
if( r == 0 ){
lastCheckRect = [ checkBOXRect[i] ];
}else{
for( var v = r ; v < lastCheckRect.count ; ){ delete lastCheckRect[v]; }
lastCheckRect.add( checkBOXRect[i] );
}
}
break;
}
if( checkBOXRect[i].order == lastCheckRect[r].order ){
// 如果当前区域允许穿透.扔进去
if( checkBOXRect[i].penetration == 1 ){
lastCheckRect.insert( r , checkBOXRect[i] );
break;
}else{
// 到底了.并没有把这个区域踢出去.那就加入
if( r + 1 == lastCheckRect.count ){
lastCheckRect.add( checkBOXRect[i] );
break;
}
// 如果后面那个绝对相对高度都一样还允许穿透.直接结束本次循环
if( lastCheckRect[ r + 1 ].absolute == checkBOXRect[i].absolute &&
lastCheckRect[ r + 1 ].order == checkBOXRect[i].order &&
lastCheckRect[ r + 1 ].penetration == 1
){ continue; }
while(1){
// 当不同的情况下.塞进去
if( lastCheckRect[ r + 1 ].absolute != checkBOXRect[i].absolute ){ break; }
if( lastCheckRect[ r + 1 ].order != checkBOXRect[i].order ){ break; }
if( lastCheckRect[ r + 1 ].penetration == 0 ){ break; }
}
lastCheckRect.insert( r + 1 , checkBOXRect[i] );
break;
}
}
}
}
}else{
if( lastCheckRect.find( checkBOXRect[i] ) != -1 ){
// 如果已经不在范围内.移除
lastCheckRect.erase( lastCheckRect.find( checkBOXRect[i] ) );
i--;
continue;
}
}
}
// 对比两个列表的区别.然后调用对应事件
// 如果当前列表中的区域依然在编辑后的区域内
for( var i = 0 ; i < thisCheckRect.count ; i++ ){
if( lastCheckRect.find( thisCheckRect[i] ) != -1 ){
// 如果依然在列表内.那么调用move
if( typeof( thisCheckRect[i][ "onMouseMove" ] ) == "Object" ){
thisCheckRect[i].onMouseMove(...);
}
}else{
// 如果已经不在列表内.那么调用leave
if( typeof( thisCheckRect[i][ "onMouseLeave" ] ) == "Object" ){
thisCheckRect[i].onMouseLeave(...);
}
}
}
for( var i = 0 ; i < lastCheckRect.count ; i++ ){
if( thisCheckRect.find( lastCheckRect[i] ) == -1 ){
// 如果之前不在列表内.那么调用enter
if( typeof( lastCheckRect[i][ "onMouseEnter" ] ) == "Object" ){
lastCheckRect[i].onMouseEnter(...);
}
}
}
// 将更新后的列表交换回当前使用列表
thisCheckRect = [];
thisCheckRect.assign( lastCheckRect );
if( eventList[ "onMouseMove" ][0] ){ handlerEvent( "onMouseMove" , "back" , Init* ); }
}
因为很长...所以还是单开,它最终的效果是,
高度判定没啥好说的,那么如果允许穿透的话,多个被穿透的区域就会同时收到事件( 当然还是有一些顺序问题 )