类jq选择器扩展.

这几天一有空就在折腾类jq选择器,昨天晚上自己实现了选择器的大致雏形。今天接着折腾给这个简陋的选择器增添新的方法。

我们平时用jq选择器,不只能够用$(str)方法获取元素,也支持$(dom对象集合);

为了造的更像我们常用的这个轮子,接着对昨天晚上做的选择器又进行了一点扩展。

以下是昨天坐的选择器雏形,

利用getEle(str)方法便可获取dom元素集合.

function getByClass(oParent,sClass){

            if(oParent.getElementsByClassName){
                return oParent.getElementsByClassName(sClass);
            }

            var result = [];
            var re = new RegExp("\\b"+sClass+"\\b");

            var aEle = oParent.getElementsByTagName("*");

            for(var i = 0; i < aEle.length; i++){
                if( re.test(aEle[i].className) ){
                    result.push(aEle[i]);
                }
            }
            return result;
        }

        function getByStr(aParent,str){
            var aChild = [];

            //选择元素
            //str  #id  .class  tagname
            for(var i = 0; i < aParent.length; i++){
                switch(str.charAt(0)){
                    case "#":// id
                        var obj = document.getElementById(str.substring(1));
                        aChild.push(obj);
                        break;
                    case ".":// 类
                        var aEle = getByClass(aParent[i],str.substring(1));
                        //aChild = aChild.concat(aEle);
                        for(var j = 0; j < aEle.length; j++){
                            aChild.push(aEle[j]);
                        }
                        break;
                    default://标签

                        //tagname#id
                        if(/^[a-z0-9]+#[a-z0-9\-_$]+$/i.test(str)){
                            //[tagname,id]
                            var arr = str.split("#");
                            var aEle = aParent[i].getElementsByTagName(arr[0]);
                            for(var j = 0; j < aEle.length; j++){
                                if(aEle[j].id == arr[1]){
                                    aChild.push(aEle[j]);
                                }
                            }
                        //li.box
                        } else if(/[a-z0-9]+\.[a-z0-9\-_$]+$/i.test(str)){
                             // [tagname,class]
                             var arr = str.split(".");
                             var aEle = aParent[i].getElementsByTagName(arr[0]);
                            for(var j = 0; j < aEle.length; j++){
                                if(aEle[j].className == arr[1]){
                                    aChild.push(aEle[j]);
                                }
                            }
                        //input[type=button]
                        } else if(/\w+\[\w+=\w+\]/.test(str)){

                            //arr [input,type,button,]
                            var arr = str.split(/\[|=|\]/);
                            var aEle = aParent[i].getElementsByTagName(arr[0]);
                            for(var j = 0; j < aEle.length; j++){

                                if(aEle[j].getAttribute(arr[1])  == arr[2]){
                                    aChild.push(aEle[j]);
                                }
                            }
                            //li:first  li:eq(index)
                        } else if(/\w+:\w+(\(\.\))?/.test(str)){

                            /*[li,eq,index,]
                              arr[0]  tagname
                              arr[1]  first/eq/gt/lt/odd/even
                              arr[2]  内容
                            */
                            var arr = str.split(/:|\(|\)/);
                            var aEle = aParent[i].getElementsByTagName(arr[0]);
                            switch(arr[1]){
                                case "first":
                                    aChild.push(aEle[0]);
                                    break;
                                case "last":
                                   aChild.push(aEle[aEle.length - 1]);
                                    break;
                                case "eq":
                                    aChild.push(aEle[arr[2]]);
                                    break;
                                case "gt"://大于
                                    for(var j = parseInt(arr[2]) + 1; j < aEle.length; j++){
                                        aChild.push(aEle[j]);

                                    }

                                break;
                                case "lt"://小于
                                    for(var j = 0; j < parseInt(arr[2]); j++){
                                        aChild.push(aEle[j]);

                                    }
                                    break;
                                case "odd":
                                    for(var j = 0; j < aEle.length; j++){
                                        if(j%2 == 1){
                                            aChild.push(aEle[j]);
                                        }
                                    }
                                break;
                                case "even":
                                    for(var j = 0; j < aEle.length; j+=2){
                                        aChild.push(aEle[j]);
                                    }
                                break;
                            }

                        }else {//纯标签
                            var aEle = aParent[i].getElementsByTagName(str);
                            //aChild = aChild.concat(aEle);
                            for(var j = 0; j < aEle.length; j++){
                                aChild.push(aEle[j]);
                            }
                        }
                }

            }
            return aChild;
        }

        //获取元素
        function getEle(str){
            // 切
            var arr = str.replace(/^\s+|\s+$/g,"").replace(/\s+/g," ").split(" ");
            var aParent = [document];
            var aChild  = [];

            //循环获取元素
            for(var i = 0; i < arr.length; i++){

                aChild = getByStr(aParent,arr[i]);

                //核心: 上一次子级 是下一次父级
                aParent = aChild;
            }

            return aChild;
        }

