封装自己的 jquery 框架

news2024/11/18 15:37:16

说到jquery,那就给大家先简单的介绍一下什么是jquery

jquery是JavaScript函数的一种封装。jQuery封装了JavaScript常用的功能代码(函数),提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。

  1. jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(框架)于2006年1月由John
    Resig发布。
  2. jquery是指一种封装好的JavaScript函数库,一个轻量级的"写的少,做的多"的JavaScript库。
  3. jQuery封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
  4. jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。

详情请去jquery官网 查看!

目录

  • 说到`jquery`,那就给大家先简单的介绍一下什么是`jquery`
  • 一,封装jquery`
    • 1,jqery的封装原理:
    • 2,如何封装自己的 jQuery
    • 2,jquery 方法封装
  • 二,下面是我封装jquery的代码

一,封装jquery`

接下来就说我封装jquery的一些心得和在网上查找的一些资料,由什么问题和错误望告知,谢谢!`

1,jqery的封装原理:

1、js的全局代码区只有一个,这样就会造成同名变量的值会被覆盖。‘

2、使用对象封装,将代码封装到对象中,但对象如果被覆盖,则全部失效,风险极高。

3、使用工厂模式,将代码进行封装,但是并没有解决问题。

4、将封装的函数名字去除,避免覆盖,但是函数没有办法调用了

5、匿名自调用。’可以在页面加载的时候调用一次,但是不能重复调用,并且数据没有办法获取。

6、使用闭包,在全局区中不能够获取函数体内的数据。使用更大作用域的变量来记录小作用域变量的值。

2,如何封装自己的 jQuery

返回new 一个初始化函数

	function jQuery(selector){
		// 返回new 一个初始化函数
		return new jQuery.fn.init(selector);
	}

定义其构造函数显式原型

// 定义JQuery构造函数的显示原型
	jQuery.fn =jQuery.prototype = {
		constructor:jQuery,
		jquery:"9.0.0",
		length:0,
		get(index){
			return this[index];
		},

这里使用沙箱模式,可以防止全局污染

<script>
(function(window,undefined){
var jQuery = function (ele){
return new jQuery.prototype.init(ele)
}

原型替换

jQuery.fn = jQuery.prototype ={
constructor:jQuery,
init:function(ele){
var ele = document.querySelectorAll(ele);
[].push.apply(this,ele);
},

这里用 css () 举例子

css:function(name,value){
if(arguments.length == 2){

设置 css 样式

}else if(arguments.length == 1){
if( typeof name === 'object'){

设置多个样式

}else if(typeof name == 'string'){
// 通过 getComputedStyle 获取
}
}
return this;
}
}

最关键的一步

jQuery.prototype.init.prototype = jQuery.fn;

暴露给全局

window.jQuery = window.$ = jQuery;
})(window)
</script>

2,jquery 方法封装

给jquery 身上设置全局方法;

 		// 方法一:
        jQuery.myFunction = function(str){
            console.log(str);
        }
        //方法一调用:
        $.myFunction('直接给jq身上设置全局方法');
        //方法二:
        // 同时添加多方法
        jQuery.extend({
            myFunction:function(str){
                console.log(str);
            },
            myFunction1:function(str){
                console.log(str);
            }
        })
        //方法二调用:
        $.myFunction('给jq身上同时添加多个全局方法');

        //方法三:
        jQuery.nameSpaces = {
            myFunction:function(str){
                console.log(str);
            },
            myFunction1:function(str){
                console.log(str);
            }
        }
        //方法三调用:
        $.nameSpaces.myFunction('用命名空间的方式给jq添加多个全局方法');

二,下面是我封装jquery的代码

jquer.js

;(function(){
	// 匿名函数自执行
	// jQ的构造函数
	function jQuery(selector){
		// 返回new 一个初始化函数
		return new jQuery.fn.init(selector);
	}
	// 定义JQuery构造函数的显示原型
	jQuery.fn =jQuery.prototype = {
		constructor:jQuery,
		jquery:"9.0.0",
		length:0,
		get(index){
			return this[index];
		},
		/* click(callback){
			// 单击时候让this的每个元素执行callback回调函数
			for(var i=0;i<this.length;i++){
				this[i].addEventListener("click",callback);
			}
			// jq实现链式操作每个函数执行完毕都是返回this
			return this;
		}, */
		/* toggle(){
			// 遍历每个元素如果display不是none就隐藏,否则就显示
			for(var i=0;i<this.length;i++){
				if(this[i].style.display!="none"){
					this[i].style.display="none"
				}else{
					this[i].style.display="block";
				}
			}
			return this;
		}, */
		each(callback){
			for(var i=0;i<this.length;i++){
				callback(this[i])
			}
			return this;
		},
		click(callback){
			// item指向的被遍历的每个元素
			this.each(function(item){
				// 让每个元素注册click事件 执行callback方法
				// 也就是click 括号里面的回调函数
				item.addEventListener("click",callback);
			})
			return this;
		},
		toggle(){
			this.each(function(item){
				if(item.style.display!="none"){
					item.style.display="none"
				}else{
					item.style.display="block";
				}
			})
		}
	}
	// jq初始化函数
	jQuery.fn.init =function(selector){
		// 获取到选择列表
		var list = document.querySelectorAll(selector);
		// 当前对象的长度
		this.length = list.length;
		for(var i=0;i<list.length;i++){
			//遍历类别对 this赋值
			this[i] = list[i];
		}
	}
	// 如何让new  init 产生对象拥有JQuery显示原型上的所有方法呢?
	jQuery.fn.init.prototype = jQuery.fn;
	// 全局对jQuery与$可以访问
	window.$=window.jQuery = jQuery;
	
})()

jquery.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/jquery-9.0.0.js"></script>
	</head>
	<body>
		<h1>jquery还是大哥吗?</h1>
		<p>是的</p>
		<h1>市场占用96.8%</h1>
		<button>切换</button>
		<script>
			// jq实现链式操作
			// 给button注册一个点击事件
			// each函数编写
			 $("button").click(function(){
				 // 让h1切换显示与隐藏
				 $("h1").toggle().click(function(){
					 alert(this.innerText);
				 });
			 })
		</script>
	</body>
</html>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器人运动学【2】

目录1.刚体状态的表达2.顺向运动学及DH表3.逆向运动学1.刚体状态的表达 我们前面已经学习了刚体移动和转动的表达&#xff0c;那么怎么将两者在数学上结合呢&#xff1f;这里我们开始构造如下矩阵&#xff0c;记作: 下面我们来看一下只有移动情况下的刚体的描述&#xff1a; …

使用canal解决Mysql和Redis数据同步(TCP)

使用canal解决Mysql和Redis数据同步(TCP) 工作原理分析 我们在面试的时候常常听面试官问这么一个问题&#xff1a;你们的Mysql和Redis怎么做数据同步的&#xff0c;根据不同的业务场景又很多方案&#xff0c;你可能会说先写库再删缓存&#xff0c;或者延迟双删或其他方案。今…

springboot集成flowable简单实例入门

此案例是demo。功能有创建流程、完成审批、生成流程图。适合有java基础的人员看。 第一步.画流程图 resources资源包下&#xff0c;新建processes包&#xff0c;新建一个文件&#xff0c;我命名他apply-rest.bpmmn20.xml。bpmn20.xml后缀文件是流程图配置文件。idea的右下角的…

ImageMol

ai圈也是卷的狠啊~~ 又发现一个全球首个分子图像自监督学习框架来也 分子是维持物质化学稳定性的最小单位。对分子的研究&#xff0c;是药学、材料学、生物学、化学等众多科学领域的基础性问题。 分子的表征学习&#xff08;Molecular Representation Learning&#xff09;是…

实践 | 大型基金管理公司数据脱敏体系建设

金融行业数据脱敏安全管理要求高、数据类型复杂、脱敏数据规模庞大。作为业内领先&#xff0c;且支持信创环境的数据安全产品&#xff0c;美创数据脱敏系统在金融行业应用广泛&#xff0c;可满足各类复杂环境下的数据脱敏需求&#xff1a; 台州银行—分布式大数据平台下的及时脱…

SQL Server数据库理论篇(进行时......)

SQL Server数据库理论篇 一. 数据库的关系分类 1.1.0 关系型数据库和非关系数据库区别&#xff1f; 结论&#xff1a;两种数据库的本质在于存储数据的形式不同 1.关系型数据库概念 关系型数据库最大的特征就是表&#xff0c;我们将对象的属性映射为表的一个个列名&#xff…

(九)centos7案例实战——redis一主二从三哨兵高可用服务搭建

前言 本节内容是使用centos服务器搭建一套高可用的redis服务&#xff0c;采用的是一主二从三哨兵的模式。 需要注意的是搭建集群的过程中&#xff0c;我们要保证集群服务器之间可以相互访问&#xff0c;并且redis所需要访问的端口是开放的。我们从redis的下载&#xff0c;源码…

ffmpeg 安装教程

官网&#xff1a;Download FFmpeg window 转&#xff1a;ffmpeg安装教程_moon son的博客-CSDN博客_ffmpeg安装 然后解压&#xff0c;配置全局变量环境。点击“系统属性->高级系统设置->环境变量->系统变量”&#xff0c;选择“Path”条目&#xff0c;点击“编辑->…

将项目部署到Linux系统上

目的是让我们的项目在linux上也能运行起来 有两种部署方式&#xff0c;手工部署或者是通过shell脚本自动部署 手工部署 准备工作&#xff1a;使用ifconfig指令查出服务器的ip地址&#xff1a;192.168.58.130 1.在本地Idea中开发一个springboot项目&#xff0c;并且打包成ja…

以太网模块的传输距离怎么看

光模块的关键标准组织主要有两个&#xff1a;IEEE和MSA。其中GBASE开头的标准主要是IEEE802.3提出与定义的。要弄清光模块的传输距离&#xff0c;首先让我们要弄清楚它的命名是怎样的。 100G光模块的命名规则&#xff1a; 400G光模块的命名规则&#xff1a; 其中100G和400G光模…

SpringBoot整合Mybatis方式1:使用XML方式整合Mybatis

SpringBoot整合Mybatis简介SpringBoot整合Mybatis方式1&#xff1a;使用XML方式整合Mybatis1.用idea创建一个添加mybatis需要的相关依赖的工程。2.准备数据库和表3.创建表映射类4.创建mapper文件4.1 创建UsersMapper.xml文件&#xff0c;并添加sql语句4.2 创建mapper对应的代理…

Docker的Cgroup资源限制

Docker通过Cgroup来控制容器使用的资源配额&#xff0c;包括 CPU、内存、磁盘三大方面&#xff0c;基本覆盖了常见的资源配颡和使用量控制。 Cgoup 是CotrolGroups 的缩写&#xff0c;是Linux 内核提供的一种可以限制、记录、隔高进程组所使用的物理资源&#xff08;如CPU、内存…

基于jsp的学生培训管理系统

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

【教学类-18-01】20221123《蒙德里安红黄蓝格子画》(大班)

效果展示&#xff1a; 单页效果 多页效果 预设效果 背景需求&#xff1a; 2022年11月23日&#xff0c;作为艺术特色幼儿园&#xff0c;蒙德里安风格装饰在我们幼儿园的环境中。 蒙德里安是几何抽象画派的先驱&#xff0c;以几何图形为绘画的基本元素&#xff0c;与德士堡等创…

MyBatis-Plus 和swagger

MyBatis-Plus 1.1MyBatis Plus 简介 mybatisplus 官网&#xff1a; https://baomidou.com/ MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c; 为简化开发、提高效率而生。 1.2主要特性&a…

【项目管理】Java使用pdfbox调用打印机打印PDF文件

【项目管理】Java使用pdfbox调用打印机打印PDF文件1.项目前言2.项目实现3.关键代码4.效果演示5.问题处理5.1 安装对应字体5.2 修改对应代码系统&#xff1a;Win10 Java&#xff1a;1.8.0_333 IDEA&#xff1a;2020.3.4 Gitee&#xff1a;https://gitee.com/lijinjiang01/Printe…

如何使用轮播图实现水平内容自动切换

通过轮播图实现一个水平内容自动切换 效果展示 前置准备 三张背景图片 具体步骤 添加一个轮播图组件 添加一个图片 添加一个标题 添加数据表 添加事件 添加触发器 绑定数据 步骤拆解 添加一个轮播图组件 1.1 拖拽 轮播图 到 编辑区 1.2 调整 轮播图 样式 添加一个图片 …

有关QT的问题大全

文章目录现在2022年&#xff0c;Qt发展如何&#xff1f;是就业的好选择吗&#xff1f;如何学习Qt,c到什么程度可以去学qt&#xff1f;现在 Qt 好找工作吗&#xff1f;为什么工业软件开发一般用的都是QT&#xff1f;初学QT怎么学?请问目前做windows桌面应用程序&#xff0c;MFC…

工作中Java Stream的简单应用

标题开发使用filter() and map()max()根据集合对象中的某个属性取最大值先解释一下各变量含义: temps集合是userids的子集(大前提) cache是temps集合在userids集合中的补集 简单来说就是,userids集合-temps集合cache补集,如下图所示目标:此次为工作中实际遇到的问题,需要得到c…

C++编译链接

文章目录C编译链接C编译模式分离式编译是个啥&#xff1f;怎么实现上述过程&#xff1f;定义与声明引出新的问题头文件有关头文件用来干啥&#xff1f;include头文件中应该写什么&#xff1f;#ifndef通过gcc/g命令来看完整的编译链接过程预处理(Preprocessing)编译(Compilation…