目录
【前文回顾】👉 jQuery概述及jQuery的原理_01

本文对jQuery中常用的元素查找方法进行了全面详细的总结和介绍,过万字的梳理,倾情奉献给大家,需要的朋友可以参考收藏,并订阅我的jQuery专栏,后续会持续更新!
jQuery中支持使用CSS选择器查找元素。并且扩展了一些css没有,但是jquery中独有的新选择器。
(1). 回顾子元素过滤选择器: (css中的)
a. 什么是: 根据元素在其父元素内的相对下标位置来选择子元素。
b. 包括:
1). :first-child : 选择作为其所在的父元素下的第一个孩子的子元素。
2). :last-child : 选择作为其所在的父元素下的最后一个孩子的子元素。
3). :nth-child(i) : 选择作为其所在的父元素下的第i个孩子的子元素。i从1开始!
4). :only-child : 选择作为其所在的父元素下的唯一一个子元素的元素。
❗ 关于子元素过滤选择器的补充说明
由于可能有多个父元素,所以1). 2). 3).4)都可能有多个first-child、last-child、nth-child(i)、:only-child
c. 示例:使用子元素过滤选择并修改指定元素:
5_child filter.html
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8" />
- <title></title>
- </head>
- <body>
- <h3>子元素过滤选择器.</h3>
- <ul>
- <li>child1-basic0</li>
- <li>child2-basic1</li>
- <li>child3-basic2</li>
- </ul>
- <ul>
- <li>child1-basic3</li>
- <li>child2-basic4</li>
- <li>child3-basic5</li>
- </ul>
- <ul>
- <li>child1-basic6</li>
- </ul>
- <script src="js/jquery-1.11.3.js"></script>
- <script>
- //查找每个ul中第一个li
- $("ul>li:first-child")
- .css("border","2px solid red");
- //相当于.style.border="2px solid red";
- //查找每个ul中最后一个li
- $("ul>li:last-child")
- .css("color","green");
- //查找每个ul中处于偶数位置的
- $("ul>li:nth-child(2n)")
- .css("box-shadow","0 0 5px blue")
- //查找每个ul中第2个li
- $("ul>li:nth-child(2)")
- .css("background-color","yellow")
- //查找作为ul下唯一子元素的li
- $("ul>li:only-child")
- .css("font-size","32px")
- </script>
- </body>
- </html>
运行结果:
(2). 基本过滤选择器: (jq新增,css中没有)
a. 什么是: 先将所有符合条件的元素集中保存在一个大的集合中,统一编号!然后,再按照元素在集合中的大排名,选择元素!
b. 包括:
1). :first 选择所有符合要求的元素中第一个元素
2). :last 选择所有符合要求的元素中最后一个元素
3). :even 选择所有符合要求的元素中下标位置为偶数的元素
4). :odd 选择所有符合要求的元素中下标位置为奇数的元素
5). :eq(i) eq是equal(等于)的简写。选择所有符合要求的元素中下标等于i位置的元素
6). :gt(i) gt是greater than(大于)的简写。选择所有符合要求的元素中下标>i位置的所有元素
7). :lt(i) lt是less than(小于)的缩写。选择所有符合要求的元素中下标<i位置的所有元素
c. 强调:
1). 因为jq中新增的选择器,底层是用js程序模拟的。所以,jq新增的选择器的下标都从0开始!
2). :even虽然表示偶数位置的意思,但是,因为下标从0开始,实际选择的是正常人眼里的奇数位置的元素; :odd虽然表示奇数位置的意思,但是因为下标从0开始,实际选择的是正常人眼里的偶数位置的元素

