动手练习,真的能发现好多问题,有问题还是好的,趁早解决,哈哈~不过还是有困惑~不知道去哪里找答案,先记着吧,以后看到相关的知识再回过头来看~
<!DOCTYPE html>
<html>
<head>
<style>
#div1{width:100px;height:100px;background:pink;position:absolute;}
</style>
<script>
window.onload=function(){
var oDiv1 = document.getElementById('div1');
oDiv1.onmousedown = function(ev){
var oEvent = ev || event;
var disX = oEvent.clientX - oDiv1.offsetLeft; //对象在鼠标按下时所处的位置
var disY = oEvent.clientY - oDiv1.offsetTop;
document.onmousemove = function(ev){
var oEvent = ev || event;
var l = oEvent.clientX - disX; //鼠标移动对象的位移
var h = oEvent.clientY - disY;
oDiv1.style.left = l + 'px';
oDiv1.style.top = h + 'px';
};
};
oDiv1.onmouseup = function(ev){
//清除函数,否则div将永远跟着鼠标移动
document.onmousemove = null;
document.onmouseup = null;
};
};
</script>
</head>
<body>
<div id="div1"></div>
</body>
</html>
看了教程,然后按自己的理解,再写了这个拖动,发现有bug。这是给div对象加上鼠标点击和松开的事件,显示都正常,但是当我们点击这个div,然后拖动它超出了浏览器的可视区域再松开鼠标时,就能发现它并没有触发div的onmouseup事件,所以在没有点击的情况下,div一直随鼠标移动。
然后回头再去看教程的代码,如下:
<!DOCTYPE html>
<html>
<head>
<style>
#div1{width:100px;height:100px;background:pink;position:absolute;}
</style>
<script>
window.onload=function(){
var oDiv1 = document.getElementById('div1');
oDiv1.onmousedown = function(ev){
var oEvent = ev || event;
var disX = oEvent.clientX - oDiv1.offsetLeft; //对象在鼠标按下时所处的位置
var disY = oEvent.clientY - oDiv1.offsetTop;
document.onmousemove = function(ev){
var oEvent = ev || event;
var l = oEvent.clientX - disX; //鼠标移动对象的位移
var h = oEvent.clientY - disY;
oDiv1.style.left = l + 'px';
oDiv1.style.top = h + 'px';
};
document.onmouseup = function(ev){
//清除函数,否则div将永远跟着鼠标移动
document.onmousemove = null;
document.onmouseup = null;
};
};
};
</script>
</head>
<body>
<div id="div1"></div>
</body>
</html>
教程中将onmouseup事件绑定在document上了,这样鼠标移出了可视区,松开时还是能触发该事件,所以一切正常。然后我又开始困惑了,为什么onmouseup要写在onmousedown里面呢,按理说,他们两个虽然有前后关系,先点击在有松开,但是并没有包含关系啊,就像鼠标移入移出一样,平时很少将移出写在移入函数里面,所以我就把onmouseup给弄出来了,结果错了,div一直跟着鼠标移动,松开貌似也没触发onmouseup函数。。。。
<!DOCTYPE html>
<html>
<head>
<style>
#div1{width:100px;height:100px;background:pink;position:absolute;}
</style>
<script>
window.onload=function(){
var oDiv1 = document.getElementById('div1');
oDiv1.onmousedown = function(ev){
var oEvent = ev || event;
var disX = oEvent.clientX - oDiv1.offsetLeft; //对象在鼠标按下时所处的位置
var disY = oEvent.clientY - oDiv1.offsetTop;
document.onmousemove = function(ev){
var oEvent = ev || event;
var l = oEvent.clientX - disX; //鼠标移动对象的位移
var h = oEvent.clientY - disY;
oDiv1.style.left = l + 'px';
oDiv1.style.top = h + 'px';
};
};
document.onmouseup = function(ev){
//清除函数,否则div将永远跟着鼠标移动
document.onmousemove = null;
document.onmouseup = null;
};
};
</script>
</head>
<body>
<div id="div1"></div>
</body>
</html>
然后多看了几遍才知道,其实有触发该函数,这个onmouseup是绑定在document上的,onmouseup松开鼠标时就被清空了,即这个函数只被执行一次就米有了。所以去掉上面的document.onmouseup = null;就可以了解惑一、将onmouseup事件绑定在document上时,在div上松开鼠标时还是能触发document上的事件;
困惑一、这里框框中的两句把onmousemove函数和onmouseup函数清空了,为什么第二次点击div时还能触发这两个函数呢,里面的内容不是被清空了么?
困惑二、尽管多次点击,下面红色框框中的函数只执行一次,只弹出了一次窗口,上面的就能多次执行呢???
有大大路过的也清忙我解解惑吖~