Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript使用HTML搜索确切的子节点_Javascript_Firefox_Dom - Fatal编程技术网

使用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

不过,我认为一般来说这是个坏主意,如果您希望所述元素的内容发生更改(这就是您搜索它的原因),那么可以附加一个事件处理程序来侦听更改