d. 示例:使用基本过滤选择并修改元素
6_basic filter.html
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8" />
- <title></title>
- </head>
- <body>
- <h3>基本过滤选择器.</h3>
- <ul>
- <li>child1-basic0</li>
- <li>child2-basic1</li>
- <li>child3-basic2</li>
- </ul>
- <ul>
- <li>child1-basic3</li>
- <li>child2-basic4</li>
- <li>child3-basic5</li>
- </ul>
- <ul>
- <li>child1-basic6</li>
- </ul>
- <script src="js/jquery-1.11.3.js"></script>
- <script>
- //查找第一个li
- $("ul>li:first").css("border", "2px solid red")
- //查找最后一个li
- $("ul>li:last").css("color", "green");
- //查找处于偶数(用户视角)位置的li
- $("ul>li:odd").css("box-shadow", "0 0 5px blue");
- //查找第2个(用户视角)li
- $("ul>li:eq(1)").css("background-color", "yellow");
- </script>
- </body>
- </html>
运行结果:
(3). 示例: 按钮组效果:
7_basic filter2.html
- <!DOCTYPE html>
- <html>
-
- <head>
- <meta charset="utf-8" />
- <title>...</title>
- <style>
- ul{
- list-style:none
- }
- ul>li{
- float:left;
- border:1px solid #aaa;
- padding:5px 10px;
- }
- /*用纯css实现按钮组效果*/
- /*第一个li左上,左下变圆角*/
- /* ul>li:first-child{
- border-radius:5px 0 0 5px
- } */
- /*最后一个li右上, 右下变圆角*/
- /* ul>li:last-child{
- border-radius:0 5px 5px 0
- } */
- /*将第一li之后所有兄弟去掉左边框*/
- /* ul>li~li{
- border-left:0
- } */
-
- </style>
- <script src="js/jquery-1.11.3.js"></script>
- </head>
- <body>
- <h1>实现按钮组效果</h1>
- <ul>
- <li>1</li>
- <li>2</li>
- <li>3</li>
- <li>4</li>
- </ul>
- <script>
- /*用js实现按钮组效果*/
- /*第一个li左上,左下变圆角*/
- $("ul>li:first").css("border-radius","5px 0 0 5px");
- /*最后一个li右上, 右下变圆角*/
- $("ul>li:last").css("border-radius","0 5px 5px 0");
- /*将第一li之后所有兄弟去掉左边框*/
- $("ul>li:gt(0)").css("border-left",0)
- </script>
- </body>
- </html>
运行结果:
(4). 示例: 实现表格隔行变色效果:
7_basic filter3.html
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8" />
- <title>...</title>
- <style>
- table {
- width: 400px;
- border-collapse: collapse;
- text-align: center;
- }
- table > thead {
- border-bottom: 3px solid #aaa;
- }
- /*表格隔行变色效果*/
- /*tbody中第一行之后的所有兄弟行加上边框*/
- /* tbody>tr~tr{
- border-top:1px solid gray
- } */
- /*偶数行变色*/
- /* tbody>tr:nth-child(2n){
- background-color:lightBlue;
- } */
- </style>
- <script src="js/jquery-1.11.3.js"></script>
- </head>
-
- <body>
- <h1>实现表格隔行变色效果</h1>
- <!--table>(thead>tr>th*4)+(tbody>tr*4>td*4)-->
- <table>
- <thead>
- <tr>
- <th>#</th>
- <th>First Name</th>
- <th>Last Name</th>
- <th>User Name</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>1</td>
- <td>亮</td>
- <td>成</td>
- <td>@liang</td>
- </tr>
- <tr>
- <td>2</td>
- <td>然</td>
- <td>李</td>
- <td>@ran</td>
- </tr>
- <tr>
- <td>3</td>
- <td>东</td>
- <td>张</td>
- <td>@dong</td>
- </tr>
- <tr>
- <td>4</td>
- <td>华</td>
- <td>吴</td>
- <td>@hua</td>
- </tr>
- </tbody>
- </table>
- <script>
- /*表格隔行变色效果*/
- /*tbody中第一行之后的所有兄弟行加上边框*/
- $("tbody>tr:gt(0)").css("border-top", "1px solid gray");
- /*偶数行变色*/
- $("tbody>tr:odd").css("background-color", "lightBlue");
- </script>
- </body>
- </html>
运行结果:
(5). 总结: 如果今后一个效果既可以用css来实现,又可以用js来实现,首选css。
a. css的效率远比js高的多!
b. css的一致性很好!现在写好的css,将来到框架中,复制粘贴过去,直接可用!几乎不用修改!而现在写的js代码,将来到了框架中,几乎都要重新编写!
🆕 css中没有,jq新增的
(1). 什么是: 根据元素的内容中的关键词或子元素特征来选择元素。
(2). 包括:
a. :contains(文本) 选择元素内容中包含指定文本的元素
b. :has(选择器) 选择包含符合要求的子元素的父元素
c. :parent 选择内容非空的元素
d. :empty 选择内容为空的元素
(3). 示例: 使用内容过滤选择器选择元素并修改元素
10_content filter.html
- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8" />
- <title></title>
- <link rel="stylesheet" href="css/bootstrap.css" />
- <style></style>
- </head>
- <body>
- <div class="container">
- <h1>jQuery中的选择器——内容过滤选择器</h1>
-
- <button>提交订单</button>
- <button>Submit注册信息</button>
- <button>马上提交</button>
- <button>清空重填</button>
-
- <hr />
- <div class="alert" id="alert1"></div>
- <div class="alert" id="alert2">
- <span class="close">×</span>
- </div>
- </div>
- <script src="js/jquery-1.11.3.js"></script>
- <script>
- //选择包含"提交"二字的按钮,变为绿色按钮
- $("button:contains(提交)").css("background-color", "lightGreen");
- //选中包含.close按钮的.alert元素,让它们变为红色的警告框
- $(".alert:has(.close)").css("background-color", "pink");
- //选中不包含.close按钮的.alert元素,让它们变为绿色的警告框
- $(".alert:not(:has(.close))").css("background-color", "lightGreen");
- //选择内容为空的.alert元素,添加红色阴影
- $(".alert:empty").css("box-shadow", "0 0 5px red");
- //选择内容不为空的.alert元素,添加绿色阴影
- $(".alert:parent").css("box-shadow", "0 0 5px green");
- </script>
- </body>
- </html>
运行结果:
(1). 什么是: 根据元素是否隐藏来选择隐藏的元素
(2). 包括:
a. :visible 专门选择可见的元素
b. :hidden 专门选择不可见的元素
(3). 坑: HTML+CSS中要隐藏一个元素有四种办法:
a. display:none
b. opacity:0
c. visibility:hidden
d. <input type="hidden">
但是,:hidden只能选择其中2种: display:none和<input type="hidden">
12_visibility filter
- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8">
- <title></title>
- <link rel="stylesheet" href="css/bootstrap.css"/>
- <style>
- </style>
- </head>
- <body>
- <div class="container">
- <h1>可见性选择器</h1>
-
- <div id="d1" style="display: none">lorem</div>
- <div id="d2" style="visibility: hidden">lorem</div>
- <div id="d3" style="opacity: 0">lorem</div>
- <input id="d4" type="hidden" name="aa" value="bb"/>
-
- </div>
- <script src="js/jquery-1.11.3.js"></script>
- <script>
- //获得class为container的父元素下的隐藏的元素
- // :hidden只能选择其中2种: display:none和<input type="hidden">
- // 所以,f12 控制台里只有2个 0: div#d1 1: input#d4
- console.log( $(".container>:hidden") )
- </script>
- </body>
- </html>
运行结果:
👉 :hidden只能选择获取其中2种: display:none和<input type="hidden">
👉 从下图可见, 1️⃣display:none和2️⃣<input type="hidden">让元素隐藏且不占页面位置,而3️⃣opacity:0设置元素全透明隐藏、4️⃣visibility: hidden设置元素隐藏,这2个元素属性虽然可让元素隐藏,但仍然在页面占位置
(1). :input 专门选择一个表单中的所有表单元素(input, select, textarea, button)
vs input 是css中的普通的元素选择器,只能选择input元素
(2). 问题: 仅仅是input元素就有很多种!如何精确的选择某一类input元素呢?
(3). 解决: jq中为每种input的type属性值都提供了一个专门的选择器
a. :text 专门选择普通文本框<input type="text">
b. :radio 专门选择所有单选按钮<input type="radio">
c. :button 专门选择所有input按钮<input type="button">
... HTML中<input>元素有几种type值,jq就新增了几种对应选择器 ...
(4). 示例: 使用表单元素过滤选择器实现点同意才启用元素效果
13_form state selector.html
- <!DOCTYPE html>
- <html>
- <head>
- <title>.....</title>
- <meta charset="utf-8"/>
- <style>
- </style>
- </head>
- <body>
- <form>
- 用户名:<input disabled></br><span>*</span>
- 密码:<input type="password" disabled></br><span>*</span>
- <input type="checkbox">我同意本站的使用条款<br>
- <input type="submit" value="提交注册信息" disabled/>
- </form>
- <script src="js/jquery-1.11.3.js"></script>
- <script>
- //DOM 4步
- //1. 查找触发事件的元素
- //本例中:用户点type=checkbox的复选框触发变化
- var $chb=$(":checkbox")
- //2. 绑定事件处理函数
- $chb.click(function(){
- //3. 查找要修改的元素
- //本例中: 选择除了:checkbox之外的其余表单元素
- var $others=$(":input:not(:checkbox)")
- //4. 修改元素
- //如果当前checkbox被选中时
- if(this.checked==true){
- //其它元素启用: disabled=false
- //jq中修改标准属性,都可用.prop()代替DOM中的.操作!
- $others.prop("disabled",false);
- }else{//否则如果当前checkbox未选中
- //其它元素禁用: disabled=true
- $others.prop("disabled",true);
- }
-
- //结论: 其它元素的disabled属性和当前checkbox的checked属性是相反的!
- //$others.prop("disabled",!this.checked)
- })
- </script>
- </body>
- </html>
运行结果:
(1). 父子关系
a. 元素.parentElement
b. 元素.children
c. 元素.firstElementChild
d. 元素.lastElementChild
(2). 兄弟关系
a. 元素.previousElementSibling
b. 元素.nextElementSibling
(1). 父子关系: 3个函数
a. 获得一个元素的父元素: $元素.parent()
b. 获得一个元素的所有直接子元素:
1). $元素.children("选择器")
2). 增强版:
i. 加选择器,就只获得符合条件的子元素
ii. 不加选择器,默认获得所有直接子元素
3). 因为children可以加筛选条件了,所以就不再有专门的firstElementChild和lastElementChild
i. 获得元素下第一个直接子元素
$元素.children(":first-child")
ii. 获得元素下最后一个直接子元素
$元素.children(":last-child")
4). 问题: children只能在直接子元素中查找符合条件的元素。无法在所有后代中查找!
c. 新增了: 在当前元素所有后代中查找符合条件的元素。
$元素.find("选择器")
(2). 兄弟关系: 5个函数
a. 前一个兄弟: $元素.prev()
只能找前一个元素
b. 后一个兄弟: $元素.next()
只能找后一个元素
c. 之前所有兄弟: $元素.prevAll("选择器")
d. 之后所有兄弟: $元素.nextAll("选择器")

