原生的html元素选择器类似jquery选择器


Posted in Javascript onOctober 15, 2014

做前端,需要选择元素,虽说有jquery和各大js库已经帮我造好了轮子,但我想试试自己实现一个,正好项目也不忙,正好加入自己的js文件中,下面是实现代码。用$g(“#content .op”)这种格式就可以调用,和jquery $()的参数一样:

function $findChilds(parentNode, text) 
{ 
//如果不传入父节点的话,默认为body 
if(parentNode == undefined) 
parentNode = document.body; 
var childNodes = parentNode.childNodes; 
var results = []; 
//子节点大于零才循环 
if(childNodes.length > 0) 
{ 
var length = childNodes.length; 
//循环查找符合text的节点 
for(var i=0;i<length;++i) 
{ 
//三种情况,className,id, tagName 
switch(text.substr(0, 1)) 
{ 
case '.': 
//这两种:parentNode.getElementsByClassName,parentNode.all 
//都是后来加上的,如果浏览器这两种方法都不支持,那就只能暴力递归了 
if(parentNode.getElementsByClassName) 
return parentNode.getElementsByClassName(text.substr(1)); 
else if(parentNode.all) 
{ 
var finded = []; 
var jlength = parentNode.all.length; 
for(var j=0;j<jlength;++j) 
if(parentNode.all[j].className == text.substr(1)) 
finded.push(parentNode.all[j]); 
return finded; 
} 
//以上两种方法都不支持,直接判断 
if(childNodes[i].className == text.substr(1)) 
results.push(childNodes[i]); 
break; 
case '#': 
return [document.getElementById(text.substr(1))]; 
default: 
return parentNode.getElementsByTagName(text); 
} 
//判断完后,把当前子元素的子元素传入$findChilds进行递归查找,返回的结果直接和现在的结果合并 
results = results.concat($findChilds(childNodes[i], text)); 
} 
} 
return results; 
} 

String.prototype.vtrim = function() { 
return this.replace(/^\s+|\s+$/g, ''); 
} 

function $g(text) 
{ 
//按照空格分割参数 
var values = text.vtrim().split(" "); 
var length = values.length; 
//如果只有一个选择参数的话,就直接调用dom方法返回结果。 
if(length == 1) 
switch(values[0].substr(0, 1)) 
{ 
case "#": 
return document.getElementById(values[0].substr(1)); 
case ".": 
if(document.getElementsByClassName) 
return document.getElementsByClassName(values[0].substr(1)); 
default: 
return document.getElementsByTagName(values[0]); 
} 
//每次迭代都会产生许多符合参数的结果节点,这里结果节点的名称为parentNodes,第一次循环默认为body 
var parentNodes = [document.body]; 
//外层循环为迭代每个传入的参数 
for(var i = 0; i < length; ++i) 
{ 
var jlength = parentNodes.length; 
var results = []; 
//这里如果values的长度为零的话, 
//就说明是多出来的空格, 
//例如:$g(" .content");这种情况不执行代码直接跳入下一循环 
var tmpValue = values[i].vtrim(); 
if(tmpValue.length <= 0) 
continue; 
//内层循环为迭代每个结果节点, 
//在结果节点中查找符合选择条件的结果。当然第一次为body 
for(var j=0;j<jlength;++j) 
{ 
//$findChilds就是上边的那个函数,就是选择某个节点的子节点的 
var result = $findChilds(parentNodes[j], values[i].vtrim()); 
var rlength = result.length; 
//因为返回的有时候是html容器,无法直接和数组concat所以倒入数组,这里有优化空间,但暂不考虑性能先这么做 
for (var k = 0; k < rlength; ++k) 
results.push(result[k]); 
} 
//没有结果,立即返回undefined 
if(results == undefined || results.length <= 0) 
return undefined; 
//最后一次循环就直接返回结果数组,但是如果最后一个选择条件是选择id的话,那就不返回数组直接返回dom对象了 
if (i == length - 1) 
{ 
if (values[i].substr(0, 1) == "#") 
return results[0]; 
return results; 
} 
parentNodes = results; 
} 
}

经过在ff ie6下的测试 单纯的选择id比jquery要快很多,
其他的部分选择模式我测试的少数比jquery要快。
当然测试不可能全面,还可能会有bug,而且不支持类似于.content:first-child这样的伪类选择。

Javascript 相关文章推荐
Extjs TriggerField在弹出窗口显示不出问题的解决方法
Jan 08 Javascript
基于jquery的15款幻灯片插件
Apr 10 Javascript
JavaScript匿名函数与委托使用示例
Jul 22 Javascript
AngularJS入门教程(二):AngularJS模板
Dec 06 Javascript
Javascript核心读书有感之表达式和运算符
Feb 11 Javascript
JavaScript生成福利彩票双色球号码
May 15 Javascript
JavaScript 数组中最大最小值
Jun 05 Javascript
详解webpack编译多页面vue项目的配置问题
Dec 11 Javascript
详解组件库的webpack构建速度优化
Jun 18 Javascript
JavaScript模板引擎实现原理实例详解
Dec 14 Javascript
全面了解JavaScript的作用域链
Apr 03 Javascript
scrapyd schedule.json setting 传入多个值问题
Aug 07 Javascript
用原生JS获取CLASS对象(很简单实用)
Oct 15 #Javascript
通过JS动态创建一个html DOM元素并显示
Oct 15 #Javascript
javascript模拟实现ajax加载框实例
Oct 15 #Javascript
jquery幻灯片插件bxslider样式改进实例
Oct 15 #Javascript
微信分享的标题、缩略图、连接及描述设置方法
Oct 14 #Javascript
js实现select组件的选择输入过滤代码
Oct 14 #Javascript
javascript记录文本框内文字个数检测文字个数变化
Oct 14 #Javascript
You might like
PHP 读取文件内容代码(txt,js等)
2009/12/06 PHP
PHP数组实例总结与说明
2011/08/23 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
Javascript函数式编程简单介绍
2015/10/11 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
2017/12/08 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
Python struct.unpack
2008/09/06 Python
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
基于Python的关键字监控及告警
2017/07/06 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
python调用摄像头显示图像的实例
2018/08/03 Python
Python变量类型知识点总结
2019/02/18 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
自学python用什么系统好
2020/06/23 Python
土木工程应届生求职信
2013/10/31 职场文书
业务经理岗位职责
2013/11/11 职场文书
高三政治教学反思
2014/02/06 职场文书
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
邀请书模板
2015/02/02 职场文书
一行代码python实现文件共享服务器
2021/04/22 Python