深入学习jQuery选择器系列第五篇——过滤选择器之内容选择器

Posted 小火柴的蓝色理想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入学习jQuery选择器系列第五篇——过滤选择器之内容选择器相关的知识,希望对你有一定的参考价值。

前面的话

  本文介绍过滤选择器中的内容选择器。内容选择器的过滤规则主要体现在它所包含的子元素或文本内容上

 

:contains(text)

  :contains(text)选择器选择含有文本内容为‘text‘的元素,返回集合元素

//返回所有文本内容包含‘test‘的元素
$(‘:contains("test")‘)

//返回所有文本内容包含‘test‘的span元素
$(‘span:contains("test")‘)

  该选择器并没有对应的CSS选择器,如果使用javascript实现类似$(‘span:contains("test")‘).css(‘color‘,‘red‘)的效果

var spans = document.getElementsByTagName(‘span‘);
for(var i = 0; i < spans.length; i++){
    if(/test/.test(spans[i].innerhtml)){
        spans[i].style.color = ‘red‘;
    }
}

  [注意]如果:contains(text)选择器中的文本内容text包含在子元素中也可以,但是要小心使用

  【1】$(‘div span:contains("test")‘).css(‘color‘,‘blue‘)可以匹配<div><span><i>test</i></span></div>,但实际上匹配的是<span>元素,<i>元素由于是<span>元素的子元素,所以i元素的文本颜色变为蓝色

  【2】$(‘div :contains("test")‘).css(‘color‘,‘red‘)也可以匹配<div><span><i>test</i></span></div>,但直接匹配的是<i>元素,所以i元素的文本元素变为红色。如果两个选择器同时存在,则文本元素为红色。因为直接给元素设置颜色比通过父级继承颜色的优先级高

<button id="btn1" style="color: red;">$(‘div :contains("test")‘)</button>
<button id="btn2" style="color: blue;">$(‘div span:contains("test")‘)</button>
<button id="reset">还原</button>
<div>
    <span>test1</span>
    <span>test2</span>
    <span><i>test3</i></span>
    <i><span>test4</span></i>
    <i>test5</i>
    <i>1</i>
</div>
<script>
reset.onclick = function(){history.go();}
//对于test3,就是上面讨论的直接给元素设置颜色比通过父级继承颜色的优先级高的情况
btn1.onclick = function(){$(div :contains("test")).css(color,red);}  
btn2.onclick = function(){$(div span:contains("test")).css(color,blue);}  
</script> 

:empty

  :empty选择器选择不包含子元素或文本的空元素,返回集合元素

$(‘div :empty‘).css(‘color‘,‘red‘);

  对应的CSS选择器是:empty选择器,该选择器选择没有子元素的元素,而且该元素也不包含任何文本节点

:empty{color:red;}

  如果使用javascript实现类似效果

var divs = document.getElementsByTagName(‘div‘);
for(var i = 0; i < divs.length; i++){
    if(divs[i].innerHTML == ‘‘){
        divs[i].style.color = ‘red‘;
    }
}

 

:parent

  与:empty选择器正好相反,:parent选择器选择含有子元素或文本的元素,返回集合元素

$(‘div :parent‘).css(‘color‘,‘red‘);

  该选择器并没有对应的CSS选择器,如果使用javascript实现类似效果

var divs = document.getElementsByTagName(‘div‘);
for(var i = 0; i < divs.length; i++){
    if(divs[i].innerHTML != ‘‘){
        divs[i].style.color = ‘red‘;
    }
}  
<style> 
div div{height: 20px;width: 20px;}
</style>

<button id="btn1" style="color: red;">$(‘div :empty‘)</button>
<button id="btn2" style="color: blue;">$(‘div :parent‘)</button>
<button id="reset">还原</button>
<div>
    <div></div>
    <div>1</div>
    <div>2</div>
    <div>3</div>
</div>
<script>
reset.onclick = function(){history.go();}
btn1.onclick = function(){$(div :empty).css(backgroundColor,red);}  
btn2.onclick = function(){$(div :parent).css(backgroundColor,blue);}  
</script> 

:has(selector)

  :has(selector)选择器选择含有选择器所匹配的元素的父元素,返回集合元素

  [注意]该选择器匹配的实际上是父元素 

//选择拥有.test的子元素的父元素
$(:has(.test))

//选择拥有.test的子元素的父元素,且该父元素是div元素
$(div:has(.test))

  该选择器没有对应的CSS选择器,如果使用javascript实现类似$(div:has(.test)).css(‘color‘,‘red‘)的效果

var divs = document.getElementsByTagName(‘div‘);
for(var i = 0; i < divs.length; i++){
    var tags = divs[i].getElementsByTagName(‘*‘);
    for(var j = 0; j < tags.length; j++){
        if(tags[j].className == ‘test‘){
            divs[i].style.color = ‘red‘;
            break;
        }
    }
} 

 

:not(selector)

  :not(selector)选择器去除所有选择器所匹配的元素,返回集合元素

//选择去除.test后的所有span元素
$(span:not(.test))

//选择父元素为div元素下的去除.test后的所有span元素
$(div span:not(.test))
  该选择器没有对应的CSS选择器,如果使用javascript实现类似$(div span:not(.test)).css(‘color‘,‘red‘)的效果
var divs = document.getElementsByTagName(‘div‘);
for(var i = 0; i < divs.length; i++){
    var spans = divs[i].getElementsByTagName(‘span‘);
    for(var j = 0; j < spans.length; j++){
        if(spans[j].className != ‘test‘){
            divs[i].spans[j].style.color = ‘red‘;
        }
    }
}
<style> 
div{height: 40px;width: 30px;}
</style>

<button id="btn1" style="color: red;">$(‘div:has(.test)‘)</button>
<button id="btn2" style="color: blue;">$(‘span:has(.test)‘)</button>
<button id="btn3" style="color: green;">$(‘span:not(.test)‘)</button>
<button id="btn4" style="color: pink;">$(‘div:not(.test)‘)</button>
<button id="reset">还原</button>
<div>
    <span class="test">1.1</span>
    <span>1.2</span>
</div>
<div>
    <span>2.1</span>
    <span>2.2</span>
</div>
<script>
reset.onclick = function(){history.go();}
//选择含有.test子元素的div父元素,则第1个div的字体颜色变红
btn1.onclick = function(){$(div:has(.test)).css(backgroundColor,red);} 

//选择含有.test子元素的span父元素,结果span元素下并没有子元素,所以无变化
btn2.onclick = function(){$(span:has(.test)).css(backgroundColor,blue);}

//选择去除.test的span元素,则结果是1.2、2.1、2.2
btn3.onclick = function(){$(span:not(.test)).css(backgroundColor,green);} 

//选择 去除.test的div元素,由于两个div元素都没有.test,所以全部选中
btn4.onclick = function(){$(div:not(.test)).css(backgroundColor,pink);}  
</script> 

以上是关于深入学习jQuery选择器系列第五篇——过滤选择器之内容选择器的主要内容,如果未能解决你的问题,请参考以下文章

深入学习jQuery选择器系列第六篇——过滤选择器之状态选择器

深入学习jQuery选择器系列第八篇——过滤选择器之伪子元素选择器

深入学习 jQuery 选择器系列第三篇——过滤选择器之索引选择器 - 小火柴的蓝色理想 - 博客园

k8s系列第五篇~k8s资源对象-应用类资源对象

jquery学习记录二(过滤性选择器)

二次学习JQuery 选择器&选择集过滤&转移