原生js实现jquery库中选择器的功能(jquery库封装一)

 今天是2017.1.1,新的一天,新的一年,新的一年里继续夯实基础知识,在工作中多些项目,多思考,多总结,前端是不断更新,在更新的过程中也是发现乐趣和挑战自我的过程,希望年轻的我和年轻的javascript在2017年中一同成长

 

今天又一次封装了一个盒jquery使用方法相同的库,每次写都有新的想法,我想着也是码农的乐趣之一吧,

今天代码只实现了jquery中部分常用选择器的功能,以后部分会继续更新其余部分,所有代码的注释已经写到行间的注释了,这仅仅是我自己的理解,不妥之处希望大家评论到下面,共同学习才是进步的最好方式

/*** Created by Jason on 2016/12/31.*/
//jquery 的构造函数
function Jquery(arg){//用来存选出来的元素this.elemenets=[];switch(typeof arg){case 'function' :domReady(arg);break;case 'string' :this.elements = getEle(arg);break;case 'object' :this.elements.push(arg);break;}
}
//DOM ready onload 如果参数是函数,则进行domReady操作
function domReady(fn){// FF chromeif(document.addEventListener){//jquery中已经省略false,false解决低版本火狐兼容性问题document.addEventListener('DOMContentLoaded',fn,false);}else{document.attachEvent('onreadystatechange',function(){if(document.readyState=='complete'){fn();}});}
}function getByClass(oParent,sClass){//高级浏览器支持getElementsByClassName直接使用if(oParent.getElementsByClassName){return oParent.getElementsByClassName(sClass);}else{//不支持需要选中所有标签的类名来选取var res=[];var aAll=oParent.getElementsByTagName('*');for(var i=0;i<aAll.length;i++){//选中标签的全部类名是个str='btn on red'=aAll[i].className   使用正则  reg=/\b sClass \b/gvar reg= new RegExp('\\b'+sClass+'\\b','g');if(reg.test(aAll[i].className)){res.push(aAll[i]);}}return res;}
}//如果参数是str 进行选择器的操作
function getByStr(aParent,str){//用来存放选中的元素的数组 这个数组在getEle存在,为了每次执行的时候都需要清空,所以使用局部函数的变量var aChild=[];//aParent开始是[document],再执行完getByStr的时候getEle将aParent指向了getByStr函数的返回值aChild数组以确保循环父级下面的所有匹配元素for(var i=0;i<aParent.length;i++){switch(str.charAt(0)){//id选择器  eg: #box  使用document.getElementById选取case '#':var obj=document.getElementById(str.substring(1));aChild.push(obj);break;//类选择器  eg: .box  使用上面封装的getByClass选取case '.'://由于一个标签可以有多个类选择器 所以需要进行循环选取var aRes=getByClass(aParent[i],str.substring(1));for(var j=0;j<aRes.length;j++){aChild.push(aRes[j]);}break;//今天先简单的编写选择器  这里我们假设除了id和类选择器,就是标签选择器default:// 如果是li.red  那么用正则来判断if(/\w+\.\w+/g.test(str)){//先选择标签,在选择类选择器  使用类选择器的时候重复选择器函数即可var aStr=str.split('.');var aRes=aParent[i].getElementsByTagName(aStr[0]);var reg=new RegExp('\\b'+aStr[1]+'\\b','g');//循环选取标签,注意外层已经有i的循环for(var j=0;j<aRes.length;j++){if(reg.test(aRes[j].className)){aChild.push(aRes[j]);}}//如果是li:eq(2) 或者 li:first这样的选择器   书写正则是的时候注意()可有可以无为? 有或者没有为* 至少有一个也就是若干个为+   {2,5}这种则为2-5个}else if(/\w+\:\w+(\(\d+\))?/g.test(str)){//讲str进行整理    [li,eq,2]  或者  [li,first]var aStr=str.split(/\:|\(|\)/);//aStr[2]是eq、lt、gt传入的参数,这里使用n来保存var n=aStr[2];//在父级下获取所有匹配aStr[0]项的标签var aRes=aParent[i].getElementsByTagName(aStr[0]);//这时候会循环判断aStr[1]项是的内容,jquery中经常使用的为eq、lt、gt、even、odd、first、lastswitch(aStr[1]){//如果是eq则把第n项传入aChild数组即可case 'eq':aChild.push(aRes[n]);break;//如果是lt需要将aRes数组中获取到的小于n的标签循环推入aChild中case 'lt':for(var j=0;j<n;j++){aChild.push(aRes[j]);}break;//如果是gt则和lt相反case 'gt':for(var j=n;j<aRes.legth;j++){aChild.push(aRes[j]);}break;//如果是event的话需要隔数添加,注意jquery中的event是从第0开始循环的case 'event':for(var j=0;j<aRes.length;j+=2){aChild.push(aRes[j]);}break;//如果是odd的和event不同的只是从第1项开始循环case 'odd':for(var j=1;j<aRes.length;j+=2){aChild.push(aRes[j]);}break;//如果是first,则将aRes[0]推入aChildcase 'first':aChild.push(aRes[0]);break;case 'last':aChild.push(aRes[aRes.length-1]);break;}//属性选择器  eg:input[type=button] 同样适用正则来判断}else if(/\w+\[\w+\=\w+\]/g.test(str)){//将属性选择器切成数组   [input,type,button]var aStr=str.split(/\[|\=|\]/g);var aRes=aParent[i].getElementsByTagName(aStr[0]);//在选中标签中选出有aRes[1]的属性for(var j=0;j<aRes.length;j++){//把属性值为aRes[2]的标签推入aChild中if(aRes[j].getAttribute(aStr[1])==aStr[2]){aChild.push(aRes[j]);}}//标签选择器  div、span}else{var aRes=aParent[i].getElementsByTagName(str);for(var j=0;j<aRes.length;j++){aChild.push(aRes[j]);}}break;}}return aChild;
}function getEle(str){//如果是字符串的话先要去除收尾空格  eg:"   on replace   index  play auto   "var arr = str.replace(/^\s+|\s+$/g,'').split(/\s+/g);var aChild = [];var aParent = [document];for(var i = 0;i<arr.length;i++){aChild = getByStr(aParent,arr[i]);aParent = aChild}return aChild;
}//实现jquery $符号的写法
function $(arg){return new Jquery(arg);
}

