常规选择器——进阶选择器

   进阶选择器

   在简单选择器中,我们了解了最基本的三种选择器:元素标签名、ID和类(class)。那么在基础选择器外,还有一些进阶和高级的选择器方便我们更精准的选择元素。

选择器 CSS模式 jQuery模式 描述
群组选择器 span,em,.box {} $("span,em,.box") 获取多个选择器的DOM对象
后代选择器 ul li a {} $("ul li a") 获取追溯到的多个DOM对象
通配选择器 * {} $("*") 获取所有元素标签的DOM对象

   如,html代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>常规选择器</title>
    <script type="text/javascript" src="jquery-1.12.3.js"></script>
    <script type="text/javascript" src="demo.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <div id="box">div</div>
    <div>div</div>
    <div>div</div>

    <p class="pox">p</p>
    <p class="pox">p</p>
    <p>p</p>

    <strong>strong</strong>
    <strong>strong</strong>
    <strong>strong</strong>
</body>
</html>

   CSS规则:

div, p, strong {
    color: red; //多种选择器添加红色字体
}
$("div, p, strong").css("color", "red"); //群组选择器jQuery方式

   又或者:

$("#box, .pox, strong").css("color", "blue");

   如,html代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>常规选择器</title>
    <script type="text/javascript" src="jquery-1.12.3.js"></script>
    <script type="text/javascript" src="demo.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <ul>
        <li><a href="#">首页</a></li>
        <li><a href="#">首页</a></li>
        <li><em>首页</em></li>
        <li><strong>首页</strong></li>
    </ul>
    <a href="#">首页</a>
    <a href="#">首页</a>

    <p>首页</p>
    <p>首页</p>

    <span>首页</span>
    <span>首页</span>
</body>
</html>

   CSS规则:

ul a {
    color: green;
}

   相当于:

ul li a { //层层追溯到的元素添加红色字体
    color: red;
}

   jQuery代码如下:

$("ul li a").css("color", "orange"); //后代选择器jQuery方式

   修改CSS规则如下:

* { //页面所有元素都添加红色字体
    color: red;
}

   jQuery代码如下:

$("*").css("color", "blue"); //通配选择器

   目前介绍的六种选择器,在实际应用中,我们可以灵活的搭配,使得选择器更加的精准和快速。

   警告:在实际使用上,通配选择器一般用的并不多,尤其是在大通配上,比如:$('*'),这种使用方法效率很低,影响性能,建议竟可能少用。

   用以上html代码来说,

alert($("*").size()); //23
alert($("*")[0].nodeName);//得到第一个DOM对象的标签名——html

   综上所述,在全局范围使用*号,会极大的消耗资源,所以不建议在全局使用。

   再看以下jQuery代码:

$("ul li a,ul li em,ul li strong").css("color", "red");

   等价于

$("ul li,ul li a").css("color", "red");

   又等价于

$("ul li *").css("color", "pink");
alert($("ul li *").size()); //4 不是3

   所以,通配选择器一般用在局部的环境内。

   还有一种选择器,可以在ID和类(class)中指明元素前缀。

   如,html代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>常规选择器</title>
    <script type="text/javascript" src="jquery-1.12.3.js"></script>
    <script type="text/javascript" src="demo.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <div class="box pox">div</div>
    <p class="box">p</p>

    <div class="pox">div</div>
    <p class="box">p</p>
</body>
</html>

   jQuery代码如下:

$("div.box").css("color", "red"); //限定必须是.box,元素获取必须是div

   类(class)有一个特殊的模式,就是同一个DOM节点可以声明多个类(class)。那么对于这种格式,我们有多class选择器可以使用,但要注意和class群组选择器的区别。

   对以上html代码有如下CSS规则:

.box.pox { //双class选择器,IE6出现异常
    color: red;
}

   jQuery代码:

$(".box.pox").css("color", "blue"); //兼容IE6,解决了异常

   多class选择器是必须一个DOM节点同时有多个class,用这多个class进行精确限定。而群组class选择器,只不过是多个class进行选择而已。

$(".box,.pox").css("color", "blue"); //加了逗号,体会区别

   警告:在构造选择器时,有一个通用的优化原则:只追求必要的确定性。当选择器筛选越复杂,jQuery内部的选择器引擎处理字符串的时间就越长。比如:

$("div#box p ul li a#link");//可以,选择器越复杂,那么字符串解析就越慢,让jQuery内部处理了不必要的字符串
$("#link"); //单个ID不需要字符串解析,ID是唯一性的,准确度不变,性能提升

 


 

posted @ 2016-04-19 21:06  叶十一少  阅读(273)  评论(0编辑  收藏  举报