我有这个简单的 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 主体的直接后代。
这两个函数也不会抛出任何错误。