1

我有这个简单的 DOM 遍历功能,我用过几次。

这是一个简化版本:

function walk_DOM(&$dom, &$node, $func){

    $args = array(&$node, &$dom);

    call_user_func_array($func, $args);

    if ($node->nextSibling !== null) {
        walk_DOM($dom, $node->nextSibling, $func);
    }
    if ($node->hasChildNodes()) {
        $children = nodeList_to_array($node->childNodes);
        walk_DOM($dom, $children[0], $func);
    }
}

我开始质疑它的价值。我最近使用了一个新函数作为 $func 参数。它旨在仅允许渲染“#text”节点和“p”节点。

该功能是:

function strip_test(&$node, &$dom){

    if (($node->nodeName !== 'p') &&
            ($node->nodeName !== '#text') &&
            ($node->nodeName !== 'body')) {

        if ($node->parentNode !== null) {
            $parent = $node->parentNode;
            $parent->removeChild($node);
        }
    }
}

Walk_DOM() 停止而不查看所有节点。剩余的节点仍然存在于 DOM 中。他们只是从未被评估过。

所以,关于这个问题。这种技术有什么明显的问题吗?如果没有,是否有调试 DOM 问题的好方法?

我跟踪了 walk_DOM() 访问的节点,发现它覆盖的部分和它之前停止的部分没有区别。

在以前的使用中,我发现了这一点。虽然很简单,但它不会重复检查任何节点,并且之前已经覆盖了整个 DOM。

编辑 :

为了清楚起见,当我说“停止而不查看”时,我的意思是在(任意)50 个具有 0 到 3 层子节点的节点列表中。该函数将解析其中的 25%,然后停止。它解析的最后一个节点是 DOM 主体的直接后代。

这两个函数也不会抛出任何错误。

4

0 回答 0