怎么判断某个dom节点是否包含某个dom节点?

js有个contains的方法来判断是否为子节点
我想问下这个是怎么实现的呢?
原理是什么呢?

阅读 33k
5 个回答

contains 自带方法,判断一个元是不是另一个元的子集

document.documentElement.contains(document.body) 
//true 意思是html是否包含body
<div class="first">
    <div class="first-child"></div>
</div>
<div class="second">
    <div class="second-child">
        <div class="second-child-child"></div>
    </div>
</div>
<script type="text/javascript">
    var a = document.querySelector('.first-child');
    var b = document.querySelector('.second-child-child');
    var c = document.querySelector('.first');
    var d = document.querySelector('.second');

    function isChildOf(child, parent) {
        var parentNode;
        if(child && parent) {
            parentNode = child.parentNode;
            while(parentNode) {
                if(parent === parentNode) {
                    return true;
                }
                parentNode = parentNode.parentNode;
            }
        }
        return false;
    }

    console.log(isChildOf(a, b));
    console.log(isChildOf(b, d));
    console.log(isChildOf(a, c));
</script>

<div class="parent">

<div class="child"></div>

</div>
console.log(document.querySelector(".parent").querySelector(".child"))
child存在时有值,不存在值是null,判断这个就行了

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .center {
                display: flex;
                justify-content: center;
                align-items: center;
            }
            
            .main {
                width: 300px;
                height: 300px;
                background: red;
            }
            
            .con {
                width: 200px;
                height: 200px;
                background: green;
            }
            
            .text {
                width: 100px;
                height: 100px;
                background: yellow;
            }
        </style>

    </head>

    <body>
        <div class="main center">
            <div class="con center">
                <span class="text center">测试</span>
            </div>
        </div>
        <script type="text/javascript">
            var main = document.querySelector(".main");
            var con = document.querySelector(".con");
            var text = document.querySelector(".text");

            text.addEventListener("click", function(e) {
                console.log(main.contains(e.target));
                console.log(con.contains(e.target));
                console.log(main.contains(con));

                console.log(con.contains(main));
            })
          
            console.log(isChildOf(con, main));
            console.log(isChildOf(text, main));
            console.log(isChildOf(main, con));

            function isChildOf(child, parent) {
                var parentNode;
                if(child && parent) {
                    parentNode = child.parentNode;
                    while(parentNode) {
                        if(parent === parentNode) {
                            return true;
                        }
                        parentNode = parentNode.parentNode;
                    }
                }
                return false;
            }
        </script>
    </body>

</html>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题