JS封装简单后代选择器

大概思路是这样的:通过判断传过来的参数是什么类型,如果是对象,那这里就是this(因为封装是自己用的,肯定不会随便乱传一个对象过来),如果是一个函数(匿名函数),那就是Dom加载(这里先不讲),如果是字符串,那就是CSS选择器,通过判断是否存在空格,没有就是单一CSS选择器,有就是后代选择器。然后再通过判断是ID选择器,类选择器还是元素选择器来执行具体的操作:

这里创建一个构造函数实现基础库Jr :

function Jr(){

}

在其原型上添加方法:

//获取ID节点
Jr.prototype.getId = function(id){
    return document.getElementById(id);
}

//获取CLASS节点数组
Jr.prototype.getClass = function(className, parentNode){
    var node = null;   //存放父节点
    var temps = [];
    if(parentNode != undefined){ //存在父节点时
        node = parentNode;
    } else { //不存在则默认document
        node = document;
    }
    var all = node.getElementsByTagName(‘*‘);
    for(var i = 0; i < all.length; i++){
        //遍历所有节点,判断是否有包含className
        if((new RegExp(‘(\\s|^)‘ + className + ‘(\\s|$)‘)).test(all[i].className)){
            temps.push(all[i]);
        }
    }
    return temps;
}

//获取元素节点数组
Jr.prototype.getTagName = function(tag, parentNode){
    var node = null;   //存放父节点
     var temps = [];
    if(parentNode != undefined){
        node = parentNode;
    } else {
        node = document;
    }
    var tags = node.getElementsByTagName(tag);
    for(var i = 0; i < tags.length; i++){
        temps.push(tags[i]);
    }
    return temps;
}

接下来就是在构造函数里通过传参来进行一系列选择器操作:

//基础库
function Jr(args){
    //创建一个数组,用来保存获取的节点或节点数组
    this.elements = [];
    //当参数是一个字符串,说明是常规css选择器,不是this,或者function
    if(typeof args == ‘string‘){
        //css模拟,就是跟CSS后代选择器一样
        if(args.indexOf(‘ ‘) != -1){
            //把节点拆分开并保存在数组里
            var elements = args.split(‘ ‘);
            //存放临时节点对象的数组,解决被覆盖问题
            var childElements = [];
          var node = [];   //用来存放父节点用的
            for(var i = 0; i < elements.length; i++){
                //如果默认没有父节点,就指定document
                if(node.length == 0) node.push(document);
                switch(elements[i].charAt(0)) {
                    //id
                    case ‘#‘ :
                        //先清空临时节点数组
                            childElements = [];
                        childElements.push(this.getId(elements[i].substring(1)));
                        node = childElements;  //保存到父节点
                            break;
                    //类
                       case ‘.‘ :
                        childElements = [];
                        //遍历父节点数组,匹配符合className的所有节点
                            for(var j = 0; j < node.length; j++){
                            var temps = this.getClass(elements[i].substring(1), node[j]);
                            for(var k = 0; k < temps.length; k++){
                                childElements.push(temps[k]);
                            }
                        }
                        node = childElements;
                        break;
                    //标签
                       default :
                        childElements = [];
                        for(var j = 0; j < node.length; j++){
                            var temps = this.getTagName(elements[i], node[j]);
                            for(var k = 0; k < temps.length; k++){
                                childElements.push(temps[k]);
                            }
                        }
                        node = childElements;

                }
            }
            this.elements = childElements;
        } else {
            //find模拟,就是说只是单一的选择器
            switch(args.charAt(0)) {
                case ‘#‘:
                    this.elements.push(this.getId(args.substring(1)));
                    break;
                case ‘.‘:
                    this.elements = this.getClass(args.substring(1));
                    break;
                default :
                    this.elements = this.getTagName(args);
            }
        }
    } else if(typeof args == ‘Object‘){
        if(args != undefined){
            this.elements[0] = args;
        }
    } else if(typeof args == ‘function‘){
        //这里不讲
        this.ready(args);
    }
}

最后,我们调用该基础库:

//调用
var $ = function(args){
    return new Jr(args);
}

现在,我们就可以实现如下选择器等效果了:

