$("#id a") - $("#id .c a") = ?
前沿
这是之前淘宝的一道面试题,题目借用了 jQuery 选择器的语法。大概的意思是,从 #id 元素内选出所有不是 .c 后代的 a 元素,即父元素 #id 内的所有后代元素中,选出不是 .c 后代元素里的所有a元素。题目主要考察的是 DOM 操作的知识,来筛选DOM元素,并且不能使用jQuery等框架。
思路
先选出所有 a 元素。对每个 a 元素,从其所在位置沿着 DOM 树往上搜索,每走一步对比当前节点类名,含有 c 类立刻中止,否则继续上行直至根节点或父元素(#id)处,结束搜索并将 a 元素加入结果集里。对全部 a 元素执行完该操作后,返回结果集。
查找过程的流程图如下:

js核心代码:
// 参数依次为根元素、给出的类名、目标元素(即一一对应题目中的$("#id .c a"))
var domSelector = function(rootId, filterClass, targetTag) {
var root = document.getElementById(rootId),
nodes = root.getElementsByTagName(targetTag),
resultArr = [],
i,
len;
// 沿着DOM树查找
var ascend = function(start, end, current) {
if(current === end) { // 查找成功
resultArr.push(start);
// 没查找到则继续沿着DOM树往上搜索(递归调用)
} else if((" " + current.className.toLowerCase() + " ").indexOf(" " + filterClass + " ") == -1) {
ascend(start, end, current.parentNode);
}
};
for (i = 0, len = nodes.length; i < len; i++) {
ascend(nodes[i], root, nodes[i].parentNode); // 循环便利
}
return resultArr;
};
测试:
HTML结构:
<div id="id">
<div>
<a href="" class="A1">A1</a>
</div>
<div class="c">
<a href="" class="A2">A2</a>
</div>
<div class="d">
<a href="" class="A3">A3</a>
</div>
</div>
调用函数:
// 测试
window.onload = function() {
// 调用函数
var res = domSelector("id", "c", "a");
console.log(res); // 返回一个数组:[a.A1, a.A3]
};
结语
由于过多的DOM遍历会导致性能问题,所以递归调用的方法可能会存在效率上的问题。所以各自权衡吧~
随机推荐
- 应聘复习基础笔记1:网络编程之TCP与UDP的优缺点,TCP三次握手、四次挥手、传输窗口控制、存在问题
重要性:必考 一.TCP与UDP的优缺点 ①TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供 ...
- ios中用drawRect方法绘图的时候设置颜色
设置画笔颜色可以直接 [[UIColor grayColor] set];就可以设置颜色.
- require.js的用法
我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文 ...
- 通过firefox+ProxySelector+dtunnel_lite实现代理上网
通过firefox+ProxySelector+dtunnel_lite实现代理上网 dtunnel_lite:http://dog-tunnel.tk/下载lite版本就可以 远端:./dtunne ...
- verilog实现16位五级流水线的CPU带Hazard冲突处理
verilog实现16位五级流水线的CPU带Hazard冲突处理 该文是基于博主之前一篇博客http://www.cnblogs.com/wsine/p/4292869.html所增加的Hazard处 ...
- ASP.NET中Global.asax 文件是什么?
Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序安全性以及其它一些任务.下面让我们详细看 ...
- UIStepper swift
// // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...
- why does angular js rock
angularjs 入门教程 http://angular-tips.com/blog/2013/08/why-does-angular-dot-js-rock/ Practive the previ ...
- 基于.net mvc的校友录(五、web.config对的配置以及filter实现的权限控制)
web.config配置文件 此文件是整个系统的配置中心,它告诉iis服务器本网站需要哪些运行时环境,需要哪些环境,将要进行哪些操作,开发人员也会将一个常量性的数据放在此配置中,以备系统全局调用.此文 ...
- 随笔 planetest
Camera跟随物体: import Scripts包,Component中的camera control会有smooth follow脚本,添加到Main Camera中,在脚本的target属性中 ...