e. 选择除当前元素之外,其余所有兄弟:
$元素.siblings("选择器")

补:$元素.first()
想获得任意查找结果中第一个元素,即获取匹配元素集合中第一个元素。可用: .first()
这个方法不接受任何参数。
first() 方法返回被选元素的第一个元素。提示:如需返回最后一个元素,请使用 last() 方法。
注意:first()、last()跟基本过滤选择器一样,都是先将所有符合条件的元素集中保存在一个大的集合中,统一编号!然后,再按照元素在集合中的大排名,选择元素!
👉 更多参考资料:请移步jQuery官方关于 .first() 的介绍
以下示例,可以看出:⏬
first()跟:first实现的功能效果是一样的,2者等价,且都是先将所有符合条件的元素集中保存在一个大的集合中,统一编号!然后,再按照元素在集合中的大排名,选择元素!事例中,被选中的始终是li.item-1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title></title> <style> /* ul { list-style: none; } */ </style> </head> <body> <ul class="level-1"> <li class="item-i">I</li> <li class="item-ii"> II <ul class="level-2"> 不包括自己 <li class="item-a">A</li> <li class="item-b"> B <ul class="level-3"> <li class="item-1">1</li> <li class="item-2">2</li> <li class="item-3">3</li> </ul> </li> <li class="item-c">C</li> </ul> </li> <li class="item-iii">III</li> </ul> <script src="js/jquery-1.11.3.js"></script> <script> $('ul li').first().css('background-color','green'); // $('ul>li').first().css('background-color','red'); // $("ul li:first").css("background-color", "green"); // $("ul>li:first").css("background-color", "red"); </script> </body> </html>运行结果:
3. 示例: 使用节点间关系查找,选择指定的元素:
6_traverse.html
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8" />
- <title>...</title>
- <script></script>
- </head>
-
- <body>
- <!-- ul.top>(li.parent>ul>li.child*3)*2 -->
- <ul class="top">
- <li class="parent1">
- parent1
- <ul>
- <li class="child">child1</li>
- <li class="child">child2</li>
- <li class="child">child3</li>
- </ul>
- </li>
- <li class="parent2">
- parent2
- <ul>
- <li class="child">child1</li>
- <li class="child">child2</li>
- <li class="child">child3</li>
- </ul>
- </li>
- </ul>
- <script src="js/jquery-1.11.3.js"></script>
- <script>
- //修改class为top的ul的所有直接子元素
- $("ul.top").children().css("border", "1px solid red");
- //修改class为top的ul的所有后代li
- $("ul.top").find("li").css("box-shadow", "0 0 5px green");
- //为class为child的li绑定单击事件
- $("ul.top li.child").click(function () {
- //选择当前元素的下一个元素/前一个元素/之前所有/之后所有/除自己之外所有
- $(this)
- .siblings() //.nextAll()//.prevAll()//.prev()//.next()
- .css("background-color", "yellow");
- });
- </script>
- </body>
- </html>
运行结果:
4. 示例: 标签页
7_tabs.html
- <!doctype html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <style>
- .tabs{ list-style:none; padding:0 }
- .tabs a{
- text-decoration:none;
- color:#000;
- padding:6px 12px;
- display:inline-block;
- }
- .tabs>li{
- float:left;
- border-bottom:1px solid #000;
- }
- .tabs>.active{
- border:1px solid #000;
- border-bottom:0;
- }
- </style>
- </head>
- <body>
- <h1>使用属性选择器实现标签页头的切换</h1>
- <ul class="tabs">
- <li class="active">
- <a data-toggle="tab" href="#">十元套餐</a>
- </li>
- <li>
- <a data-toggle="tab" href="#">二十元套餐</a>
- </li>
- <li>
- <a data-toggle="tab" href="#">三十元套餐</a>
- </li>
- </ul>
- <script src="js/jquery-1.11.3.js"></script>
- <script>
- //DOM 4步
- //1. 查找触发事件的元素
- //本例中: 查找data-toggle属性为tab的元素
- // CSS知识点:属性选择器
- var $as=$("[data-toggle=tab]")
- //2. 绑定事件处理函数
- $as.click(function(){
- //3. 查找要修改的元素
- //4. 修改元素
- //给当前a元素的爹li加class active
- $(this).parent() //当前a的爹li
- .addClass("active")
- //return $(this).parent()
- //再给当前元素的爹li的所有兄弟标签去掉class active
- .siblings().removeClass("active");
- //链式操作!⏬⏫
- //绝大多数函数都会自动返回正在操作的.前的主语jq对象。如果后一句话所需的.前的主语,刚
- //好和前一句话返回的主语相同,则可以直接用.继续操作,不用把.前主语反复写2遍!——链式操作
- })
- </script>
- </body>
- </html>
运行结果:

