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); ...
随机推荐
- 学习Java并发的课程
https://www.javaspecialists.eu/courses/concurrency.jsp http://www.jconcurrent.com/ javaConcurrentAni ...
- [转帖]SAP MES生产执行系统解决方案
一.SAP MES概述: SAP公司成立于1972年,总部位于德国,是全球最大的企业管理和协同化商务解决方案供应商.全球第三大独立软件供应商.目前,在全球有120多个国家的超过86,000多家用户正在 ...
- 常用的sublime text 3插件(很爽哦)
个人比较懒,平时喜欢用webstorm,但是因为webstorm打开实在太慢了,并且太看设备,所以本人编辑简单的文件依然会选择使用sublime,虽然网上有很多关于此类插件的分享了,但是感觉都是片段, ...
- IDEA中在目录中如何快速指定到当前的类
类似于myeclipse的 Link with Editor 其实也在IDEA的这个位置,跟狙击镜的图标一样,叫做Scroll from Source 不同的的是,IDEA的这个功能,需要手动点击,才 ...
- 【刷题】洛谷 P4320 道路相遇
题目描述 在 H 国的小 w 决定到从城市 \(u\) 到城市 \(v\) 旅行,但是此时小 c 由于各种原因不在城市 \(u\),但是小 c 决定到在中途与小 w 相遇 由于 H 国道路的原因,小 ...
- 【刷题】BZOJ 4000 [TJOI2015]棋盘
Description Input 输入数据的第一行为两个整数N,M表示棋盘大小.第二行为两个整数P,K, 表示攻击范围模板的大小,以及棋子在模板中的位置.接下来三行, 每行P个数,表示攻击范围的模版 ...
- 【bzoj3529】 Sdoi2014—数表
μhttp://www.lydsy.com/JudgeOnline/problem.php?id=3529 (题目链接) 题意 多组询问,每次给出${n,m,a}$.求$${\sum_{i=1}^n\ ...
- ubuntu下sublime Text3配置C++编译环境
今天在Ubuntu下用sublime Text3编译C++代码,环境配的不太顺利,下边展示一个实例. 1.主函数main.cpp #include <iostream> #include ...
- Eclipse Neon安装指导
[下载] 前往Eclipse官网:http://www.eclipse.org/,点击DOWNLOAD: 进入下载页面后,会显示如下下载界面: 找到 Get Eclipse Neon,然后点击下面的” ...
- Python 内置变量
Python 隐藏变量 __doc__ # 表示本文件的注释__file__ # 表示本文件的路径 __package__ # 导入的py文件所在的文件夹路径__cached__ # 导入文件的缓存_ ...