`
yuyongkun4519
  • 浏览: 44572 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ES5和ES6两种方式实现元素拖动(知识点es5原型继承和es6继承)

 
阅读更多

<!DOCTYPE html>

<html lang="en">

 

<head>

    <meta charset="UTF-8">

    <title>Document</title>

    <style type="text/css">

    body {

        padding: 0px;

        margin: 0px;

    }

 

    div {

        position: absolute;

        width: 100px;

        height: 100px;

        background-color: red;

    }

 

    #app2 {

        top: 150px;

        background-color: blue;

    }

    </style>

</head>

 

<body>

    <div id="app">app1</div>

    <div id="app2">app2</div>

    <script>

    //两种方式实现元素的拖动和添加限制条件拖动(用到了知识点原型链继承和es6继承)

 

    //es5 原型实现

    function Drag(id) {

        this.oDiv = document.getElementById(id);

        this.disx = 0;

        this.disy = 0;

        if (this.oDiv) {

            this.init();

        }

    }

    Drag.prototype.init = function() {

        this.oDiv.onmousedown = function(ev) {

            this.disx = ev.clientX - this.oDiv.offsetLeft;

            this.disy = ev.clientY - this.oDiv.offsetTop;

 

            document.onmousemove = this.fnmove.bind(this);

            document.onmouseup = this.fnup;

            return false;

        }.bind(this)

    }

    Drag.prototype.fnmove = function(ev) {

        this.oDiv.style.left = ev.clientX - this.disx + 'px';

        this.oDiv.style.top = ev.clientY - this.disy + 'px';

    }

    Drag.prototype.fnup = function() {

        document.onmousemove = null;

        document.onmouseup = null;

    }

    new Drag('app');

 

    function DragLimit(id) {

        Drag.call(this, id);

    }

    DragLimit.prototype = new Drag();

    DragLimit.prototype.fnmove = function(ev) {

        Drag.prototype.fnmove.call(this, ev);

        if (this.oDiv.offsetLeft <= 0) {

            this.oDiv.style.left = '0px';

        }

        if (this.oDiv.offsetTop <= 0) {

            this.oDiv.style.top = '0px';

        }

    }

    new DragLimit('app2');

    //es6 实现

    class Drag {

        constructor(id) {

            this.oDiv = document.getElementById(id);

            this.disx = 0;

            this.disy = 0;

            if (this.oDiv) {

                this.init();

            }

 

        }

        init() {

            this.oDiv.onmousedown = function(ev) {

                this.disx = ev.clientX - this.oDiv.offsetLeft;

                this.disy = ev.clientY - this.oDiv.offsetTop;

                document.onmousemove = this.fnmove.bind(this);

                document.onmouseup = this.fnup;

                return false;

            }.bind(this);

        }

        fnmove(ev) {

            this.oDiv.style.left = ev.clientX - this.disx + 'px';

            this.oDiv.style.top = ev.clientY - this.disy + 'px';

        }

        fnup() {

            document.onmousemove = null;

            document.onmouseup = null;

        }

    }

    new Drag('app');

    class LimitDrag extends Drag {

        fnmove(ev) {

            super.fnmove(ev);

            if (this.oDiv.offsetLeft <= 0) {

                this.oDiv.style.left = '0px';

            }

            if (this.oDiv.offsetTop <= 0) {

                this.oDiv.style.top = '0px';

            }

        }

 

    }

    new LimitDrag('app2');

    </script>

</body>

 

</html>

 

分享到:
评论

相关推荐

    es6转es5在线转换.txt

    es6转es5在线转换地址,和如何利用babel工具将es6语法转换成es5语法 es6有些语法是目前浏览器无法支持的,所以我们需要转换一下

    ES5与ES6继承.pdf

    ### ES5与ES6中的继承方式对比 #### 一、ES5继承机制解析 在ES5中,实现继承主要依赖于原型链(prototype chain)。这种继承机制的核心在于构造函数、原型对象以及实例对象之间的关系。 1. **构造函数**: - 在...

    js中ES6继承和ES5继承之间的差别.docx

    ES5 的继承方式不能继承原生构造函数(比如 Array、Number 等),因为 ES5 的继承是先制造子类的实例对象 this,再将父类原型的属性和方法重写到子类上,由于没法访问父类的内部属性,导致 ES5 的继承方式无法继原生...

    js笔记整理BOM和DOM,es5和es6

    JavaScript是Web开发中不可或缺的一部分,主要分为两个核心部分:BOM(浏览器对象模型)和DOM(文档对象模型),以及两种版本:ES5和ES6。本文将深入探讨这些概念及其重要知识点。 首先,BOM(Browser Object Model...

    ES6转ES5实例工程

    2. **类与继承**:ES6引入了`class`关键字,用于创建对象模型,而ES5则使用构造函数和原型链。转换过程会涉及`prototype`对象和`function`声明。 3. **模板字符串**:用反引号(`)括起的字符串,允许内嵌表达式 `${...

    DAY04_ES5和ES6.md

    DAY04_ES5和ES6.md

    js兼容es5-es6.rar

    标题“js兼容es5-es6.rar”表明这是一个解决ES5和ES6兼容性问题的资源包,它提供了一种方式来使得ES6的新特性在不完全支持它们的浏览器中也能工作,特别是针对IE7和IE8这样的老版本。 描述中提到,“本方法支持大...

    继承行为在 ES5 与 ES6 中的区别详解

    在ES5和ES6中,继承实现的方式有所不同,导致了在使用时的行为差异。本文将深入探讨这两种方式的区别。 首先,让我们回顾一下ES5的继承模式。在ES5中,没有内置的类或继承关键字,而是通过模拟类的概念来实现。常见...

    详解vue-cli+es6引入es5写的js(两种方法)

    在开始介绍具体方法之前,先简要回顾一下Vue-cli和ES6的基础知识,以及为何需要引入第三方ES5的JavaScript库。 Vue-cli是一个基于Vue.js进行快速开发的完整系统,它提供了一个官方的脚手架工具,帮助开发者快速搭建...

    ES5和ES6.md

    js一直被各个语言诟病,因为js的作用域让开发者困扰,也因为js在以前不算是面向对象的语言。...好的东西,兼容性总是不太好,不过,没关系,后期我们会学习一个工具将es6的语法转为兼容最好的es5的语法

    javascript设计模式【ES5和ES6语法】.zip

    javascript设计模式【ES5和ES6语法】

    ES6 转ES5小工具

    无需安装直接运行,所见即所得的转换模式,方便好用,对于ES6初学者是很棒的辅助工具。

    js文件 ES6转换为ES5

    JavaScript是Web开发中不可或缺的一部分,随着版本的更新,ES6(ECMAScript 2015)引入了许多新的特性和语法糖,提升了代码的可读性和简洁性。然而,考虑到浏览器兼容性和旧版本的JavaScript引擎,有时我们需要将ES6...

    【JavaScript源代码】ES5和ES6中类的区别总结.docx

    - ES5依赖构造函数和原型链实现类的行为,而ES6提供了更简洁的`class`关键字。 - **作用域差异**: - ES5中的类定义遵循函数作用域,而ES6中的类遵循块级作用域。 - **实例化差异**: - 在ES5中,即使不使用`new`...

    React中ES5与ES6写法的区别总结

    在 React 中,ES5 和 ES6 两种写法是开发者最常用的两种方式。这两种方式有着很大的区别,了解这两种方式的区别对开发者来说非常重要。 首先,lets 看看模块引用。在 ES5 中,如果使用 CommonJS 标准,引入 React ...

    Lebab用于将你的ES5代码转成ES6ES7

    2. **类与继承**:ES6引入了基于原型的类语法,提供了更接近传统面向对象编程的语言结构。类可以定义方法,可以通过`extends`关键字实现继承。 ES5: ```javascript function Animal(name) { this.name = name; ...

    babeljs es6 转 es5 离线版

    这是从https://babeljs.io 官方拔下来的一个 web在线 es6转es5的源码,代码中删除了无关的功能,对主要代码进行了注释, 并且对关键代码进行备注,可以提取出来作为js版本的es6to5用,不需要安装安装那么一套复杂的功能...

    十四、深入讲解JavaScript中ES5及ES6新特性及其实际应用

    内容概要:本文主要介绍 JavaScript 中 ES5 和 ES6 的新特性。涵盖严格模式、Bind 方法、JSON 处理、Let 和 Const 关键词、变量解构赋值、字符串扩展方法、Symbol 类型、Set 和 Map 集合以及 Generators 生成器和 ...

    JavaScript设计模式之原型模式分析【ES5与ES6】

    总之,原型模式是JavaScript中一种强大且灵活的对象创建方式,它让JavaScript的继承机制区别于传统的面向对象语言,为开发者提供了不同的编程思路和解决方案。通过理解和掌握原型模式,我们可以更加高效地利用...

    ES603. scope范围对ES5与ES6 function的影响

    [React_JS][ES6][前端教學]_ES6#03._scope範圍對ES5與ES6_function的影響

Global site tag (gtag.js) - Google Analytics