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); ...
随机推荐
- 新安装的Ubuntu设置root密码
一.问题描述 新安装的Ubuntu切换到root用户时如果没有设置root用户密码会操作失败.此时需要先设置root用户密码. 二.解决办法 打开终端执行 sudo passwd 命令. 输入设置的密 ...
- Torch,Tensorflow使用: Ubuntu14.04(x64)+ CUDA8.0 安装 Torch和Tensorflow
系统配置: Ubuntu14.04(x64) CUDA8.0 cudnn-8.0-linux-x64-v5.1.tgz(Tensorflow依赖) Anaconda 1. Torch安装 Torch是 ...
- 学习 TTreeView [1] - TTreeNodes、TTreeNode 与 Items、Items.Count、Items.Clear
填写 TTreeView 的内容一般是这样开始的(下图), 不过我觉得最好习惯用动态建立. 打个比方: 譬如 TreeView 是一个军营的"营部"! 这里会有营长.连长.排长.班 ...
- MyBatis分步查询的延迟加载
延迟加载的概念只存在于分步查询时: 延迟加载的本质是为第一步查询返回的Java Bean创建了一个代理对象: 延迟加载的全局设置有两个: lazyLoadingEnabled,作用为设置select语 ...
- Vue---从后台获取数据vue-resource的使用方法
作为前端人员,在开发过程中,我们大多数情况都需要从后台请求数据,那么在vue中怎样从后台获取数据呢?接下来,我简单介绍一下vue-resource的使用方法,希望对大家有帮助. 一.下载vue-res ...
- "去QE化"的思考
最近测试圈子里流传一篇有关去QE(Quality Engineer)的文章,此文如平地惊雷,突然在圈子里炸开了锅.文中所述使很多同行有点人人自危,担心行业未来和自身发展前程,而后不久就有大神写出“去Q ...
- JDK7新特性try-with-resources语句
try-with-resources语句是一种声明了一种或多种资源的try语句.资源是指在程序用完了之后必须要关闭的对象.try-with-resources语句保证了每个声明了的资源在语句结束的时候 ...
- 【bzoj3172】 Tjoi2013—单词
http://www.lydsy.com/JudgeOnline/problem.php?id=3172 (题目链接) 题意 $n$个单词组成文本,问每个单词在文本中出现了几次. Solution 题 ...
- 新年的展望,2018 hello world~
虽然离$2017$到$2018$的跨年已经过去很久了,但还是想写点东西试图拯救一下最近有些颓势的自己~ $2017$对我来说是意义重大的一年,这一年里,我有欢笑也有泪水,有收获也有挫折,有坚强也有脆弱 ...
- 【CF706D】Vasiliy's Multiset Trie+贪心
题目大意:需要维护一种数据结构,支持以下三种操作:插入一个数,删除一个数,查询该数据结构中的数异或给定数的最大值. 题解:如果没有删除操作就是一个标准的 Trie 上贪心求最大异或和问题.现在需要支持 ...