面向对象-拖拽
<script> // 一个页面上实现两个拖拽 // 不同的效果:一个有边界限定,一个没有 function Drag(ele){ this.ele = ele; // 因为使用事件监听式绑定和删除 // 又将事件处理函数单独封装成原型上的方法 // 导致,this指向的问题 // 修复之后 // 导致,绑定和删除的不是一个事件处理函数 // 所以,提前处理事件处理函数中的this指向,并将处理之后的函数保存到实例身上,方便绑定和删除找到同一个事件处理函数 //事件绑定之前就将this绑定出来 this.m = this.move.bind(this);//=>事件监听函数中的第三个回调函数;move;这个this指的是this.ele本身 this.u = this.up.bind(this);//=>事件监听函数中的第三个回调函数;up; this.addEvent(); } Drag.prototype.addEvent = function(){ this.ele.addEventListener("mousedown",this.down.bind(this))//把正常的this传到down里面去 } Drag.prototype.down = function(eve){ var e = eve || window.event; this.x = e.offsetX; this.y = e.offsetY; document.addEventListener("mousemove",this.m); document.addEventListener("mouseup",this.u); e.preventDefault(); } Drag.prototype.move = function(eve){ var e = eve || window.event; this.ele.style.left = e.clientX - this.x + "px"; this.ele.style.top = e.clientY - this.y + "px"; } Drag.prototype.up = function(){ document.removeEventListener("mousemove",this.m)//绑定和删除处理的是同一个事件处理函数,绑定的是bind返回的函数,删除的是move。bind每次执行都会返回一个新函数,绑定的是一个,删除的是一个,两个不相同。在绑定之前,只能把它存出来 document.removeEventListener("mouseup",this.u) } var obox1 = document.querySelector(".box1"); var obox2 = document.querySelector(".box2"); new Drag(obox1); new Drag(obox2); </script>
混合继承拖拽:
<script>
// 一个页面上实现两个拖拽
// 不同的效果:一个有边界限定,一个没有
function Drag(ele){
this.ele = ele;
this.m = this.move.bind(this);
this.u = this.up.bind(this);
this.addEvent();
}
Drag.prototype.addEvent = function(){
this.ele.addEventListener("mousedown",this.down.bind(this))
}
Drag.prototype.down = function(eve){
var e = eve || window.event;
this.x = e.offsetX;
this.y = e.offsetY;
document.addEventListener("mousemove",this.m);
document.addEventListener("mouseup",this.u);
e.preventDefault();
}
Drag.prototype.move = function(eve){
var e = eve || window.event;
this.ele.style.left = e.clientX - this.x + "px";
this.ele.style.top = e.clientY - this.y + "px";
}
Drag.prototype.up = function(){
document.removeEventListener("mousemove",this.m)
document.removeEventListener("mouseup",this.u)
}
function SmallDrag(ele){
Drag.call(this,ele) //有则传,无则传
}
for(var i in Drag.prototype){
SmallDrag.prototype[i] = Drag.prototype[i]
}
var obox1 = document.querySelector(".box1");
var obox2 = document.querySelector(".box2");
new Drag(obox1);
new SmallDrag(obox2);
// 继承的应用场景:
// 多个对象,互相之间有多个功能的重叠,可以使用继承,继承重叠的方法
// 继承之后,如有差别,可以该别继承之后的方法
</script>
class继承-拖拽
<script> // 一个页面上实现两个拖拽 // 不同的效果:一个有边界限定,一个没有 class Drag{ constructor(ele){ this.ele = ele; this.m = this.move.bind(this); this.u = this.up.bind(this); this.addEvent(); } addEvent(){ this.ele.addEventListener("mousedown",this.down.bind(this))//把正常的this传到down里面去 } down(eve){ var e = eve || window.event; this.x = e.offsetX; this.y = e.offsetY; document.addEventListener("mousemove",this.m); document.addEventListener("mouseup",this.u); e.preventDefault(); } move(eve){ var e = eve || window.event; this.ele.style.left = e.clientX - this.x + "px"; this.ele.style.top = e.clientY - this.y + "px"; } up(){ document.removeEventListener("mousemove",this.m) document.removeEventListener("mouseup",this.u) } } class SmallDrag extends Drag{ constructor(ele){ super(ele) } } var obox1 = document.querySelector(".box1"); var obox2 = document.querySelector(".box2"); new Drag(obox1); new SmallDrag(obox2); </script>
长风破浪会有时,直挂云帆济沧海
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!