转载请注明。。

转载于:https://www.cnblogs.com/jasonwang2y60/p/6241399.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubantu下使用vi时,方向键变字母输出、退格键无法删除字符的解决办法

目录前言&#xff1a;一、编辑/etc/vim/vimrc.tiny二、安装vim full版本三、添加”.vimrc”文件 目录 前言&#xff1a; 最近由于要玩TensorFlow&#xff0c;所以把尘封已久的Ubantu给打开了&#xff0c;不过配置网络的时候&#xff0c;算是一团糟&#xff0c;出现了在插入模…

《Python爬虫开发与项目实战》——第3章 初识网络爬虫 3.1 网络爬虫概述

本节书摘来自华章计算机《Python爬虫开发与项目实战》一书中的第3章&#xff0c;第3.1节&#xff0c;作者&#xff1a;范传辉著&#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众号查看 第3章 初识网络爬虫 从本章开始&#xff0c;将正式涉及Python爬虫的开发。本章…

【python】解决:TypeError: can't send non-None value to a just-started generator

在一个生成器函数未启动之前&#xff0c;是不能传递数值进去。必须先传递一个None进去或者调用一次next(g)方法&#xff0c;才能进行传值操作 def product(c):# c.send(None)for i in range(5):print("生产者产生数据%d"%i)r c.send(str(i))print("消费者消费了…

Shell脚本与vi编辑器:vi启动与退出、工作模式、命令大全

Vi简介 Vi是一种广泛存在于各种UNIX和Linux系统中的文本编辑程序。Vi不是排版程序&#xff0c;只是一个纯粹的文本编辑程序。Vi是全屏幕文本编辑器&#xff0c;它没有菜单&#xff0c;只有命令。Vi不是基于窗口的&#xff0c;所以&#xff0c;这个多用途编辑程序可以用于在任何…

windows环境下,如何在Pycharm下安装TensorFlow环境

文章目录目录前言&#xff1a;1.安装Anaconda2.安装Tensorflow3.其他问题4.在pycharm中使用tensorflow目录 前言&#xff1a; 最近由于工作需要要使用TensorFlow&#xff0c;所以只能狂补相关的知识。本来博主打算在Ubantu上玩&#xff0c;但是由于一些原因还是放弃了这个想法…

python面向对象实现简易银行管理员页面系统【导入自定义模块】

main.py 人 类名&#xff1a;Person 属性&#xff1a;姓名 身份证号 电话 卡 行为&#xff1a;卡 类名&#xff1a;Card 属性&#xff1a;卡号 密码 余额 行为&#xff1a;银行 类名&#xff1a;Bank 属性&#xff1a;用户列表 提款机提款机 类名&#xff1a;ATM 属性&#xf…

[转] dpkg-deb命令

点击此处阅读原文 软件包管理 dpkg-deb命令是Debian Linux下的软件包管理工具&#xff0c;它可以对软件包执行打包和解包操作以及提供软件包信息。 语法dpkg-deb(选项)(参数) 选项-c&#xff1a;显示软件包中的文件列表&#xff1b; -e&#xff1a;将主控信息解压&#xff1b;…

《Effective Debugging:软件和系统调试的66个有效方法》一第5条:在能够正常运作的系统与发生故障的系统之间寻找差别...

