原生的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 相关文章推荐
javascript完美拖拽的实现方法
Sep 29 Javascript
jquery交替变换颜色的三种方法 实例代码
Nov 19 Javascript
jQuery中delegate和on的用法与区别详细解析
Jan 26 Javascript
js调出上下文菜单的实例
Dec 17 Javascript
js中利用tagname和id获取元素的方法
Jan 03 Javascript
详解Bootstrap的iCheck插件checkbox和radio
Aug 24 Javascript
vue2.0开发实践总结之入门篇
Dec 06 Javascript
利用Bootstrap实现表格复选框checkbox全选
Dec 21 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
Sep 12 Javascript
jQuery时间戳和日期相互转换操作示例
Dec 07 jQuery
layer.confirm()右边按钮实现href的例子
Sep 27 Javascript
vue.js+element 默认提示中英文操作
Nov 11 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连mysql和oracle数据库性能比较
2006/10/09 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
jquery 问答知识整理
2010/02/11 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
2015/06/08 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
详解Python的Django框架中的模版相关知识
2015/07/15 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
2019/08/20 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
python编写微信公众号首图思路详解
2019/12/13 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
经济与贸易专业应届生求职信
2013/11/19 职场文书
公司清洁工岗位职责
2013/12/14 职场文书
给面试官的感谢信
2014/02/01 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
校园安全演讲稿
2014/05/09 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
学校党员对照检查材料
2014/08/28 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
如何书写授权委托书?
2019/06/25 职场文书
详解Redis复制原理
2021/06/04 Redis