[二叉树应用] find parent by class

194 阅读1分钟
    话说周末朋友给我发了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>