这种场景应该很常见,点击个原始,想获取最近符合要求的父节点
代码如下:
- function getParent(max) {
- let index = 0;
- let maxCheck = (max && max > 0) ? max : 100;
-
- function getP(child, fn) {
- index++;
- if (index >= maxCheck) {
- return null;
- }
- let parentNode = child.parentNode;
- if (parentNode) {
- if (fn(parentNode)) {
- return parentNode
- } else {
- return getP(parentNode, fn);
- }
- }
- }
- return getP
- }
代码核心是:递归,闭包
闭包中维护一个递归层级的变量,如果超出这最大层级还没有找到就返回null,
该函数
接受一个number类型的参数,表示最大可递归的层级,默认100
该函数执行后返回一个函数,这个函数接受2个参数,
使用demo
- <!DOCTYPE html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- </head>
-
- <body>
- <div class="a">
- <span>点击我??</span>
- <div class="b">
- <span class="c">点击我</span>
- </div>
- </div>
- <script>
- function getParent(max) {
- let index = 0;
- let maxCheck = (max && max > 0) ? max : 100;
-
- function getP(child, fn) {
- index++;
- if (index >= maxCheck) {
- return null;
- }
- let parentNode = child.parentNode;
- if (parentNode) {
- if (fn(parentNode)) {
- return parentNode
- } else {
- return getP(parentNode, fn);
- }
- }
- }
- return getP
- }
-
- window.onload = function() {
- let getMatchParent = getParent();
- document.querySelector(".c").onclick = function() {
- console.log("点击了")
- let p = getMatchParent(this, function(dom) {
- return dom.className === "a";//寻找class为a的父元素
- })
- console.log("p", p)
- }
- }
- </script>
- </body>
-
- </html>