首页 > 其他分享 >面向对象-拖拽

面向对象-拖拽

时间:2023-03-24 19:35:48浏览次数:36  
标签:prototype eve ele 面向对象 Drag var document 拖拽

<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>

 

长风破浪会有时,直挂云帆济沧海



标签:prototype,eve,ele,面向对象,Drag,var,document,拖拽
From: https://blog.51cto.com/u_15961676/6147975

相关文章

  • JavaScript 面向对象
    类和对象类是用于定义对象的模板或蓝图;它包含对象的属性和方法,我们可以使用class关键字来定义类。classPerson{constructor(name,age){this.name=name;t......
  • #yyds干货盘点 ant design table实现上下行拖拽功能(类组件)
    前言最好的种树是十年前,其次是现在。歌谣每天一个前端小知识提醒你改好好学习了知乎博主csdn博主b站博主放弃很容易但是坚持一定很酷我是歌谣喜欢就一键三连......
  • 实现一个简易的antd表格拖拽
    <a-table:columns="columns":data-source="dataSource"><templateslot="icon"slot-scope="record"><divstyle="cursor:pointer;":drag......
  • java面向对象
    封装的优点1.良好的封装能够减少耦合。2.类内部的结构可以自由修改。3.可以对成员变量进行更精确的控制。4.隐藏信息,实现细节。继承的特性子类拥有......
  • 面向对象
    面向对象1.初识面向对象面向过程&面向对象属性+方法=类对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统,但是具体到围观......
  • pathlib -- 面向对象的文件系统路径
    ......
  • 面向对象
    面向对象面向对象编程(Object-OrientedProgramming,OOP)面向对象编程的本质就是:以类的方式组织代码,以对象的组织封装数据对于描述复杂的事物,为了从宏观上把握、从整体上合......
  • Python 面向对象
    Python面向对象目录Python面向对象1编程范式介绍1.1面向过程编程(ProceduralProgramming)1.2面向对象编程2面向对象编程(Object-OrientedProgramming)2.1Class......
  • 面向对象全部内容
    目录面向过程面向对象类的定义和对象的产生定制对象自己独有的属性属性的查找顺序绑定方法和非绑定方法隐藏属性property装饰器继承super和mro多态组合内置方法(魔术方法简......
  • 大爽Python入门教程 7-6 面向对象编程 实例演示 简易方格游戏(二维)
    大爽Python入门公开课教案点击查看教程总目录1介绍将上一节,一维的面板拓展成二维的。面板数据从txt中读取出来玩家从左上进入,输入一串移动命令,展示中间过程玩家......