封装原理

这里参考的jquery来进行封装的一个常用方法的一个库,可作为自己的一个库

原理:创建一个构造函数,将所有方法放在该构造函数原型里,访问$()方法时,返回这个构造函数的实例化,这样就简单的实现了jquery的用法

function VQuery(vArg)
{
//用来保存选中的元素
this.elements=[]; switch(typeof vArg)
{
case 'function':
//window.onload=vArg;
myAddEvent(window, 'load', vArg);
break;
case 'string':
switch(vArg.charAt(0))
{
case '#': //ID
var obj=document.getElementById(vArg.substring(1)); this.elements.push(obj);
break;
case '.': //class
this.elements=getByClass(document, vArg.substring(1));
break;
default: //tagName
this.elements=document.getElementsByTagName(vArg);
}
break;
case 'object':
this.elements.push(vArg);
}
} VQuery.prototype.click=function (fn)
{
var i=0; for(i=0;i<this.elements.length;i++)
{
myAddEvent(this.elements[i], 'click', fn);
}
}; VQuery.prototype.show=function ()
{
var i=0; for(i=0;i<this.elements.length;i++)
{
this.elements[i].style.display='block';
}
}; VQuery.prototype.hide=function ()
{
var i=0; for(i=0;i<this.elements.length;i++)
{
this.elements[i].style.display='none';
}
}; VQuery.prototype.hover=function (fnOver, fnOut)
{
var i=0; for(i=0;i<this.elements.length;i++)
{
myAddEvent(this.elements[i], 'mouseover', fnOver);
myAddEvent(this.elements[i], 'mouseout', fnOut);
}
}; VQuery.prototype.css=function (attr, value)
{
if(arguments.length==2) //设置样式
{
var i=0; for(i=0;i<this.elements.length;i++)
{
this.elements[i].style[attr]=value;
}
}
else //获取样式
{
//return this.elements[0].style[attr];
return getStyle(this.elements[0], attr);
}
}; VQuery.prototype.attr=function (attr, value)
{
if(arguments.length==2)
{
var i=0; for(i=0;i<this.elements.length;i++)
{
this.elements[i][attr]=value;
}
}
else
{
return this.elements[0][attr];
}
}; VQuery.prototype.toggle=function ()
{
var i=0;
var _arguments=arguments; for(i=0;i<this.elements.length;i++)
{
addToggle(this.elements[i]);
} function addToggle(obj)
{
var count=0;
myAddEvent(obj, 'click', function (){
_arguments[count++%_arguments.length].call(obj);
});
}
}; VQuery.prototype.eq=function (n)
{
return $(this.elements[n]);
}; function appendArr(arr1, arr2)
{
var i=0; for(i=0;i<arr2.length;i++)
{
arr1.push(arr2[i]);
}
} VQuery.prototype.find=function (str)
{
var i=0;
var aResult=[]; for(i=0;i<this.elements.length;i++)
{
switch(str.charAt(0))
{
case '.': //class
var aEle=getByClass(this.elements[i], str.substring(1)); aResult=aResult.concat(aEle);
break;
default: //标签
var aEle=this.elements[i].getElementsByTagName(str); //aResult=aResult.concat(aEle);
appendArr(aResult, aEle);
}
} var newVquery=$(); newVquery.elements=aResult; return newVquery;
}; function getIndex(obj)
{
var aBrother=obj.parentNode.children;
var i=0; for(i=0;i<aBrother.length;i++)
{
if(aBrother[i]==obj)
{
return i;
}
}
} VQuery.prototype.index=function ()
{
return getIndex(this.elements[0]);
}; function $(vArg)
{
return new VQuery(vArg);
} function myAddEvent(obj, sEv, fn)
{
if(obj.attachEvent)
{
obj.attachEvent('on'+sEv, function (){
fn.call(obj);
});
}
else
{
obj.addEventListener(sEv, fn, false);
}
} function getByClass(oParent, sClass)
{
var aEle=oParent.getElementsByTagName('*');
var aResult=[];
var i=0; for(i=0;i<aEle.length;i++)
{
if(aEle[i].className==sClass)
{
aResult.push(aEle[i]);
}
} return aResult;
} function getStyle(obj, attr)
{
if(obj.currentStyle)
{
return obj.currentStyle[attr];
}
else
{
return getComputedStyle(obj, false)[attr];
}
}

