2017-09-17 105 views
-1

所有的HTML元素我有HTML文档:选择文本

<div class="blog"> 
    <div class="image"></div> 
    <div class="content"> 
    <p class="text"> Some text </p> 
    <div class="date">23.12</div> 
    </div> 
</div> 

我怎样才能与内部文本(的.text,.date),而不是包装(。内容)的所有元素。

这只是一个例子,在真实情况下我不知道真正的HTML结构,但我需要一个方法如何选择所有元素与文本,除了他们的包装。

需要香草方式的帮助,没有jQuery。

+0

在SO上,您应该尝试**自己编写代码**。后** [做更多的研究](//meta.stackoverflow.com/questions/261592)**如果你有问题,你可以**发布你已经尝试**与清楚的解释是什么是'工作**并提供** [最小,完整和可验证示例](// stackoverflow.com/help/mcve)**。 – Rob

回答

0

你需要获得容器,然后所有的孩子,然后过滤这些孩子。如果这是进入生产环境,你会想做一些错误检查,并确保没有这些元素返回null,未定义或其他一些不好的值。

var container = document.querySelector('.content'), 
 
    allKids = container.querySelectorAll('*'), 
 
    kidsWithContent = Array.from(allKids).filter(item => item.textContent.length !== 0); 
 
    
 
console.log(kidsWithContent);
<div class="blog"> 
 
    <div class="image"></div> 
 
    <div class="content"> 
 
    <p class="text"> Some text </p> 
 
    <div class="date">23.12</div> 
 
    <p></p> 
 
    <div></div> 
 
    </div> 
 
</div>

+0

问题是 - 我不知道父元素的HTML结构,所以我不能选择包装元素('.content')。 –

+0

好吧,那么'container'使用你知道的最高元素。但是这可能会使查询在较大的文档中变慢。 – colecmc

1

//first select the container 
 
var container = document.body, 
 
    //then all nodes 
 
    elems = container.getElementsByTagName("*"), 
 
    len = elems.length, 
 
    elem, 
 
    elemText, 
 
    i, 
 
    //we assign unnecessary elements 
 
    unwanted = ["script", "images", "imput"]; 
 
//a normal loop 
 
for(i=0;i<len;i+=1){ 
 
    elem = elems[i]; 
 
    //pay attention here 
 
    //if the element does not have children it means that it will only contain text 
 
    if(unwanted.indexOf(elem.nodeName.toLowerCase())=="-1"){ 
 
    if(!elem.children.length){ 
 
     //you also have to check that the text exists 
 
     elemText = elem.innerText; 
 
     if(elemText){ 
 
     //and finally 
 
     console.log(elem, elemText); 
 
     } 
 
    } 
 
    } 
 
}
<div class="blog"> 
 
    <div class="image"></div> 
 
    <div class="content"> 
 
    <p class="text"> Some text </p> 
 
    <div class="date">23.12</div> 
 
    </div> 
 
</div>

+0

@VladimirHumeniuk不客气,我还添加了别的东西。 :) – AvrilAlejandro

0

下面是另一种方式(假设元素包含类textdate

var coll = document.querySelectorAll(".text, .date"); //Get HTML elements having class .text and .date 
 
var elements = [].slice.call(coll); //Convert to array 
 
elements.map(function(el,i) { console.log(el.innerHTML.trim()) }); //Display element innerHTML using `map` function
<div class="blog"> 
 
    <div class="image"></div> 
 
    <div class="content"> 
 
     <p class="text"> Some text </p> 
 
     <div class="date">23.12</div> 
 
    </div> 
 
</div>