jquery模型(外壳实现)
详细解释:
1、现在传入的参数是window,document,可以知道是它俩引用
2、

3、

4、每次调用jquery方法,都会创建一个实例,但是内存并没有暴涨,原因是:jquery里面new 的这个实例,是一个局部变量,局部变量在没有被全局引用的情况下,会被浏览器
自动回收

/*
传入参数:
1、标示度,一眼能够知道在那引用
2、加快查找速度(JS是往上冒泡查找的,所以传入会更快)
3、undefined(当方法参数没有传入的时候,那么他就是未定义的) */
(function(win,doc){//毕包
//这里面声明的变量/方法都是局部的,如果全局需要引用,那么需要注册全局 //无new构造 //局部变量在没有引用的时候会被浏览器自动回收 var myjquery = function(_this){
return new Base(_this);//每次执行都得到一个实例,说明Base里面的不会相互影响
} function Base(_this){ this.elements = [];//存放/保存获取的DOM元素
//因为每个对象操作的是已知的DOM元素所以每次返回只需要this(Base)本身即可
if(_this != undefined){
this.elements[] = _this;//
}
}
/*
//获取ID
Base.prototype.getId = function(id){//ID是唯一的,不需要管理,可以直接获取
this.elements.push(document.getElementById(id));
return this;
} //Tag标签和class是可以获取多个的,所以需要特殊对待,就需要for循环逐个处理获取
//获取标签(Tag)
Base.prototype.getTagName = function(tag){
var tags = document.getElementsByTagName(tag);
for(var i = 0;i < tags.length;i++){
this.elements.push(tags[i]);
}
return this;
} Base.prototype.getClass = function(){ } */
//解耦
Base.prototype = {//括号里面都是以对象(名字:对象)的形式书写
//获取ID
getId:function(id){//ID是唯一的,不需要管理,可以直接获取
this.elements.push(doc.getElementById(id));
return this;
},
//Tag标签和class是可以获取多个的,所以需要特殊对待,就需要for循环逐个处理获取
//获取标签(Tag)
getTagName:function(tag){//仅仅只是一个开始
var tags = doc.getElementsByTagName(tag);
for(var i = ;i < tags.length;i++){
this.elements.push(tags[i]);
}
return this;
},
//获取class
//和Tag一样,需要逐个获取
getClass:function(className,idName){
//ID:document.getElmenentById();
//class:document.getElementsByClassName();//不兼容
var node = null;
if(arguments.length == ){
node = doc.getElementById(idName);
}else{
node = doc;
} var all = node.getElementsByTagName("*");
for(var i = ;i < all.length;i++){
//需要判断是否存在class,而不是等于
//这里暂时直接等于,但不是包含(绝对不能写包含)
if(all[i].className == className){
this.elements.push(all[i]);
}
}
return this; },
//增加class
//给获取的元素增加class
addClass:function(className){//$(".box .title")
for(var i = ;i < this.elements.length;i++){
//匹配每个元素是否有传入的class名字,IndexOf
//作业:如何实现给增加的class避免重复(注意完美实现)
if(this.elements[i].className == className){//解决可能元素不存在
continue;
}
this.elements[i].className += " "+ className; }
return this;
},
//indexOf和replace不可取
removeClass:function(className){
for(var i = ;i < this.elements.length;i++){
if(this.hasClass(this.elements[i],className)){
var currEle = this.elements[i];
//移除准确需要的位置,而不是直接replace
currEle.className = currEle.className.replace(
new RegExp('(\\s|^)' + className + '(\\s|$)'),"");
}
}
return this;
},
//判断元素是否存在className
hasClass:function(element,className){
//正则匹配:true/false
return element.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)'));
},
//选择
eq:function(num){//只选择一个
var element = this.elements[num];//拿到选择的那个元素
this.elements = [];//清空之前获取的元素
this.elements[] = element;//把选择的那个元素存储到this.elements
return this;
},
click:function(fn){
for(var i = ;i < this.elements.length;i++){
this.elements[i].onclick = fn;
}
return this;
},
hide:function(){
for(var i = ;i < this.elements.length;i++){
this.elements[i].style.display = "none";
}
return this;
},
show:function(){//
for(var i = ;i < this.elements.length;i++){
this.elements[i].style.display = "block";
}
return this;
},
/*
不传入参数则表示获取
传入参数则表示设置/覆盖
*/
html:function(str){
for(var i = ;i < this.elements.length;i++){
if(arguments.length == ){//判断传入参数没有,0个
return this.elements[i].innerHTML;
}
this.elements[i].innerHTML = str;
}
return this; },
tt:function () {
return this
} } win.myjquery = win.$ = myjquery;//只是一个方法 })(window,document);//传入一些常用的变量/对象
jquery模型(外壳实现)的更多相关文章
- jquery源码分析
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 前段时间上班无聊之时,研究了 ...
- jQuery插件编写及链式编程模型小结
JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQu ...
- jQuery的事件模型
前几天自己着重读了jQuery1.11.1的源码,又结合了之前对DE事件模型的分析,最后也实现一个简陋的事件模型. jQuery的事件系统离不开jQuery的缓存系统. jQuery的第一代缓存是直接 ...
- jQuery CSS操作及jQuery的盒子模型
jQuery CSS-jQuery CSS方法 jQuery CSS-jQuery盒子模型
- jQuery插件编写及链式编程模型
jQuery插件编写及链式编程模型小结 JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我 ...
- jQuery (01) 浏览器的事件模型
浏览器的事件模型 由网景公司引入的 DOM0 级事件模型 把事件处理程序绑定到 DOM 元素的属性上: ele.onclick(); ele.onDOMContentLoad(); ele.onloa ...
- jQuery源码解析对象实例化与jQuery原型及整体构建模型分析(一)
//源码剖析都基于jQuery-2.0.3版本,主要考虑到兼容IE 一.关于jQuery对象实例化的逻辑: 整个jQuery程序被包裹在一个匿名自执行行数内: (function(window,und ...
- 第一百六十七节,jQuery,DOM 节点操作,DOM 节点模型操作
jQuery,DOM 节点操作,DOM 节点模型操作 学习要点: 1.创建节点 2.插入节点 3.包裹节点 4.节点操作 DOM 中有一个非常重要的功能,就是节点模型,也就是 DOM 中的“M”.页面 ...
- JQuery日记6.7 Javascript异步模型(二)
异步模型看起来非常美,但事实上它也是有天生缺陷的.看以下代码 try { setTimeout( function(){ throw new Error( '你抓不到我的!' ); }, 100); ...
随机推荐
- sql server获取当前月的天数
方法1 SELECT 32-DAY(getdate()+32-DAY(getdate())) 方法2 CREATE FUNCTION dbo.fn_getMonthDayAll ---自定义函数名称 ...
- Jira 添加自定义字段
打开添加自定义字段,并选择字段类型 填写名称,并创建 3.选择关联的界面,并更新
- JIRA部署破解和confluence整合
JIRA是一个项目跟踪管理工具,帮助团队创建计划任务.构建并发布优秀的产品.全球成千上万的团队选择JIRA,用JIRA来捕获.组织管理缺陷.分配任务,跟踪团队的活动.不论在桌面PC还是移动终端设备上, ...
- Vue实现对数组、对象的深拷贝、复制
当组件间传递对象时,由于此对象的引用类型指向的都是一个地址(除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝),如下 数组: ,,]; var b = a; b.p ...
- Codeforces 494C - Helping People
题意 有一个长度为 \(n\) 的数列 \(a\),有 \(m\) 个 操作,每个操作是给 \(a[l_i,r_i]\) 中的数都加一,一个操作有 \(p_i\) 的概率执行(否则不执行).一个性质是 ...
- Codeforces Round #485 Div. 1 vp记
A:对每种商品多源bfs一下每个点到该商品的最近距离,对每个点sort一下取前s个即可. #include<iostream> #include<cstdio> #includ ...
- 手速太慢QAQ
显然D是个细节题,但是还剩1h时看眼榜还没人过EF,只好冷静写D,大概思路是任何时候如果min(n,m)<=2,max(n,m)<=4暴搜,否则直接贪心是很对的,即第一步让S.T长度平均化 ...
- java实现超大整数加减乘除四则运算
原理: 用数组存储数字,按照计算法则进行运算. 代码: package com.hdwang; import java.util.regex.Matcher; import java.util.reg ...
- AsynchronousFileChannel 使用的默认线程池的疑问
AIO服务在线上测试有一周时间了吧,现在发现一个问题,通过“任务管理器”查看aio服务的进程可以看出该进程的当前线程数经过几天的运行,在不断的增加: 1. 刚刚启动的时候,线程数在16个左右 2. 经 ...
- 简单的sql分组统计
一个记录员工打卡时间的表,只有两个有效字段 员工名称,打卡时间,现在要统计某一天中,每个员工的打卡次数.最早打卡时间.最晚打卡时间,问sql怎么写? 其实这个sql很简单, 1.首先要明确既然是按每个 ...