2016-03-23 130 views
0

我正在编写一个脚本,用于选择从节元素下降的所有段落元素。我希望它排除具有标题标签的previousElementSibling的所有段落元素。根据previousElementSibling排除元素

脚本的工作部分,用我的测试console.logs是

var allParagraphs = document.querySelectorAll('section > p'); 
var firstParagraph = allParagraphs[0]; 

for (i=0; i < allParagraphs.length; i++) { 

    var prevElement = allParagraphs[i].previousElementSibling; 
    console.log(prevElement); 

    if (i !=0 && i != allParagraphs.length && i % 3 == 0) { 
     // Work Magic on the Paragraph Elements 
    } 
} 

我想,虽然做的是排除由标题元素之前,特别是任何段落元素。

当我运行上面的脚本时,我的console.log输出将正确列出一切。我不知道如何实际测试“”/“h3”/ etc的值。

我尝试使用其他一些属性,如.localName和.nodeName。在prevElement为空控制台

console.log(prevElement.localName); 
console.log(prevElement.nodeName); 

这两种结果的一个错误:当我添加那些的console.log。

我也尝试添加:

&& prevElement != '<h3'> 

到如果情况,看看是否奏效,以及“H3” /“H3”和他们都不一样。

有没有办法将h3 + p从最初的document.querySelectorAll中排除或在if/then条件中过滤出来?

注意:我不想在jQuery中这样做。

回答

2

有没有办法将h3 + p从最初的document.querySelectorAll中排除?

你可以使用选择

section > p:first-child, section > *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) + p 

...或将其过滤掉,如果/ then条件?

您与prevElement.nodeName != "h3"做法很好,但是你需要采取在他们的部分的第一个元素,并没有一个.previousElementSibling段落的照顾。只需测试prevElement == null || …

+0

你是如何到达那个长选择器?为什么'section> p:not(h3 + p)'不起作用? – Cedon

+0

@belinus:[':not'只允许简单的选择器](https://drafts.c​​sswg.org/selectors-3/#negation) - 我喜欢用':not(h1,h2,h3,... )'但它不起作用。选择器4草案放松了一下,但我认为它还没有实现。所以我只是把你的描述和字面翻译为选择器... – Bergi

+0

这是CSS vs JS的乐趣:P。 P:是第一个孩子需要还是可以选择第二部分? p是部分的第一个孩子。 – Cedon