话说周末朋友给我发了2个坑,填完之后发现还是值得记录一下的。之前不是沉迷过一段时间算法吗,当时就觉得吧,貌似除了刷leetcode,像我这种 level 的程序猿,也没地方用,这不,周末机会就来了。
// ---- 废话分割线 ----------------------------------------------------------------------
朋友客户的需求是这样的:有一堆 checkbox,当click 了main 之后,自动 click sub
朋友的需求是这样的:网页没用三大框架,不许改 dom tree,实现金主爸爸的需求
<div class="row">
<!-- section -->
<div class="section col-md-5">
<label>
<input name="main" type="checkbox" onclick="main_click()" />
<span>MAIN</span>
</label>
<label class="child ">
<input type="checkbox" />
<span>sub1</span>
</label>
<label class="child">
<input type="checkbox" />
<span>sub2</span>
</label>
<label class="child">
<input type="checkbox" />
<span>sub3</span>
</label>
</div>
<!-- ... similar sections -->
</div> <!-- row -->
我思路是这样的:
1. 当click on main 的时候,可以拿到 main checkbox 这个object (记录为 me),
2. 顺着它往外,可以找到包裹着main 和 sub 的div (class="section") (以me 为根的话,这个过程就相当于遍历一个只有左分支的二叉树)
3. 这个 section 里面的 checkbox,除了me 之外,全是sub
4. me.checked === true 的话,把sub 全部勾上
实现:
<script type="text/javascript">
const main_click = () => {
let e = event || window.event;
let me = e.srcElement || e.target;
// find parent whose class contains <className>
const className = 'section';
const parent = findParentByClass(me, className);
// find children
let children = [...parent.getElementsByTagName('input')].filter(c => c !== me);
// tick children
children.forEach(c => c.checked = me.checked);
}
// find parent whose class contains <className>
const findParentByClass = (me, className) => {
let parent;
(findParent = me => {
if (!me || !me.getAttribute) return;
if ((me.getAttribute('class') || '').split(' ').indexOf(className) > -1) {
parent = me;
} else {
findParent(me.parentNode);
}
})(me);
return parent;
}
</script>