使用javascript使用HTML搜索确切的子节点
使用javascript使用HTML搜索确切的子节点,javascript,firefox,dom,Javascript,Firefox,Dom,getElementsByTagName(“*”)将在深度优先搜索中按预先顺序获取子节点。问题是,如果在节点的HTML中搜索字符串,则无法判断该字符串是否在另一个子节点中,该子节点将由getElementsByTagName(“*”)返回。那么,有没有任何方法可以将节点从叶子迭代到根? 最有可能的是,DFS Post-order就可以了 例如: <div id=""master"> <div id="id1"> <div id="id2"&g
getElementsByTagName(“*”)
将在深度优先搜索中按预先顺序获取子节点。问题是,如果在节点的HTML中搜索字符串,则无法判断该字符串是否在另一个子节点中,该子节点将由getElementsByTagName(“*”)
返回。那么,有没有任何方法可以将节点从叶子迭代到根?
最有可能的是,DFS Post-order
就可以了
例如:
<div id=""master">
<div id="id1">
<div id="id2">
<span>text</span><i>more text</i>
</div>
</div>
</div>
这比您名义上需要的稍微多一些,但确实是您想要的
它允许您使用基于属性的多个条件搜索节点,并提供所有匹配项的数组
function getNodes(prop, needle, blnMatch, node){
var results=[], any=(needle==null);
node=node||document.documentElement;
if(node.splice){ node={childNodes:node}; }
for(var it, i=0, kids=node.childNodes;it=kids[i];i++){
if(it.childNodes.length){
results=results.concat(getNodes(prop, needle, blnMatch, it));
}
switch(true){
case any && it[prop]:
case it[prop]===needle:
case blnMatch && !!String(it[prop]).match(needle):
results[results.length]=it;
}
}
return results;
}//end getNodes()
//for your purpose, you can use it to reach the actual textNode as such:
var node=getNodes("data","more text")[0];
alert([node.data, node.nodeName]) // shows : "more text, #text"
请注意,您可以通过多种方式使用它来获得任何给定属性的特定性:
getNodes("nodeType", 3);
getNodes("nodeValue", "more text");
getNodes("nodeName", /^(a|link)$/i, true);
这比你名义上需要的稍微多一些,但确实是你想要的
它允许您使用基于属性的多个条件搜索节点,并提供所有匹配项的数组
function getNodes(prop, needle, blnMatch, node){
var results=[], any=(needle==null);
node=node||document.documentElement;
if(node.splice){ node={childNodes:node}; }
for(var it, i=0, kids=node.childNodes;it=kids[i];i++){
if(it.childNodes.length){
results=results.concat(getNodes(prop, needle, blnMatch, it));
}
switch(true){
case any && it[prop]:
case it[prop]===needle:
case blnMatch && !!String(it[prop]).match(needle):
results[results.length]=it;
}
}
return results;
}//end getNodes()
//for your purpose, you can use it to reach the actual textNode as such:
var node=getNodes("data","more text")[0];
alert([node.data, node.nodeName]) // shows : "more text, #text"
请注意,您可以通过多种方式使用它来获得任何给定属性的特定性:
getNodes("nodeType", 3);
getNodes("nodeValue", "more text");
getNodes("nodeName", /^(a|link)$/i, true);
如果必须实际执行此文本搜索,请确保,然后检查字符串。实际要返回的节点是所述节点的parentNode
但是,我认为一般来说这是一个坏主意,如果您希望所述元素的内容发生更改(这就是您搜索它的原因),请附加一个事件处理程序来侦听更改。如果您必须实际执行此文本搜索,请确保,然后检查字符串。实际要返回的节点是所述节点的parentNode
不过,我认为一般来说这是个坏主意,如果您希望所述元素的内容发生更改(这就是您搜索它的原因),那么可以附加一个事件处理程序来侦听更改