• DOM获取符合条件的父级节点


    这种场景应该很常见,点击个原始,想获取最近符合要求的父节点

    代码如下:

    1. function getParent(max) {
    2. let index = 0;
    3. let maxCheck = (max && max > 0) ? max : 100;
    4. function getP(child, fn) {
    5. index++;
    6. if (index >= maxCheck) {
    7. return null;
    8. }
    9. let parentNode = child.parentNode;
    10. if (parentNode) {
    11. if (fn(parentNode)) {
    12. return parentNode
    13. } else {
    14. return getP(parentNode, fn);
    15. }
    16. }
    17. }
    18. return getP
    19. }

    代码核心是:递归,闭包

    闭包中维护一个递归层级的变量,如果超出这最大层级还没有找到就返回null,

    该函数

    接受一个number类型的参数,表示最大可递归的层级,默认100

    该函数执行后返回一个函数,这个函数接受2个参数,

    1. 第一个是当前的dom对象,
    2. 另外一个是函数,接受一个dom参数是父节点,返回true代表符合条件,false不符合

    使用demo

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Document</title>
    8. </head>
    9. <body>
    10. <div class="a">
    11. <span>点击我??</span>
    12. <div class="b">
    13. <span class="c">点击我</span>
    14. </div>
    15. </div>
    16. <script>
    17. function getParent(max) {
    18. let index = 0;
    19. let maxCheck = (max && max > 0) ? max : 100;
    20. function getP(child, fn) {
    21. index++;
    22. if (index >= maxCheck) {
    23. return null;
    24. }
    25. let parentNode = child.parentNode;
    26. if (parentNode) {
    27. if (fn(parentNode)) {
    28. return parentNode
    29. } else {
    30. return getP(parentNode, fn);
    31. }
    32. }
    33. }
    34. return getP
    35. }
    36. window.onload = function() {
    37. let getMatchParent = getParent();
    38. document.querySelector(".c").onclick = function() {
    39. console.log("点击了")
    40. let p = getMatchParent(this, function(dom) {
    41. return dom.className === "a";//寻找class为a的父元素
    42. })
    43. console.log("p", p)
    44. }
    45. }
    46. </script>
    47. </body>
    48. </html>

  • 相关阅读:
    【ASM】字节码操作 转换已有的类 在方法进入和退出的时候 添加
    c++学习MFC还是QT?
    如何对pdf文件进行压缩?
    机器学习算法面试知识点解读
    Apache JMeter压测工具
    文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题
    Nginx部署前端项目
    【springboot】通过拦截器全局监听请求
    自定义preference的使用
    Openresty缓存使用
  • 原文地址:https://blog.csdn.net/u014071104/article/details/125422214