如何在所有后代textNodes(Javascript)中搜索值?

时间:2018-08-26 19:38:34

标签: javascript html google-chrome google-chrome-extension

因此,基本上,我正在制造一个Chrome扩展程序,该扩展程序按其受欢迎程度(售出次数)对Ebay上的搜索结果进行排序。为此,我需要找到所有具有包含文本li的后代文本节点的...+ Sold元素,其中...是数字。
基本上,在Ebay上的搜索结果如下:

<li class="s-item">
   <div class="s-item__wrapper clearfix">
      <div class="s-item__image-section">
         <!-- other stuff -->
      </div>
      <div class="s-item__info clearfix">         
         <!-- other stuff -->
         <div class="s-item__details clearfix">
            <!-- other stuff -->
            <div><span><span>62+ Sold</span></span></div>
         </div>
      </div>
   </div>
</li>

在每个li元素中,我必须搜索文本Sold并从该文本节点中提取数字以进行进一步处理。我该怎么办?

2 个答案:

答案 0 :(得分:1)

使用选择器字符串:选择ProductBasicProjection以选择所有从li.s-item span派生为span的{​​{1}}的对象,检查跨度是否是唯一的孩子是一个文本节点,其中带有“已售出”字样,如果是,请执行您需要做的任何事情。

如果您确定任何 li,而不只是那些具有s-item类的人,请改用<li>

s-item
'li span'

答案 1 :(得分:1)

您不能仅通过使用childNodeschildren属性来执行此操作,因为它们仅返回子节点,而不返回当前节点的所有后代。因此,您将必须为此编写自己的函数,例如:

function getDescendants(node, arr) {
      var i;
      arr = arr || [];
      for (i = 0; i < node.childNodes.length; i++) {
          arr.push(node.childNodes[i])
          getDescendants(node.childNodes[i], arr);
      }
      return arr;
  }

使用此功能,您只需简单地遍历所有后代并检查它们是否为文本节点(nodeType == 3),然后在其中搜索单词Sold。之后,提取数字非常容易。 像这样:

var searchValue = "Sold";
var descendants = getDescendants(listItem);
for(var j = 0; j < descendants.length; j++) {
    if(descendants[j].nodeType == 3){
        if(descendants[j].nodeValue.indexOf(searchValue) > -1){
            var text = descendants[j].nodeValue.trim();
            //"37+ Sold"    for example
            var soldNr = text.substring(0, text.indexOf(searchValue)-2);  
            //you process your number(soldNr) further
        }
    }
}