$(this)
$(‘#box‘)
$(‘.box‘)
$(‘div‘)
$(‘#box div .nav‘)
$(‘.box .nav p‘)
时间: 2024-10-07 14:00:07

JS封装简单后代选择器的相关文章

关于js封装框架类库之选择器引擎(二)

在上篇介绍了选择器的获取标签.id.类名的方法,现在我们在上篇基础上继续升级 1.问题描述:上篇get('选择器')已经实现,如果get方法里是一个选择器的父元素,父元素是DOM对象,那么如何获取元素 思路:1.首先想到的是标签.id.类名的三个方法  2.假设是body节点,那么方法中的document改成body 3.传入的参数如何判断是否为DOM 注意:在获取id方法中全局也只有一个id,所以其中的doument无须修改 修改如下 // 注释: 对获取DOM对象方法的封装 var getT

jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jquery筛选方法

jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jquery筛选方法 一丶什么是JQuery JQuery: ???????JQuery是js的一个库,高度封装了js常用的功能,提供简便方法,调用简单,提高开发效率 ??????js库是包含了把复杂的功能封装到简单的方法中 JQuery的两大特性: ???????链式编程:可以.的形式实现多个功能 ?

第一百三十九节,JavaScript,封装库--CSS选择器

JavaScript,封装库--修改元素选择器 就是将构造库函数修改成元素选择器,像css那样,输入#xxx .xxx xxx  (获取指定id下的指定class下的指定标签元素) 修改后的基础库 /** *feng_zhuang_ku_1.0版本,js封装库,2016/12/29日:林贵秀 **/ /** 前台调用 * 每次调用$()创建库对象,使其每次调用都是独立的对象 * $()创建库对象,有一个可选参数,参数有两种方式,1是传入的this,2是传入的字符串 * 可选参数说明: * 传入的

用jQuery基于原生js封装的轮播

我发现轮播在很多网站里面都用到过,一个绚丽的轮播可以为网页增色不少,最近闲来无事,也用原生js封装了一个轮播,可能不像网上的插件那么炫,但是也有用心去做.主要用了闭包的思想.需要传递的参数有:图片地址的数组,图片宽度,上一页,下一页的id,图片列表即ul的id(这儿使用无序列表排列的图片),自动轮播间隔的时间.功能:实现了轮播的自动轮播,可以点击上一页,下一页进行切换. 下面是html中的代码,只需要把存放的容器写好,引入jquery即可: <!DOCTYPE html><html>

原生JS封装Ajax插件(同域&amp;&amp;jsonp跨域)

抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正确的地方,还望指正^_^ 一.Ajax核心,创建XHR对象 Ajax技术的核心是XMLHttpRequest对象(简称XHR),IE5是第一款引入XHR对象的浏览器,而IE5中的XHR对象是通过MSXML库中的一个ActiveX对象实现的,因此在IE中可能有3个版本,即MSXML2.XMLHttp.

CSS系列(8) CSS后代选择器和子选择器详解

一.CSS后代选择器详解 1,  生动介绍基本概念 一个标签嵌B在另一个标签A内部,B就是A的后代. 而且,B的后代也是A的后代,这就叫“子子孙孙无穷尽也”. 比如: <div> <p>这个p标签是div的后代</p> <div> 后代选择器就是用来选择一个标签的后代的: 两个选择器中间添加一个[空格]就构成了后代选择器,空格后面的那个是后代. 例如: div p { color : red; } 它会选择一堆的p标签,只要这个p标签是嵌套在某个div标签内

原生JS封装AJAX

今天我们来说说利用原生JS封装AJAX. jquery框架的AJAX方法确实很好用,但有时候我们写的页面需要引入多个JS插件,不一定哪个插件就会和jquery发生冲突,导致jquery用不了了.或者页面比较简单,不需要加重浏览器的负担,这时我们自己封装一个AJAX就是一个很好的办法. //将数据转换成 a=1&b=2格式;function json2url(json){   var arr = [];   //加随机数防止缓存;   json.t = Math.random();   for(v

小tip: CSS后代选择器可能的错误认识——张鑫旭

一.关于类选择器的一个问题 假设有下面一个面试题,CSS代码如下: .red { color: red; } .green { color: green; } HTML如下: <div class="red"><div class="green"><p>1. 颜色是?</p></div></div> <div class="green"><div class

JS封装出现耦合,怎么解决?(上)

公司在做一个较大的项目,我一般把一些自己写的公用的js插件封装起来. 之前我封装了一个 “数量选择器”,把它封装成一个仅有数量改变功能并能正则匹配正整数的一个纯粹的选择器,它可以通过new在一个页面添加多个. 插件内,我定义了onchange和onkeyup进行正则匹配. change: function(){ var self = this; this.numInput.onchange = function(){regNum(this)}; this.numInput.onkeyup = f