首页 > 代码库 > 深入学习jQuery选择器系列第五篇——过滤选择器之内容选择器
深入学习jQuery选择器系列第五篇——过滤选择器之内容选择器
目录
[1]contains [2]empty [3]parent[4]has[5]not前面的话
本文介绍过滤选择器中的内容选择器。内容选择器的过滤规则主要体现在它所包含的子元素或文本内容上
: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>
<iframe style="width: 100%; height: 60px;" src="http://sandbox.runjs.cn/show/cxqag8ji" frameborder="0" width="320" height="240"></iframe>
: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>
<iframe style="width: 100%; height: 130px;" src="http://sandbox.runjs.cn/show/a8of2e8v" frameborder="0" width="320" height="240"></iframe>
: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))
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.2btn3.onclick = function(){$(‘span:not(.test)‘).css(‘backgroundColor‘,‘green‘);} //选择 去除.test的div元素,由于两个div元素都没有.test,所以全部选中btn4.onclick = function(){$(‘div:not(.test)‘).css(‘backgroundColor‘,‘pink‘);} </script>
<iframe style="line-height: 1.5; width: 100%; height: 130px;" src="http://sandbox.runjs.cn/show/eacj1ayf" frameborder="0" width="320" height="240"></iframe>
<script type="text/javascript">// 0){ return; } if(select[i].getBoundingClientRect().top <= 0 && select[i+1]){ if(select[i+1].getBoundingClientRect().top > 0){ change(oCon.children[i+2]) } }else{ change(oCon.children[select.length+1]) } }}document.body.onmousewheel = wheel;document.body.addEventListener(‘DOMMouseScroll‘,wheel,false);var oCon = document.getElementById("content");var close = oCon.getElementsByTagName(‘span‘)[0];close.onclick = function(){ if(this.innerHTML == ‘显示目录‘){ this.innerHTML = ‘ב; this.style.background = ‘‘; oCon.style.border = ‘2px solid #ccc‘; oCon.style.width = ‘‘; oCon.style.height = ‘‘; oCon.style.overflow = ‘‘; oCon.style.lineHeight = ‘30px‘; }else{ this.innerHTML = ‘显示目录‘; this.style.background = ‘#3399ff‘; oCon.style.border = ‘none‘; oCon.style.width = ‘60px‘; oCon.style.height = ‘30px‘; oCon.style.overflow = ‘hidden‘; oCon.style.lineHeight = ‘‘; }}for(var i = 2; i < oCon.children.length; i++){ oCon.children[i].onmouseover = function(){ this.style.color = ‘#3399ff‘; } oCon.children[i].onmouseout = function(){ this.style.color = ‘inherit‘; if(this.mark){ this.style.color = ‘#3399ff‘; } } oCon.children[i].onclick = function(){ change(this); } }function change(_this){ for(var i = 2; i < oCon.children.length; i++){ oCon.children[i].mark = false; oCon.children[i].style.color = ‘inherit‘; oCon.children[i].style.textDecoration = ‘none‘; oCon.children[i].style.borderColor = ‘transparent‘; } _this.mark = true; _this.style.color = ‘#3399ff‘; _this.style.textDecoration = ‘underline‘; _this.style.borderColor = ‘#2175bc‘; }// ]]></script>深入学习jQuery选择器系列第五篇——过滤选择器之内容选择器