学习jQuery库,尝试封装jQuery的部分功能函数

前一阵子在学习jQuery库,就自己封转一下jQuery库中的一些常用方法。

首先,是先开始封装选择器模块的,也就是通过传入选择器,可以获取到对应的dom元素。

 1 (function (window){   //在自执行函数中window一变量形式传入可以剪短变量的作用域访问
//这是通过id名,类名,以及标签名获取元素的封装函数,其中context是表示上下文对象
2 var select=(function (){ 3 function getId(idName){ 4 return document.getElementById(idName); 5 }; 6 7 function getClasses(className,context){ 8 context = context || document; 9 if(document.getElementsByClassName){ 10 return context.getElementsByClassName(className); 11 }else{ 12 vsr result = []; 13 var allTags = context.getElementsByTagName("*"); 14 for(var i=0;i<allTags.length;i++){ 15 var tag = allTags[i]; 16 var tagClassName = tag.className; 17 var tagClassNameChange = " " +tagClassName +" "; 18 var classNameChange = " " +className + " "; 19 if(tagClassNameChange.indexOf(classNameChange)>=0){ 20 result.push(tag); 21 } 22 }

23                  return result;
24             };
              function getTags(tagName,context){
                 context =context || document;
                 return context.getElementsByTagName(tagName);
              };
25  } 26  })() 27 })(window)

 继续往模块中添加选择器方法。这部分的方法也应该是在以上模块中的:

  1    //希望查找指定范围内的元素:DOM元素下面的;DOM数组下面;选择器下面的
  2     /**
  3      * 查找指定范围下面的指定元素
  4      * @param selector id选择器:#开头 类选择器:.开头,其他情况:标签选择器
  5      * @param context DOM元素、DOM数组、字符串(选择器)
  6      */
  7     function get(selector,context){
  8         var result=[];
  9 
 10         if(!context){//context没有值
 11             context=[document];
 12         }else if(context.nodeType){//context的值是一个dom元素
 13             context=[context];
 14         }else if(typeof context ==="string"){
 15             context=get(context);
 16         }
 17 
 18         //context参数已经被处理过了,处理之后context就变成了一个DOM数组或者是DOM伪数组
 19         for (var i = 0; i < context.length; i++) {
 20             //singlecontext表示每一个DOM元素
 21             var singlecontext = context[i];
 22 
 23             var reg=/^(?:#(\w+)|[.](\w+)|(\w+))$/;
 24             var regResult=reg.exec(selector);
 25             var tempResult;
 26             if(tempResult=regResult[1]){
 27                 var idResult=getId(tempResult);
 28                 if(idResult){
 29                     result.push(idResult);
 30                 }
 31             }else if(tempResult=regResult[2]){
 32                 result.push.apply(result,getClasses(tempResult,singlecontext));
 33             }else if(tempResult=regResult[3]){
 34                 result.push.apply(result,getTags(tempResult,singlecontext));
 35             }
 36         }
 37 
 38 
 39 
 40         return result;
 41     }
 42 
 43     /**
 44      * 分组选择器
 45      * @param selector "div,p,input" "#content,p,.header"
 46      * @param context查询指定范围内的元素
 47      */
 48     function group(selector,context){
 49         var result=[];
 50         //1、分割selector将它变成字符串数组
 51         var groups=selector.split(",");
 52         //2、遍历字符串数组,将每一个元素传到get函数中获取结果
 53         for (var i = 0; i < groups.length; i++) {
 54             var singleGroup = groups[i];//singleGroup就是单个选择器
 55             var singleResult=get(singleGroup,context);
 56             //3、将多个结果合并返回给用户——>将每一次的结果添加到result中
 57             result.push.apply(result,singleResult);
 58 
 59             //也可以使用:result=result.concat(singleResult);
 60         }
 61         return result;
 62     }
 63 
 64 
 65     /**
 66      * 后代选择器 get("input","div")——>level("div input")
 67      * @param selector "div input","#content span"
 68      * @param context 查询条件:查询指定范围内的元素
 69      */
 70     function level(selector,context){
 71         //1、将字符串分割成字符串数组
 72         var levels=selector.replace(/\s+/g," ").split(" ");
 73         //2、遍历字符串数组,将每一个元素传入get函数
 74         for (var i = 0; i < levels.length; i++) {
 75             var singleLevel = levels[i];//单个选择器
 76             context=get(singleLevel,context);
 77         }
 78         //3、将这一次的get函数的查询结果作为下一次执行get函数的查询条件
 79         //      a、第一次get函数——>get("div")——>获取到页面中所有的div标签
 80         //      b、第二个get函数——>get("input",get("div"))——>获取div下面的input标签
 81         return context;
 82     }
 83 
 84     /**
 85      * 分组和后代选择器(大而全)
 86      * @context selector "div span,p input"
 87      */
 88     function groupAndLevel(selector,context){
 89         //错误的理解:先后代再分组——>["div","span,p","input"]
 90         //正确的理解:先分组再后代——>["div span","p input"]
 91         var result=[];
 92         //判断selector是否是一个字符串,如果不是,直接返回结果
 93         if(typeof selector !=="string") return result;
 94 
 95         //1、将字符串按照逗号分隔成多组
 96         var groups=selector.split(",");
 97         //2、对每一组元素调用level获取到每一组的结果
 98         for (var i = 0; i < groups.length; i++) {
 99             var singleGroup = groups[i];//singleGroup就是一个后代选择器
100             var singleResult=level(singleGroup,context);
101             result=result.concat(singleResult);
102         }
103         //3、将每一组的元素进行合并返回
104         return result;
105     }
106 
107     //通过给自执行函数添加返回值,暴露一个大而全的方法
108     return groupAndLevel;

 

posted @ 2016-11-10 20:48  amaya.梅  阅读(305)  评论(0编辑  收藏  举报