<!DOCTYPE html>
<
html
>
<
head
>
<
meta
charset
=
"UTF-8"
>
<
title
>DOM事件探秘</
title
>
<
style
type
=
"text/css"
>
* {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
#qq-wrap {
position: absolute;
margin: 0 auto;
padding: 20px 10px;
width: 580px;
height: 260px;
border: 1px solid gray;
border-radius: 15px;
}
#qq-top {
height: 44px;
width: 200px;
background: url(../QQ/images/login_window_logo.png) no-repeat -200px 0;
margin: 5px auto;
background-color: red;
}
#qq-con {
font-size: 1.2rem;
width: 230px;
margin: 0 auto;
}
#qq-con>div {
margin-top: 40px;
}
input {
font-size: 1rem;
}
input[type=submit] {
font-size: 1rem;
width: 80px;
margin: 0 20px 0 15px;
}
#state {
padding-top: 2px;
height: 29px;
font-size: 0rem;
}
#state .s-state {
display: inline-block;
height: 15px;
width: 110px;
vertical-align: bottom;
}
.s-state>span {
vertical-align: bottom;
display: inline-block;
/*width: 35px;*/
height: 15px;
line-height: 18px;
margin: 0 3px;
}
#state span:first-child {
width: 15px;
}
.online {
background: url(../QQ/images/ptlogin.png) 0 0 no-repeat;
}
.away {
background: url(../QQ/images/ptlogin.png) -18px 0 no-repeat;
}
.busy {
background: url(../QQ/images/ptlogin.png) -36px 0 no-repeat;
}
.nobody {
background: url(../QQ/images/ptlogin.png) -72px 0 no-repeat;
}
.please {
background: url(../QQ/images/ptlogin.png) -90px 0 no-repeat;
}
#state .state2 {
width: 10px;
background: url(../QQ/images/ptlogin.png) no-repeat -0px -18px;
}
#state span:last-child {
/*width: 90px;*/
font-size: 0.5rem;
}
#states {
width: 110px;
border: 1px solid #000;
font-size: 0.8rem;
margin-left: 115px;
display: none;
background-color: #fff;
}
#states .st-ico {
display: inline-block;
width: 15px;
height: 15px;
}
#states .st-text {
vertical-align: top;
}
#states .st-li {
text-indent: 20px;
}
#states .st-li:hover {
background-color: gray;
}
</
style
>
</
head
>
<
body
>
<
div
id
=
"qq-wrap"
>
<
div
id
=
"qq-top"
></
div
>
<
form
id
=
"qq-con"
name
=
"qq-con"
>
<
div
>
<
label
>账号</
label
>
<
input
type
=
"text"
name
=
"user"
placeholder
=
"请输入QQ号或邮箱"
>
</
div
>
<
div
>
<
label
>密码</
label
>
<
input
type
=
"password"
name
=
"password"
>
</
div
>
<
div
id
=
"state"
>
<
input
type
=
"submit"
name
=
"submit"
value
=
"确定"
>
<
div
>
<
span
></
span
>
<
span
></
span
>
<
span
>我在线</
span
>
</
div
>
</
div
>
<
ul
id
=
"states"
>
<
li
id
=
"online"
><
span
class
=
"st-ico online"
></
span
><
span
>我在线</
span
></
li
>
<
li
id
=
"away"
><
span
class
=
"st-ico away"
></
span
><
span
>离线</
span
></
li
>
<
li
id
=
"busy"
><
span
class
=
"st-ico busy"
></
span
><
span
>忙碌</
span
></
li
>
<
li
id
=
"nobody"
><
span
class
=
"st-ico nobody"
></
span
><
span
>不在</
span
></
li
>
<
li
id
=
"please"
><
span
class
=
"st-ico please"
></
span
><
span
>请勿打扰</
span
></
li
>
</
ul
>
</
form
>
</
div
>
<
script
type
=
"text/javascript"
>
var eventUtil = {
// 添加事件
addHandler:function(elem,type,handler){
if (elem.addEventListener) {
elem.addEventListener(type,handler,false);
}else if (elem.attachEvent) {
// IE type前需要加'on'
elem.attachEvent('on'+type,handler);
}else{
elem['on'+type] = handler;
}
},
// 删除事件
removeHandler:function(elem,type,handler){
if (elem.removeEventListener) {
elem.removeEventListener(type,handler,false);
}else if (elem.detachEvent) {
// IE type前需要加'on'
elem.detachEvent('on'+type,handler);
}else{
elem['on'+type]=null;
}
},
// 获取事件对象
getEvent:function(event){
return event?event:window.event;
},
// 获取事件对象的类型
getType:function(event){
return event.type;
},
// 获取事件对象的目标
getElement:function(event){
return event.target||event.srcElement;
},
// 阻止事件对象冒泡
stopPropagation:function(event){
if (event.stopPropagation) {
event.stopPropagation();
// 不要忘了加括号
} else {
event.cancelBubble = true;
}
},
// 阻止事件对象的默认行为
preventDefault:function(event){
if (event.preventDefault) {
event.preventDefault();
// 不要忘了加括号
} else {
event.returnValue = false;
// 这里注意boolean值
}
}
};
// QQ
var sState = document.getElementsByClassName('s-state')[0],
span_ico = sState.getElementsByTagName('span')[0],
states = document.getElementById('states'),
s_text = sState.getElementsByTagName('span')[2],
li_s = document.getElementsByClassName('st-li');
eventUtil.addHandler(sState,'click',function(event){
event = eventUtil.getEvent(event);
eventUtil.stopPropagation(event);
states.style.display = 'block';
});
for (var i = 0; i < li_s.length; i++) {
eventUtil.addHandler(li_s[i],'click',function(event){
event = eventUtil.getEvent(event);
eventUtil.stopPropagation(event);
states.style.display = 'none';
span_ico.className = this.id;
s_text.innerHTML = this.getElementsByClassName('st-text')[0].innerHTML;
});
}
// 点击空白区域,关闭下拉面板
document.onclick = function(){
states.style.display = 'none';
}
// 移动QQ面板
var qq_top = document.getElementById('qq-top'),
qq_wrap = document.getElementById('qq-wrap');
eventUtil.addHandler(qq_top,'mousedown',function(event){
mouseD(event);
});
function mouseD(event){
event = eventUtil.getEvent(event);
eventUtil.stopPropagation(event);
// 计算光标在面板中的距离
var disX = event.clientX-qq_wrap.offsetLeft,
disY = event.clientY-qq_wrap.offsetTop;
console.log(disX);
eventUtil.addHandler(document,'mousemove',function(event){
mouseM(event,disX,disY);
});
//这个mouseup事件我不知道要怎么写了
eventUtil.addHandler(document,'mouseup',function(event){
event = eventUtil.getEvent(event);
eventUtil.stopPropagation(event);
eventUtil.removeHandler(document,'mousemove',function(event){
mouseM(event);
});
});
}
function mouseM(event,posX,posY){
var winW=document.documentElement.clientWidth || document.body.clientWidth,
winH=document.documentElement.clientHeight || document.body.clientHeight,
maxW=winW-qq_wrap.offsetWidth,
maxH=winH-qq_wrap.offsetHeight;
// 注意此函数的参数,需要重新赋值
var event = eventUtil.getEvent(event);
eventUtil.stopPropagation(event);
// 计算移动中面板的位置
var L = event.clientX-posX,
T = event.clientY-posY;
if (L<
0
) {
L
=
0
;
} else if(L>maxW){
L=maxW;
}
if (T<
0
) {
T
=
0
;
} else if(T>maxH){
T=maxH;
}
qq_wrap.style.left = L+'px';
qq_wrap.style.top = T+'px';
console.log(event.clientX+'+'+event.clientY+'+'+L+'+'+T);
}
</
script
>
</
body
>
</
html
>