1. 自带for循环
2. 一个函数两用
3. 绝大多数函数都会自动返回正在操作的.前的主语jq对象。如果后一句话所需的.前的主语,刚好和前一句话返回的主语相同,则可以直接用.继续操作,不用把.前主语反复写2遍!——链式操作。👉 链式操作具体示例——参看按节点间关系查找之示例7_tabs.html⏫
1. $("选择器") 查找DOM元素,并包装进jQuery对象中
2. $(DOM元素对象) 不用查找,直接将DOM元素包装进jQuery对象中
3. $(`HTML片段`) 创建新元素
4. $(function(){ ... }) 绑定DOMContentLoaded事件处理函数,在DOM内容加载后就自动提前执行!
1. 引入jQuery.js: 2种
(1). 引入项目本地jquery.js文件:
<script src="js/jquery-1.11.3.js">
(2). 引入CDN网络中共享的jquery.js文件:
<script src="官方提供的CDN上jquery.js文件地址">
2. 创建jQuery类型子对象: 2种
(1). 只有jQuery类型子对象才能使用jQuery家简化版函数。
DOM家元素对象无权直接使用jQuery家简化版函数。
所以只要使用jQuery家简化版函数,都要先创建jQuery家子对象,其中保存一个要操作的DOM元素对象。
(2). 如何:2种:
a. 查找DOM元素对象,并保存进新创建的jQuery对象中:
var $jq子对象=$("选择器")
b. 不查找,直接将DOM元素对象保存进新创建的jQuery对象中:
var $jq子对象=$(DOM元素对象)
3. 原理:
(1). $=jQuery=new jQuery
(2). jq子对象其实是一个类数组对象,可保存找到的多个DOM元素对象
(3). 对jq子对象调用简化版函数,会被自动翻译为对应的原生DOM的方法和属性。
所以jQuery中的所有简化版函数效果和DOM中原生方法和属性效果一样。
jQuery中的this、e、e.target等,和DOM中的完全一样!
4. jQuery简化版函数3大特点:
(1). 自带for循环: 对整个jquery子对象调用一次简化版函数,等效于对jQuery子对象中保存的每个DOM元素对象分别调用一次对等的DOM原生方法或属性——不用自己写for循环
(2). 一个函数两用: 调用函数时:
a. 没给新值作为参数,默认执行获取旧值的操作
b. 给了新值作为参数,自动切换为执行修改操作
(3). 多数函数都会返回正在操作的.前的主语jq对象——链式操作。
5. 查找元素: ⏬ 👇
(1). jQuery支持用所以CSS3选择器查找
(2). jQuery新增选择器: (css中不能用)
a. 基本过滤: (下标从0开始)
:first :last :eq(i) :lt(i) :gt(i) :even :odd
b. 内容过滤:
:contains(文本) :has(选择器) :parent :empty
c. 可见性过滤:
:visible :hidden(只能选择display:none和input type="hidden")
d. 表单元素过滤:
:input :text :password :radio :checkbox ... ...
(3).用节点间关系查找: 2大类关系, 8个函数
a. 父子关系:3个函数:
$元素.parent()
$元素.children("选择器")
$元素.find("选择器")
b. 兄弟关系:5个
$元素.prev()
$元素.prevAll("选择器")
$元素.next()
$元素.nextAll("选择器")
$元素.siblings("选择器")
如果这篇【文章】有帮助到你,希望可以给【青春木鱼】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【前端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️【青春木鱼】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!