本节书摘来自华章出版社《Effective Debugging&#xff1a;软件和系统调试的66个有效方法》一书中的第1章&#xff0c;第1.5节&#xff0c;作&#xff3b;希&#xff3d;迪欧米迪斯斯宾奈里斯&#xff08;Diomidis Spinellis&#xff09;&#xff0c;更多章节内容可以访问云栖社…

如何安装多个Python版本以及在Pycharm中切换Python版本

目录前言&#xff1a; 首先要切换不同的版本&#xff0c;你必须先下载不同的Python版本&#xff0c;整个步骤如下所示&#xff1a;1、下载Python2.7x和Python3.5x版本2、安装Python2.7x和Python3.5x版本3、配置环境变量&#xff0c;分别添加如下至path路径4、只修改Python27&am…

【python】逻辑运算符总结

# 逻辑运算符 &#xff1a;构造复杂条件 # 优先级 not > and > or # 逻辑与 and 并且、同时 import random# a random.randint(1,5) # if a > 1 and a < 3_流程控制: # print("true") # else: # print("false") # 可以转换为假&#…

C#中out和ref之间的区别【转】

首先&#xff1a;两者都是按地址传递的&#xff0c;使用后都将改变原来参数的数值。 其次&#xff1a;ref可以把参数的数值传递进函数&#xff0c;但是out是要把参数清空&#xff0c;就是说你无法把一个数值从out传递进去的&#xff0c;out进去后&#xff0c;参数的数值为空&am…

如何打开.ipynb文件

最近碰到文件名后缀为.ipynb文件&#xff0c;起初没太在意这种文件格式&#xff0c;用Notepad打开之后看到也是类似于JSON格式的信息&#xff0c;以为也是为其他的一些文件服务的&#xff08;类似于配置一些HTML文件的配置文件&#xff09;。但是后来才发现这也是一种文本表示形…

《CCNP TSHOOT 300-135认证考试指南》——2.9节凭记忆完成表格和列表

本节书摘来自异步社区《CCNP TSHOOT 300-135认证考试指南》一书中的第2章&#xff0c;第2.9节凭记忆完成表格和列表&#xff0c;作者 【加】Raymond Lacoste , 【美】Kevin Wallace&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.9 凭记忆完成表格和列表CC…

将f2fs文件系统到磁盘

1 用git下载f2fs文件系统tools的源代码。下载地址如下&#xff1a;http://git.kernel.org/cgit/linux/kernel/git/jaegeuk/f2fs-tools.git 具体的操作如下&#xff1a;git clone git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git 通过以…

【python】list append()和extend()区别

list append() ---》添加一个对象整体 extend() ----》添加迭代的对象 append() 添加单一元素在末尾 my_list [geeks, for] my_list.append(geeks) print(my_list) output: [geeks, for, geeks]添加一个list后&#xff0c;也是只添加一个list对象 my_list [geeks, for…

玩Python遇到的问题一二三及解决办法

文章目录问题一&#xff1a;python 2.7版本解决TypeError: encoding is an invalid keyword argument for this function。问题二&#xff1a;python读取文件时提示"UnicodeDecodeError: gbk codec cant decode byte 0x80 in position 205: illegal multibyte sequence&qu…

《MATLAB图像处理超级学习手册》导读

前言 MATLAB图像处理超级学习手册图像是人类获取信息的重要来源。当今的信息化社会&#xff0c;对图像处理和图像分析的要求越来越高&#xff0c;现有的图像软件由于采购成本和功能的限制&#xff0c;已经不能完全满足专业人士的需要&#xff0c;这时就需要专业人士来编写自己的…

【python】SOCK_STREAM和SOCK_DGRAM两种类型的区别【转】

sock_stream 是有保障的(即能保证数据正确传送到对方)面向连接的SOCKET&#xff0c;多用于资料(如文件)传送。 sock_dgram 是无保障的面向消息的socket &#xff0c; 主要用于在网络上发广播信息。 SOCK_STREAM是基于TCP的&#xff0c;数据传输比较有保障。SOCK_DGRAM是基于U…

JavaScript将字符串中的每一个单词的第一个字母变为大写其余均为小写

要求&#xff1a; 确保字符串的每个单词首字母都大写&#xff0c;其余部分小写。 这里我自己写了两种方法&#xff0c;或者说是一种方法&#xff0c;另一个是该方法的变种。 第一种&#xff1a; function titleCase(str) {var newarr,newarr1[]; newarr str . toLowerCase() .…

聊天机器人的分类及综述

文章目录[toc] 目录前言&#xff1a;1、技术方向2、chatbot的知识框架3、应用的分类4、chatbot的几个challenges5、工业应用综述总结&#xff1a;目录 前言&#xff1a; 最近由于工作需要&#xff0c;要开发一款智能客服&#xff0c;目前正在搞业务咨询模块的功能&#xff0c…