jQuery最强大的功能在于它可以通过css选择器查找元素,它的源码中有一半是sizzle css选择器引擎的代码,在html5规范出来之后,增加了document.querySelector和document.querySelectorAll直接查找元素,如果是做移动端开发的,使用jQuery的必要性大大降低。

用js代码实现css选择器,必然是用正则表达式来识别字符串了,当然浏览器提供的原生api 效率更高,以下代码只做原理性展示,并未优先性能,

例如

1)查找id显然是用document.getElementById更高效,浏览器已经做了hash,一次性找到元素不用遍历每个节点。

2)查找 name用document.getElementsByName更高效,浏览器已经做了一个含有该name的集合,

3)查找标签名 用document.getElementsByTagName更高效,浏览器已经做了一个含有该tag集合,从这个集合中再查找子集显然可以少遍历很多的元素,至于浏览器是不是在元素创建的时候就更新了缓存的集合就不得而知了,但是从这个集合中判断是不是目标元素的子节点还要用contains也会有性能损耗。

好了,我们先不考虑用原生api优化选择器的问题,只用纯正则表达式来做一个简单的实现,先用正则判断如果含有#就是id选择器,如果含有点号就是class选择器,如果含有[]就是属性选择器,设定好查找目标后开始遍历子节点,要用递归函数遍历childNodes子节点的id,name,className,getAttribute是否匹配,如果匹配就返回该元素。完整的代码如下:

html:

<body>
<div> <span id="sp_id">hello,id</span>
<span class="sp_class">hello,class</span>
<span name="sp_name" >hello,name</span>
<b>hello,tag</b>
</div>
</body>

javascript:

<script type="text/javascript">

     function find(el, selector) { //查找子节点,用法类似jquery的find函数,仅支持id,class,attr选择器,仅支持返回匹配的第一个元素
var m = selector.match(/([#\.\[])([\w\W]+)/i);
var type, key,attrName, result;
if (m) {
if (m[1] == ".") {
type = "class"; key = m[2];
} else if (m[1] == "#") {
type = "id"; key = m[2];
} if (m[1] == "[") {
type = "attr";
m = m[2].match(/(\w+)=(\w+)/i);
attrName = m[1];
key = m[2];
}
} else {
type = "tag"; key = selector;
} function findChild(node) {
var c;
for (var i = 0; i < node.childNodes.length; i++) {
c = node.childNodes[i];
if (type == "class" && c.className == key) {
result = c;
return;
} else if (type == "id" && c.id == key) {
result = c;
return;
} else if (type == "attr" && c.getAttribute && c.getAttribute(attrName) == key) {
result = c;
return;
} else if (type == "tag" && c.tagName && c.tagName.toLowerCase() == key) {
result = c;
return;
}
findChild(c);
}
}
findChild(el);
return result; } console.log(find(document.body,"#sp_id").innerHTML);
console.log(find(document.body,".sp_class").innerHTML);
console.log(find(document.body,"[name=sp_name]").innerHTML);
console.log(find(document.body,"b").innerHTML); </script>

最新文章

  1. Unity5和WebGL移植指南的一些总结
  2. c++ 二维数组传递
  3. saltstack之(六)配置管理state
  4. const对象
  5. Java基础相关
  6. OpenNMS界面图 .
  7. 电商ERP如何接入智选物流平台?
  8. Android_baseComponentExample
  9. WPF手写代码配置文件——单例
  10. 有意思的字符串反转(JavaScript)
  11. 阿里云部署 Flask + WSGI + Nginx 详解
  12. asp.net C# 题目大全
  13. FreeRTOS初步认识
  14. Android Studio 错误集
  15. TCP协议总结
  16. js常用内置对象及方法
  17. bootstrap 组件之&quot;导航条&quot;
  18. Django App(一) StartApp
  19. 向量 dot cross product 点积叉积 几何意义
  20. .NET CORE 使用Dapper连接MSSQL,MYSQL

热门文章

  1. Tensorflow之AttributeError: module &#39;tensorflow&#39; has no attribute &#39;mul&#39;
  2. Numpy中 arange() 的用法
  3. BUU re xor
  4. nginx 安装部署前篇
  5. Windows驱动开发-Device结构体
  6. Outer()函数
  7. Redis详解(一)——RDB
  8. js获取cookie提取用户名asp.net+html
  9. SVG格式文件
  10. WorkerServices构建Windows服务