【JavaScript框架封装】实现一个类似于JQuery的事件框架的封装

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81123753 ...
版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81123753
// 事件框架
(function (xframe) {
    // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法)
    xframe.extend({
        /**
         * 实现一个浏览器的基本事件的绑定
         * @param type
         * @param fn
         * @return {on}
         */
        on: function (type, fn) {
            // 注意这里的初始的下标编号是长度减一
            var i = this.length - 1;
            // 可以实现兼容版本的IE浏览器和W3c浏览器的支持
            if (document.addEventListener) {
                // w3c(这里使用的方式是从后向前遍历, 使得每一个DOM加载完毕之后再去添加事件)
                for (; i >= 0; i--) {
                    this[i].addEventListener(type, fn, false);
                }
            } else if (document.attachEvent) {
                // IE
                for (; i >= 0; i--) {
                    this[i].attachEvent('on' + type, fn);
                }
            } else {
                // 其他的浏览器
                for (; i >= 0; i--) {
                    // 获取json数据的两种方式,绑定事件的方式也可以
                    this[i]['on' + type] = fn;
                }
            }
            return this;
        },
        /**
         * 实现事件的解除绑定
         * @param type
         * @param fn
         * @return {un}
         */
        un: function (type, fn) {
            // 注意这里的初始下标编号
            var i = this.length - 1;
            if (document.removeEventListener) {
                // W3c
                for (; i >= 0; i--) {
                    this[i].removeEventListener(type, fn, false);
                }
            } else if (document.detachEvent) {
                // IE浏览器
                for (; i >= 0; i--) {
                    this[i].detachEvent(type, fn);
                }
            } else {
                // 其他浏览器的话,就直接默认绑定的所有事件置为null
                for (; i >= 0; i--) {
                    // 移出所有绑定的事件
                    this[i]['on' + type] = null;
                }
            }
            return this;

        },
        /**
         * 实现单个元素的事件绑定
         * @param fn
         * @return {click}
         */
        click: function (fn) {
            this.on('click', fn);
            return this;

        },
        /**
         * 实现鼠标移动进来和出去的事件响应(鼠标悬浮事件)
         * @param fnOver
         * @param fnOut
         * @return {hover}
         */
        hover: function (fnOver, fnOut) {
            var i = this.length;
            // 还是采用的是从后向前遍历的方式
            for (; i >= 0; i--) {
                if (fnOver && typeof fnOver === 'function') {
                    this.on('mouseover', fnOver);
                }
                if (fnOut && typeof  fnOut === 'function') {
                    this.on('mouseout', fnOut);
                }
            }
            return this;
        },
        /**
         * 如果被选元素可见,则隐藏这些元素,如果被选元素隐藏,则显示这些元素。
         * toggle方法,切换,接收任意个参数,不断在参数间循环.例:点击显示隐藏
         * @return {toggle}
         */
        toggle: function () {
            // 实现一个事件的切换f1, f2
            var self = this,
                _arguments = arguments,
                i = 0,
                len = this.length;


            // 把所有的事件响应函数存起来
            for (; i < len; i++) {
                addToToggle(this[i]);
            }


            /**
             * 鼠标点击之后逐个调用自己绑定的事件
             * @param obj
             */
            function addToToggle(obj) {
                // 定义一个私有的计数器
                var count = 0;
                // 添加事件
                self.on('click', function () {
                    // 使用call去修改this的指向(这里的主要作用是去切换,轮巡切换状态)
                    _arguments[count++ % _arguments.length].call(obj);
                });
            }

            return this;
        }
    });

    // 不需要参与链式访问的
    xframe.extend(xframe, {
        /**
         * 获取事件对象
         * @param event
         * @return {Event}
         */
        getEvent: function (event) {
            return event ? event : window.event;
        },
        /**
         * 获取触发事件的元素
         * @param event
         * @return {*|Element|Object}
         */
        getTarget: function (event) {
            var event = this.getEvent(event);
            return event.target || event.srcElement;
        },
        /**
         * 阻止事件冒泡
         * @param event
         */
        stopPropagation: function (event) {
            var event = this.getEvent(event);
            if (event.stopPropagation) {
                // W3c
                event.stopPropagation();
            } else {
                // IE
                event.cancelBubble = true;
            }
        },
        /**
         * 阻止默认的行为
         * @param event
         */
        preventDefault: function (event) {
            var event = this.getEvent(event);
            if (event.preventDefault) {
                // w3c
                event.preventDefault();
            } else {
                // IE
                event.returnValue = false;
            }
        },
        /**
         * 获取鼠标滚轮的运动的详细信息
         * @param event
         * @return {*}
         */
        getDelta: function (event) {
            var event = this.getEvent(event);
            if (event.wheelDelta) {
                // w3c
                return event.wheelDelta;
            } else {
                // ie
                // Firefox的值有所不同,因此首先要将这个值的符号反向,然后再乘以40,就可以保证与其它浏览器的值相同了
                return -event.detail * 40;
            }
        }
    });
})(xframe);

 

相关文章
|
2月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端框架
【10月更文挑战第34天】在数字化时代,后端开发如同一座桥梁,连接着用户界面与数据处理的两端。本文将通过Node.js这一轻量级、高效的平台,带领读者领略后端框架的魅力。我们将从基础概念出发,逐步深入到实战应用,最后探讨如何通过代码示例来巩固学习成果,使读者能够在理论与实践之间架起自己的桥梁。
|
12天前
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
121 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
2月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
59 5
|
2月前
|
缓存 监控 JavaScript
Vue.js 框架下的性能优化策略与实践
Vue.js 框架下的性能优化策略与实践
|
2月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
45 2
|
2月前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
2月前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
66 4
|
2月前
|
JavaScript 前端开发 开发者
JavaScript框架React vs. Vue:一场性能与易用性的较量
JavaScript框架React vs. Vue:一场性能与易用性的较量
41 0
|
2月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
2月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的融合之道
【10月更文挑战第31天】在追求快速、灵活和高效的后端开发领域,Node.js与Express框架的结合如同咖啡遇见了奶油——完美融合。本文将带你探索这一组合如何让后端服务搭建变得既轻松又充满乐趣,同时确保你的应用能够以光速运行。
44 0