博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
$("#id a") - $("#id .c a") = ?
阅读量:4919 次
发布时间:2019-06-11

本文共 1681 字,大约阅读时间需要 5 分钟。

前沿

这是之前淘宝的一道面试题,题目借用了 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结构:

A1
A2
A3

调用函数:

// 测试        window.onload = function() {            // 调用函数            var res = domSelector("id", "c", "a");            console.log(res); // 返回一个数组:[a.A1, a.A3]        };

 

结语

由于过多的DOM遍历会导致性能问题,所以递归调用的方法可能会存在效率上的问题。所以各自权衡吧~

 

 

转载于:https://www.cnblogs.com/cyStyle/p/3344007.html

你可能感兴趣的文章
Android设计模式实战---责任链模式
查看>>
剑指Offer_31_整数中1出现的次数(从1到n整数中1出现的次数)
查看>>
10月29日 迅雷会员vip账号分享 91freevip 晚间21:00更新
查看>>
【一题多解】Python 字符串逆序
查看>>
open ball、closed ball 与 open set、closed set(interior point,limit point)、dense set
查看>>
字典(dictionary)与映射(map)
查看>>
Python 编程规范 —— TODO 注释(结合 PyCharm)
查看>>
十万个为什么 —— 名词解释(体育)
查看>>
table的设置(w3c)
查看>>
冲刺一
查看>>
【练习】在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b...
查看>>
python解决上楼梯问题
查看>>
变参宏 __VA_ARGS__
查看>>
sql 语句
查看>>
VUE一 基础语法
查看>>
[MySQl]MySQL忘记密码
查看>>
Android的minSdkVersion,targetSdkVersion,maxSdkVersion
查看>>
Xceed WinForm数据表格控件Xceed Grid For .NET控件详细介绍及下载地址
查看>>
ecos启动流程分析
查看>>
Oracle CASE WHEN 用法介绍
查看>>