javascript - 基于层级节点树构建数组

标签 javascript html dom

我有以下 HTML 标记:

<body>
   <div class="wrapper">
      <div class="head">
         <p class="title">title</p>
         <a href="#" class="logo"></a>
      </div>
   </div>
</body

我需要得到类似下面的东西 - 类“logo”的“A”元素是类“head”的 div 元素的第二个子节点。类“head”的div元素是类“wrapper”的div元素的第一个子节点,类“wrapper”的div元素是类“body”的第一个子节点。然后我会得到类“logo”链接的位置,如下所示:

变量 a = [1, 1, 2]

因此,如果我使用上面的数组朝相反的方向前进,我会在 DOM 中从 body 元素开始找到类为“logo”的链接。谁能告诉我如何使用 JavaScript 实现这一点?

提前致谢。

最佳答案

这里有一对函数改编 self 的一些现有代码,用于将节点转换为节点内嵌套位置的数组,然后再返回。

现场演示:http://jsfiddle.net/DSNUv/

代码:

function getNodeIndex(node) {
    var i = 0;
    while( (node = node.previousSibling) ) {
        i++;
    }
    return i;
}

function nodeToPath(node, rootNode) {
    var path = [], n = node;
    rootNode = rootNode || document.documentElement;
    while (n && n != rootNode) {
        path.push(getNodeIndex(n));
        n = n.parentNode;
    }
    return path;
}

function pathToNode(path, rootNode) {
    rootNode = rootNode || document.documentElement;
    var node = rootNode;
    var i = path.length, nodeIndex;

    while (i--) {
        nodeIndex = path[i];
        if (nodeIndex < node.childNodes.length) {
            node = node.childNodes[nodeIndex];
        } else {
            throw new Error("Child node index out of range: " + nodeIndex);
        }
    }

    return node;
}

使用示例:

var a = document.getElementsByTagName("a")[0];

var path = nodeToPath(a, document.body);
alert(path);

var el = pathToNode(path, document.body);
alert(el.className);

关于javascript - 基于层级节点树构建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7978501/

相关文章:

javascript - 如何实现React路由?

javascript - 如何通过代码覆盖皮肤的设置?

javascript - 如何处理确认框的取消事件?

javascript - 迭代字符串数组错误,运行第一项的字母

html - 为什么只有一张大图片作为主页不好?

javascript - D3 中 jQuery 的 $ (".cell:first") 是什么?

javascript - 如果使用 Angular js 与 ng-repeat 一起使用,则调用一次函数

javascript - <div> 的样式以模拟弹出窗口的行为

javascript - 什么时候使用基于 DOM 的生成与使用 strings/innerHTML/JQuery 生成 DOM 内容?

javascript - jQuery - 查找所有输入,除了从 div 降序的输入