Jquery源码探索的更多相关文章

  1. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  2. jQuery源码学习感想

    还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...

  3. Jquery源码学习(第一天)

    jQuery是面向对象的设计通过window.$ = window.jQuery = $; 向外提供接口,将$挂在window下,外部就可以使用$和jQuery $("#div1" ...

  4. jQuery源码 Ajax模块分析

    写在前面: 先讲讲ajax中的相关函数,然后结合函数功能来具体分析源代码. 相关函数: >>ajax全局事件处理程序 .ajaxStart(handler) 注册一个ajaxStart事件 ...

  5. jQuery源码:从原理到实战

    jQuery源码:从原理到实战 jQuery选择器对象 $(".my-class"); document.querySelectorAll*".my-class" ...

  6. 【菜鸟学习jquery源码】数据缓存与data()

    前言 最近比较烦,深圳的工作还没着落,论文不想弄,烦.....今天看了下jquery的数据缓存的代码,参考着Aaron的源码分析,自己有点理解了,和大家分享下.以后也打算把自己的jquery的学习心得 ...

  7. 从jquery源码中看类型判断和数组的一些操作

    在深入看jquery源码中,大家会发现源码写的相当巧妙.那我今天也通过几个源码中用到的技巧来抛砖引玉,希望大家能共同研究源码之精华,不要囫囵吞枣. 1.将类数组转化成数组 我想大家首先想到的方法是fo ...

  8. 读艾伦的jQuery的无new构建,疑惑分析——jquery源码学习一

    背景: 有心学习jquery源码,苦于自己水平有限,若自己研究,耗时耗力,且读懂之日无期. 所以,网上寻找高手的源码分析.再经过自己思考,整理,验证.以求有所收获. 此篇为读高手艾伦<jQuer ...

  9. JQuery源码解析(一)

    写在前面:本<JQuery源码解析>系列是基于一些前辈们的文章进行进一步的分析.细化.修改而写出来的,在这边感谢那些慷慨提供科普文档的技术大拿们. 要查阅JQ的源文件请下载开发版的JQ.j ...

随机推荐

  1. SpringBoot整合Graylog3.0

    Graylog简介 Graylog是一个开源的完整的日志管理工具,功能和ELK类似,安装部署更方便. 官方网站 https://www.graylog.org 搭建 使用docker快速搭建 参考 h ...

  2. js时间戳如何转时间

    js时间戳如何转时间 一.总结 一句话总结:Date对象分别获取年now.getFullYear()月now.getMonth()+1日now.getDate()即可 Date对象分别获取年now.g ...

  3. php如何控制客户端生成缓存

    php如何控制客户端生成缓存 一.总结 一句话总结:用http消息响应头中的Cache-Control来控制客户端缓存,说的是页面本身被客户端缓存,而不是重新生成的其它的非页面缓存 响应头Cache- ...

  4. (转+整理)Nandflash存储

    ----------------------------------------------------------------------文章1--------------------------- ...

  5. 非常好的一个CentOS 6.2 apache 2.4.2 编译教程

    除了以下2点,没有错的. 1)pcre-devel 需要安装 2)apr 和 apr-util 有了新的版本了 How to Install Apache 2.4.2 from Source on C ...

  6. java8新特性(二)_lambda表达式

    最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看<写给大忙人看的JavaSE8> ...

  7. Spring Boot之实现自动配置

    GITHUB地址:https://github.com/zhangboqing/springboot-learning 一.Spring Boot自动配置原理 自动配置功能是由@SpringBootA ...

  8. java,sort函数的深刻理解

    先来看看题目吧: 链接:https://www.nowcoder.com/questionTerminal/97b6a49a85944650b2e3d0660b91c324来源:牛客网 [编程题]德才 ...

  9. 0.11内核rd_load@ramdisk.c中memcpy函数好像有bug

    0.11内核rd_load@ramdisk.c中memcpy函数好像有bug,如:#define memcpy(dst,src,n) \    __asm__("cld;rep;movsl& ...

  10. vs2013添加mysql对EF的支持(转+说明)

    在vs2013中使用mysql连接entityFramework经常会遇到这个问题:您的项目引用了最新实体框架:但是,找不到数据连接所需的与版本兼容的实体框架数据提供程序.请退出此向导,安装兼容提供程 ...