接着对以上方法进行扩展。

function Query(args){
  this.eles = [];
  switch (typeof args){
         case ‘string‘:
             if(args.indexOf(‘<‘)==-1){
                    this.eles = getEle(args)
             }
             break;
         case ‘object‘:
              if(‘length‘ in args){
                     for(var i =0;i<args.length;i++){
                               this.eles.push(args[i]);
                     }
              }else{
                     this.eles.push(args);
              }
              break;
   }    //return this.eles   我们也可就此打住  直接返回出获取的dom对象集合;这里为了继续进行扩展这一步我就不返回了。
}

Query(‘div a .abc‘).eles;//便可获取对象了
Query(dom).eles;//也可获取dom对象
时间: 2024-08-06 16:05:44

类jq选择器扩展.的相关文章

Jquery 第一课(jq选择器:id、类、标签、奇偶、eq、nth-child、子元素、属性、包含、位置、过滤)

一.什么是jQuery? jQuery是一款比较优秀的js框架.是将js中比较常用的方法封装底层.口号是"write less,do more". 二.如何使用jQuery呢?(使用jQuery的整体思路) 1.页面加载完之后 2.找到对象 3.执行你要的事件 4.声明一个事件(function()) 5.完成事件里面的内容 三.第一个jQuery程序 注意小点:1.引入jQuery文件的时候,把jQuery的文件放js文件之前(页面由上而下执行). 2.$的作用 一个是页面加载 还有

第十课 课程重点(jq选择器:id、类、标签、奇偶、eq、nth-child、子元素、属性、包含、位置、过滤)

1.在VS中新建jq项目: 新建web窗体时选择第二个: 将系统生成的多余文件夹删掉,仅留下Scripts和Web.config: 将Scripts文件夹改名为我们熟悉的js(也可以不改,仅推荐改),并新建文件夹css和image,并在对应位置添加页面,html.css.js 将上图鼠标所指的.min.js文件拖动到html中,将自己新建的js文件拖动到它下方,如图: *两者上下位置关系千万别弄饭了,min.js一定要在最上面. 将Script文件夹中的第一个js文件(_references.j

2015.7.20 第十课 课程重点(jq选择器:id、类、标签、特殊、属性、包含、位置、过滤)

1.在VS中新建jq项目: 新建web窗体时选择第二个: 将系统生成的多余文件夹删掉,仅留下Scripts和Web.config: 将Scripts文件夹改名为我们熟悉的js(也可以不改,仅推荐改),并新建文件夹css和image,并在对应位置添加页面,html.css.js 将上图鼠标所指的.min.js文件拖动到html中,将自己新建的js文件拖动到它下方,如图: *两者上下位置关系千万别弄饭了,min.js一定要在最上面. 将Script文件夹中的第一个js文件(_references.j

JQ选择器...

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JQ选择器</title> <style type="text/css"> .focused{ background:#abcdef; } </style> </head> <body> &

JQ 选择器篇1

基本选择器  1)id # 选择器 找到 id 相对应的元素 eg: $(“#container”)  找到id 为container的元素的集合 2). class  类选择器 找到 class 包含 此类的元素 eg $(“.content”)  找到只要class里面包含content类的的元素的集合 3)元素选择器 顾名思义可以找到 相对应的元素 eg:$(“img”)  找到所有的img 元素 4) * 选择器 (任意元素选择器 ) 可以找到任意元素 eg: $(“*”) 找到的是整个

jq选择器汇总

1 $("div") //标签 2 $(".box") //类 3 $("#box") //ID 4 $("a[href][name]") //多个属性 5 $("a[name]") //选取带有name的a 6 $("a[name='aaa']") //选取带有name并且值为aaa的a 7 $("a[name~=aaa]") //选取属性值中包含aaa的a 8 $

基于内置类的原型扩展方法

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>基于内置类的原型扩展方法</title></head><body><script type="text/javascript"> var ary = [12, 23, 34, 12, 23, 34, 12, 23, 34, 12, 23, 34,

类目 (category),扩展(Extension)和协议(protocol) (转)

@类目-分类(category) 1.类目: 类目(也成类别:Category)是一种为现有类添加新方法的方式2.类目的局限性:1)类目无法向已有的类中添加实例变量: 2)如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,发生这种情况,则已有类的原始方法永无天日,最好的办法是将自己扩展的方法和原始方法区分开来. 3.类目的作用:?       将类的实现分散到多个不同的文件中–      将多个类目的声明放入同一个.h文件中–      将实现放入多个.m方法中?       使

BFKit:对常用 UIButton,UIColor,UIDevice,UIFont ,UIImage 等开发类进行了扩展

BFKit对常用于开发的类进行了扩展,整合了多个常用的控件和开发所需要的功能,是一个通用性的类库.集成后可以帮助更快的App开发.有兴趣的同学可以看看哦. http://code4app.com/ios/BFKit/549d08b4933bf087328bb02e