我想知道如何知道节点是否是另一个节点的最后一个孩子。DOM:用PHP,如何弄清楚节点是否是父节点的最后一个孩子
我知道如何检索父母的lastChild
名称($node->parentNode->lastChild->nodeName
),但由于有时同一父母中有许多相同的节点名称,因此该名称肯定不是找到最后一个孩子的方式。
我正在寻找某种类型的迭代器,它可以检索子元素的数量,并根据当前节点的位置判断当前节点是否是最后一个子元素。
谢谢!
我想知道如何知道节点是否是另一个节点的最后一个孩子。DOM:用PHP,如何弄清楚节点是否是父节点的最后一个孩子
我知道如何检索父母的lastChild
名称($node->parentNode->lastChild->nodeName
),但由于有时同一父母中有许多相同的节点名称,因此该名称肯定不是找到最后一个孩子的方式。
我正在寻找某种类型的迭代器,它可以检索子元素的数量,并根据当前节点的位置判断当前节点是否是最后一个子元素。
谢谢!
纯DOM术语中,如果孩子是父母的最后一个孩子,其nextSibling
属性将为null
。
JavaScript示例(不是你要找的Javascript专门):
if (!child.nextSibling) {
// It's the last child
}
需要注意的是nextSibling
穿越节点是很重要的。有时你想要遍历元素而不是文本节点等。例如,在此标记:
<p>Testing <span>one</span> two three</p>
...的span
不在其容器中的最后一个节点(因为它后跟一个文本节点),但它在其容器中的最后一个元素。如果你想寻找的是,你需要一个循环检查nodeType
,如:
// =====
// Note: This example is in JavaScript, but I assume it's easy enough
// to follow what it's doing and translate it to PHP
// =====
// Utility function
function nextElement(node) {
var rv = node.nextSibling;
while (rv && rv.nodeType !== 1) {
rv = rv.nextSibling;
}
return rv;
}
// Usage
if (!nextElement(child)) {
// There was no element after `child`
}
由于这是一个PHP的问题,我会留下一个PHP的答案(使用DOM)为后人:
if ($node->isSameNode($node->parentNode->lastChild))
{
//...
}
如果您使用SimpleXML,只需将您的节点转换为dom_import_simplexml()即可。
抱歉,我想感谢您的提示;) – Bacon 2010-04-29 08:46:22
重新登录PHP标签:这个问题与PHP无关,是吗?它是客户端DOM,还是我错过了这一点? – 2010-04-16 11:09:50
@ T.J .:哪一种客户端语言在'$ node'中使用$ -notation作为变量? ;-) – VolkerK 2010-04-16 11:11:01
@ VolkerK:我认为这是速记。如果这是一个PHP的东西,我最好消失。 :-)(编辑:嘿,我想我很幸运,显然无论它是一个有用的答案,因为DOM是DOM,无论位置如何。) – 2010-04-16 11:11:49