JS学习十六:JQuery选择器

jQuery选择器,支持CSS语法,能够轻松快速地对页面进行设置。

jQuery选择器的语法格式:

$(selector).methodName();

selector是一个字符串表达式,用于识别DOM中的元素,使后使用jQuery提供的方法集合加以设置。

多个jQuery操作,可以以链的形式串起来,语法如下:

$(selector).method1().menthod2().method3();

JQ的$(selector) 相当于 原生JS的document.getElementBy....(selector) 

 

jQuery选择器的优势 :

  • 代码更简单:jQuery库中封装了大量可以直接通过选择器调用的方法或函数。比如,通过id获取元素节点,使用$('id值'),代替document.getElementById(“id值")函数;通过标签名称获取元素节点,使用$('tagName'),代替document.getElementByTagName("tagName")函数。
  • 支持CSS1到CSS3选择器
  • jQuery不需要你考虑主流浏览器的兼容性问题。

jQuery选择器分类:

基本选择器:包括id选择器、标签选择器、类名选择器、复合选择器、通配符选择器、ancestor descendant选择器等

层次选择器:parent > child选择器,prev + next选择器,prev - siblings选择器.........等

过滤选择器:内容过滤器、可见性过滤、表单对象的属性过滤器、子元素过滤器....等

属性选择器:[attribute]、[attribute=value]、[attribute!=value]、[attribute*=value].......等

表单选择器: :input,:button, :checkbox,:file,:hidden,:image.......等

 

下载jQuery脚本:https://jquery.com/

将下载好的jquery-3.3.1.min,放到项目的js目录下。

在项目的HTML文件中,引入jQuery:

<script src="js/jquery-3.3.1.min.js" type="text/javascript" charset="UTF-8"></script>

 

 

使用$(document).ready(func),代替window.onload(func):

    <body>
        <p>body content......</p>
        <script type="text/javascript">
            //ready():等所有页面加载完成后,才会执行此方法
            //相当于window.onload().但是多个window.onload()定义的函数会覆盖
            //ready(),定义多个ready函数,不会覆盖
            $(document).ready(function() {
                alert("end1")
            })
            $(document).ready(function() {
                alert("end2")
            })
            alter("body")
        </script>        
    </body>    

 

在之前的学习中,我们要获取DOM对象,通常通过document.get....获取DOM对象。如:

DOM对象:

var jsDiv1 = document.getElementById("id值")
var jsDiv2 = document.getElementsByTagName("标签的name属性值")
var jsDiv3 = document.getElementsByClassName("标签的class属性值")
var jsDiv4 = document.getAnonymousElementByAttribute("标签的属性值")

 

 

使用jQuery代替它们的语法:

jQuery对象:

var jsDiv1 = $("#id属性值")
var $jsDiv2 = $("标签")
var jsDiv3 = $(".class属性值")
var $jsDiv2 = $("[attribute=value]")

 

 

注意:DOM对象和jQuery对象,各自对应的方法,不可交叉使用。

将jQuery对象,转换成DOM对象:

    <body>
        <div id="box1"></div>
        <script type="text/javascript">
            //DOM对象
            var jsDiv = document.getElementById("box1")            
            //jQuery对象
            var $jqDiv = $("#box1").html("哈哈")
            //jq  --> dom 方式一:
            var jsDiv1 = $jqDiv[0]
            console.log($jqDiv)
            console.log(jsDiv1)        
            //jq  --> dom 方式二:
            var jsDiv2 = $jqDiv.get(0)
            console.log($jqDiv)
            console.log(jsDiv2)        
        </script>        
    </body>    

 

JQ对象,转成DOM对象:

            //jq  --> dom 方式一:
            var jsDiv1 = $jqDiv[0]    
            //jq  --> dom 方式二:
            var jsDiv2 = $jqDiv.get(0)

 

 将DOM对象,转换成jQ对象:

            // dom --> jQ:
            var $jqDiv1 = $(jsDiv)

 

 

一、基本选择器

1.jq的ID选择器:$("#id属性值"),如$("#box")

相当于dom的id选择器:document.getElementById("id属性值")

        <div id="box1"></div>
        <script type="text/javascript">
            //DOM对象
            var jsDiv = document.getElementById("box1")
            
            //jQuery对象
            var $jqDiv = $("#box1").html("哈哈")
        </script>   

 

.html(元素内容):设置元素内容,相当于dom的innerhtml =元素内容

 2.jq的元素选择器:$("标签名称"),如$("div")

相当于dom的元素选择器:document.getElementByTagName("标签名称")

示例:获取所在div标签

        <div id="box1"></div>
        <div id="box2"></div>
        <script type="text/javascript">
            var $jqDivs = $("div")
            //相当于
            var jsDivs = document.getElementsByTagName("div")
            console.log($jqDivs)
            console.log(jsDivs)
        </script>    

 

  

            var $jqDivs = $("div")
            var jsDivs = document.getElementsByTagName("div")
            //jq对象,可以一次性设置所有对象集中的元素内容
            $jqDivs.html("aaa")
            //dom对象,一次只可以设置一个元素的元素内容
            jsDivs[0].innerHTML = "bbbb"
            jsDivs[1].innerHTML = "bbbb"

 

3.jq的类名选择器:$(".class属性值")

相当于dom的document.getElementByClassName("class属性值")

    <body>
        <div id="box1" class="ap"></div>
        <div id="box2" class="ap"></div>
        <script type="text/javascript">
            var $jqDivs = $(".ap")
            var jsDivs = document.getElementsByClassName("ap")
            console.log($jqDivs)
            console.log(jsDivs)
            console.log($jqDivs == jsDivs)
        </script>        
    </body>    

4.jq的复合选择器:$("select1, select2, .....selectN"),如$("div,#box1, .ap"),并集。OR的关系。

相当于DOM的复合选择器.....

复合选择器:可以将多个选择器(可以是ID选择器,元素选择器或类名选择器)组合在一起,两个选择器之间使用逗号“,”分隔。只要符合其中的任何一个筛选条件,就会匹配,并集,返回的是一个集合形式的JQ包装集。

    <body>
        <div id="box1" class="ap"></div>
        <div id="box2" class="ap"></div>
        <p></p>
        <script type="text/javascript">
            var $jqObj = $(".ap,p") //类名为ap,标签为p的元素
            $jqObj.html("abc")
        </script>        
    </body>    

 

5.jq的通配符选择器: $(“*”)

 

二、层次选择器

1.后代选择器: ancestor descendant选择器:$("ancestor descendant"),如$("ul li")匹配ul元素下的所有li元素

ancestor:是指任何有效的选择器。

descendant:是用以匹配元素的选择器,并且它是ancestor所指定元素的后代元素。

 

同CSS的后代选择器。

        <div id="box3">
            <p>abc</p>
            <div>
                <p>123</p>
            </div>
        </div>
        <script type="text/javascript">
            var $jqObj = $("#box3 p") //div选择器下面的所有p元素
            $jqObj.html("html.......")
        </script>

 

2.父子选择器:parent>child选择器:$("parent>child")

parent:是指任何有效的选择器。

child:是用以匹配元素的选择器,并且它是parent元素的直接子元素。

如:$("form>inpu"),匹配表单中所有的子元素input。

同CSS的父子选择器。

        <div id="box3">
            <p>abc</p>
            <div>
                <p>123</p>
            </div>
        </div>
        <script type="text/javascript">
            var $jqObj = $("#box3>p") //div选择器下面的直接子元素p元素
            $jqObj.html("html.......")
        </script>    

 

 

3. prev + next选择器:$("prev + next"),同级紧接着的元素。

用于匹配所有紧接在prev元素后的next元素。其中,prev和next是同级元素。

prev:是指任何有效的选择器。

next:是一个有效选择器,并且紧接着prev选择器的同级元素。

如:$("div + img"),匹配idv标记后的img标记。

        <div id="box1" class="ap">d1<div></div></div>
        <div class="ap"></div>
        <div id="box2" class="ap">d2</div>
        <script type="text/javascript">
            //第三个div,通过元素,id,class都不能唯一选中.此时使用 prev + next可以唯一选中
            var $jqObj = $("#box1 + div").html("second....") //第三个div
        </script>

  

4.同辈选择器:prev ~ siblings选择器:$("prev ~ siblings")

prev ~ sibling:用于匹配prev元素之后的所有sibling元素,它们是同辈元素。

prev:是指任何有效的选择器。

siblings:是一个有效选择器,并且是prev的同辈的所有选择器。

如$("div ~ ul"),匹配div元素后面的同辈所有ul元素。

        <div id="box1" class="ap">d1<div>sd</div></div>
        <div class="ap"></div>
        <div id="box2" class="ap">d2</div>
        <p></p>
        <div id="box3">
            <p>abc</p>
            <div>
                <p>123</p>
            </div>
        </div>
        <script type="text/javascript">
            //#box1后面的所有同辈div
            var $jqObj = $("#box1 ~ div").html("second....")
        </script>        
    </body>    

 

 

三、简单过滤器

 简单过滤器:是指以冒号开头,通常用于实现简单过滤效果的过滤器。

:first:匹配找到的第一个元素,它是与选择器结合使用的。

如$("tr:first"),匹配表格的第一行

        <p class="pp">aaaa</p>
        <p class="pp">bbbb</p>
        <p class="pp">cccccc</p>
        <script type="text/javascript">
            var $jqObj = $(".pp:first").html("here......")
        </script>    

 

:last:匹配找到的最后一个元素,它是与选择器结合使用的。

如$("tr:last"),匹配表格的最后一行

        <p class="pp">aaaa</p>
        <p class="pp">bbbb</p>
        <p class="pp">cccccc</p>
        <p class="pp">dddd</p>
        <script type="text/javascript">
            var $jqObj = $(".pp:last").html("here......")
        </script>    

 

:even:匹配所有索引值为偶数的元素,索引值从0开始计算

如$("tr:even"),匹配索引值为偶数的表格行

        <p class="pp">aaaa</p>
        <p class="pp">bbbb</p>
        <p class="pp">cccccc</p>
        <p class="pp">dddd</p>
        <script type="text/javascript">
            //为偶数行的p标签,添加类
            var $jqObj = $(".pp:even").addClass("app")
            //移除类
            $jqObj.removeClass("app")
        </script>    

 

:odd:匹配所有索引值为奇数的元素,以索引为标准的奇偶数,索引从0开始。

如$("tr:odd"),匹配索引值为奇数的表格行

:eq(index):匹配一个给定索引值 的元素

如$("div:eq(1)),匹配第二个div元素。

        <p class="pp">aaaa</p>
        <p class="pp">bbbb</p>
        <p class="pp">cccccc</p>
        <p class="pp">dddd</p>
        <script type="text/javascript">
            var $jqObj = $(".pp:eq(1)").html("here")
        </script>

 

:gt(index):匹配所有大于给定索引值的元素

        <p class="pp">aaaa</p>
        <p class="pp">bbbb</p>
        <p class="pp">cccccc</p>
        <p class="pp">dddd</p>
        <script type="text/javascript">
            var $jqObj = $(".pp:gt(1)").addClass("aap")
        </script>    
.aap {
    background-color: darkmagenta;
}

 

:lt(index):匹配所有小于给定索引值的元素

:header:匹配如h1,h2,h3....之类的标题元素

        <h1 class="pp">h1...</h1>
        <h2>h2...</h2>
        <script type="text/javascript">
            var $jqObj = $(".pp:header").addClass("aap")
        </script>

 

如果是$(":header"),匹配所有h标签

:not(selector):去除所有与给定选择器匹配的元素

如$("input:not(:checked)):匹配没有选中的input元素

示例:class属性不是pp的所有p标签

        <p class="pp">aaaa</p>
        <p class="pp">bbbb</p>
        <p>cccccc</p>
        <p class="pp">dddd</p>
        <script type="text/javascript">
            var $jqObj = $("p:not(.pp)").addClass("aap")
        </script>

 

:animated:匹配所有正在执行动画效果的元素

如$("div:animated"),匹配正在执行动画的div元素。

 

简单过滤器,示例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script type="text/javascript" src="js/jquery-3.3.1.min.js" charset="UTF-8"></script>
        <style type="text/css">
            td {
                font-size: 12px;
                padding: 3px;
            }
            .th {
                background-color: #B6DF48;
                font-weight: bold;
                text-align: center;
            }
            .even {
                background-color: #E8F3D1;
            }
            .odd {
                background-color: #F9FCEF;
            }
        </style>
    <body>
        <table width="98%" border="0" align="center"
         cellpadding="0" cellspacing="1" bgcolor="#3F873B">
            <tr>
                <td width="11%" height="27">编号</td>
                <td width="14%">祝福对象</td>
                <td width="12%">祝福者</td>
                <td width="33%">字条内容</td>
                <td width="30%">发送时间</td>
            </tr>
            <tr>
                <td height="27">1</td>
                <td>琦琦</td>
                <td>妈妈</td>
                <td>愿你健康快乐的成长</td>
                <td>2014-08-15 13:06:06</td>
            </tr>
            <tr>
                <td height="27">1</td>
                <td>wgh</td>
                <td>无语</td>
                <td>每天好心情!</td>
                <td>2014-08-15 13:26:36</td>
            </tr>
            <tr>
                <td height="27">1</td>
                <td>无语</td>
                <td>有语</td>
                <td>愿你健康快乐的成长愿你健康快乐的成长愿你健康快乐的成长</td>
                <td>2014-08-15 13:06:06</td>
            </tr>
            <tr>
                <td height="27">1</td>
                <td>熊熊</td>
                <td>奶奶</td>
                <td>乖乖</td>
                <td>2014-08-15 16:08:06</td>
            </tr>
        </table>
        <script type="text/javascript">
            $(document).ready(function(){
                $("tr:even").addClass("even");
                $("tr:odd").addClass("odd");
                $("tr:first").removeClass("even");
                $("tr:first").addClass("th");
            })
        </script>        
    </body>    
</html>

 

四、内容过滤器

内容过滤器:就是通过DOM元素包含的文本内容以及是否含有匹配的元素进行筛选。

:contains(text):匹配包含给定文本的元素。如$("li:contains('word')"),匹配含有word文本内容的li元素

        <p class="pp">aaaa</p>
        <p class="pp">bbnicebb</p>
        <p class="pp">cccccc</p>
        <p class="pp">dddd</p>
        <script type="text/javascript">
            //文本含有"nice"的所有p标签
            var $jqObj = $("p:contains('nice')").html("here......")
        </script>  

 

:empty:匹配所有不包含文本的空元素,包括子元素中也是空文本的子元素。如,$("td:empty"),匹配不包含子元素或文本的单元格。

        <p class="pp">aaaa</p>
        <p class="pp">bbnicebb</p>
        <p class="pp"></p>
        <p class="pp"><h1></h1></p>
        <script type="text/javascript">
            //不包含文本或子元素的所有p标签
            var $jqObj = $("p:empty").html("here......")
        </script>  

 

:has(selector):匹配含 有选择器所匹配元素的元素。如,$("td:has(p)"),匹配表格的单元格中,含有p标签的单元格

:parent:匹配含 有子元素或文本的元素。如,$("td:parent"),匹配不为空的单元格,即在该单元格中含有子元素或文本。

        <p class="pp">aaaa</p>
        <p class="pp">bbnicebb</p>
        <p class="pp"></p>
        <p class="pp"><h1>h1...</h1></p>
        <p class="pp" id="pid">pppid</p>
        <script type="text/javascript">
            //input标签中,class属性为aa的
            var $jqObj = $("p:parent").addClass("aap")
        </script>   

 

五、可见性过滤器

元素的可见状态有两种,分别是隐藏状态和显示状态。

可见性过滤器:就是利用元素的可见状态匹配。

:visible:匹配所有可见元素

:hidden:匹配所有不可见元素。

注意:在应用hidden过滤器时,display属性是none以及input元素的type属性为hidden的元素都会被匹配到。

        <input type="text" value="this is..."/>
        <input type="hidden" value=""/>
        <input type="text" value="" style="display: none;"/>
        <script type="text/javascript">
            var $jqObj = $("input:hidden")
            // console.log($jqObj)
            //可见的input
            var $jqObj1 = $("input:visible")
            console.log($jqObj1)
            //可见的input的值
            console.log($jqObj1.val())
        </script>        

 

val赋值,可以给所有jq集合的所有匹配的input赋值。val取值,只能取第一个匹配的input的值。

        <input type="text" value="this is..."/>
        <input type="text" value="aaa"/>
        <input type="hidden" value=""/>
        <input type="text" value="" style="display: none;"/>
        <script type="text/javascript">
        var $jqObj2 = $("input:visible:last")
        console.log(.val())
        </script>   

 

六、表单对象的属性过滤器

表单对象的属性过滤器:通过表单元素的状态属性(例如选中、不可用等状态),匹配元素。

:checked,匹配所有选中的被选中元素。如,$("input:checked"),匹配所有被选中的input元素。

:disabled,匹配所有不可用元素。如,$("input:disabled"),匹配所有不可用的input元素。

:enabled,匹配所有可用的元素。如,$("input:enabled"),匹配所有可用的input元素。

:selected,匹配所有选中的option元素。如,$("select option:selected"),匹配所有被选中的选项元素。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script type="text/javascript" src="js/jquery-3.3.1.min.js" charset="UTF-8"></script>
        <style type="text/css">
            .aap {
                background-color: #0000FF;
            }
        </style>
    <body>
        <form>
            <!-- checked属性,使input输入框默认被选中 -->
            复选框1:<input type="checkbox" checked="checked", value="复选框1"/>
            复选框2:<input type="checkbox" checked="checked", value="复选框2"/>
            复选框3:<input type="checkbox" alue="复选框3"/>
            <br />
            <!-- 属性disabled,使input输入框不可用 -->
            不可用按钮:<input type="button" value="不可用按钮" disabled />
            不可用按钮:<input type="button" value="不可用按钮" disabled="disabled" />
            <br />
            下拉列表框:
            <select onchange="selectVal()">
                <option value ="列表项1">列表项1</option>
                <option value ="列表项2">列表项2</option>
                <option value ="列表项3">列表项3</option>
            </select>
        </form>
        <script type="text/javascript">
            function selectVal(){
                console.log("**********")
                console.log($("select option:selected").val())
            }
                        
            // 找到选中的复选框
            var $jqObj = $("input:checked")
            console.log($jqObj)
            // 找到不可用的input输入框
            var $jqObj1 = $("input:disabled")
            console.log($jqObj1)            
        </script>
    </body>    
</html>

 

七、子元素过滤器

子元素过滤器:就是筛选给定某个元素的子元素,具体的过滤条件由选择器的种类而定。

:first-child,匹配所有给定元素的第一个子元素。如,$("ul li:first-child"),匹配ul元素中的第一个子元素。

:last-child,匹配所有给定元素的最后一个子元素。如,$("ul li:last-child"),匹配ul元素中的最后一个子元素。

:only-child,如果某个元素是它父元素中唯个的子元素,那么将匹配。如果父元素中含 有其它元素,则不会被匹配。

如,$("ul li:only-child"),匹配只含 一个li元素的ul元素中的li

:nth-child(index/even/odd/equation),匹配每个父元素下的第几个子元素,或奇偶子元素,index从0开始。

如,$("ul li:nth-child(even)"),匹配ul中索引值为偶数的li元素。

如,$("ul li:nth-child(3)"),匹配ul中第3个li元素。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script type="text/javascript" src="js/jquery-3.3.1.min.js" charset="UTF-8"></script>
        <style type="text/css">
            .aap {
                background-color: #0000FF;
            }
        </style>
    <body>
        <div id="box4">
            <p>aaaaa</p>
            <p>bbbb</p>
            <p>ccc</p>
            <p>dddd</p>
            <p>eee</p>
        </div>
        <ul>
            <li><a>1</a></li>
            <li><a>2</a></li>
            <li>3</li>
        </ul>
        <script type="text/javascript">
            //找到box4下的第一个子元素p
            //这样不行:w.fn.init [div#box4, prevObject: w.fn.init(1)]
            var $jqObj = $("#box4:first-child")
            console.log($jqObj)
            //这样ok:w.fn.init [p, prevObject: w.fn.init(1)]
            var $jqObj = $("#box4 p:first")
            console.log($jqObj)
            // 这样匹配不了,除非ul下的只有一个li
            var $jqObj1 = $("ul li:only-child")
            console.log($jqObj1)
            
            var $jqObj2 = $("ul li:nth-child(2)")
        </script>
    </body>    
</html>

 

八、属性选择器

属性选择器:就是通过元素的属性,作为过滤条件进行筛选对象

[attribute],匹配包含给定属性的元素。如,$("div[name]"),匹配含 有name属性的div元素。

[attribute=value],匹配属性值为value的元素。如,$("div[name='test']"),匹配name属性值为test的div元素。

[attribute!=value],匹配属性值不为value的元素。如,$("div[name!='test']"),匹配name属性值不为test的div元素。

[attribute*=value],匹配属性值含 有value的元素。如,$("div[name*='test']"),匹配name属性什中含有test的div元素。

[attribute^=value],匹配属性值以value开始的元素。如,$("div[name^='test']"),匹配name属性值以test开头的div元素。

[attribute$=value],匹配属性值以value结尾的元素。如,$("div[name$='test']"),匹配name属性值以test结尾的div元素。

[selector1][selector2][selector3],复合属性选择器,交集。需要同时满足多个条件时,才匹配。

如,$("div[id][name^='test']"),匹配具有id属性,name属性以test开头的div元素。

 

九、选择器使用的注意事项

1.选择器中含有特殊符号的注意事项:

w3c规定,属性值中不能包含:“.","#","(",")"等特殊字符。如果有的话,使用\\转义。

jq1.3.1以前,属性前要加@,jq1.3.1以后,不需要在属性前加@

 

2.选择器中含 有空格的注意事项:多一个空格或少一个空格,得到的选择器结果也是不同的。

 

posted on 2018-11-24 10:08  myworldworld  阅读(475)  评论(0)    收藏  举报

导航