zoukankan      html  css  js  c++  java
  • 第2章 jQuery的选择器

    选择器是jQuery的根基

    一. 认识

    1.CSS常用的选择器

    标签选择器,后代选择器,Id选择器,通配符选择器,类选择器,群组选择器——主流浏览器全部支持

    伪类选择器,子选择器,临近选择器等等——不是全部被支持

    2.jQuery选择器

    比如有个

    <p class="demo">demo</p>

    CSS写法是.demo

    jq写法是$('.demo')

    二者写法相似,但是前者添加的是样式,后者是行为。

    二. 优势

    写法当然简洁多了,还支持CSS1-CSS3。而且在使用一个可能不存在的元素时,自动帮你判断,存在的话执行,不存在则不执行。

    那么问题来了:jq函数获取的永远是一个对象——所以不要使用如下代码

    1
    2
    3
    if($('oCr')){
        do something
    }

    要么转化为DOM对象再来判断,或者:

    1
    2
    3
    if($('#oCr').length>0){
        dosomething
    }

    三.选择器

    做几个js原生代码练习。

    【例2.1】表单隔行变色

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <table id="tab" border="1" width="400">
        <thead>
            <tr>
                <td>id</td>
                <td>姓名</td>
                <td>操作</td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>1</td>
                <td>dangjingtao</td>
                <td></td>
            </tr>
            <tr>
                <td>2</td>
                <td>djtap</td>
                <td></td>
            </tr>
            <tr>
                <td>3</td>
                <td>TAO</td>
                <td></td>
            </tr>
            <tr>
                <td>4</td>
                <td>TAOt</td>
                <td></td>
            </tr>
            <tr>
                <td>5</td>
                <td>hehe</td>
                <td></td>
            </tr>
        </tbody>
    </table>

    js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    window.onload=function(){
        var oTab=document.getElementById('tab');
        var aRows=oTab.tBodies[0].rows;
     
        for(i=0;i<aRows.length;i++){
            if(i%2==0){
                aRows[i].style.background='#ccc';
            }
        }
    }

    jQuery改写:考虑:even选择器

    1
    2
    3
    $(document).ready(function(){
        $('#tab tbody tr:even').css('background','#ccc');
    });

    【例2.2】给网页所有P元素加onclick事件

    1
    2
    3
    4
    5
    <div id="div1">
        <p>hehe</p>
        <p>hahaha</p>
        <p>hohoho</p>
    </div>

    JS

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    window.onload=function(){
        var oDiv=document.getElementById('div1');
        var aP=document.getElementsByTagName('p');
     
        for(i=0;i<aP.length;i++){
            aP[i].onclick=function(){
                alert(this.innerHTML);
            }
        }
    }

    改写:说白了就是一个div1内所有P元素,click(function(){})

    1
    2
    3
    4
    5
    $(document).ready(function(){
        $('#div1>p').click(function(){
            alert(this.innerHTML);
        })
    })

    【例.3】对多选框操作,输出被选中的多选框的个数

    1
    2
    3
    4
    <input type="checkbox" value="1" name="check" checked="checked"/>
    <input type="checkbox" value="2" name="check"/>
    <input type="checkbox" value="3" name="check" checked="checked"/>
    <input type="button" value="你选中的个数" id="btn1" />
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    window.onload=function(){
        var oBtn=document.getElementById('btn1');
     
        oBtn.onclick=function(){
            var aChk=document.getElementsByName('check');
            var count=0;
            for(i=0;i<aChk.length;i++){
                if(aChk[i].checked){
                    count++;
                }
            }
            alert('您选中的个数是'+count+'个');
        }
    }

    改写:属性选择器

    1
    2
    3
    4
    5
    6
    7
    $(document).ready(function(){
        var arr=$("input[name='check']:checked");
        $('#btn1').click(function(){
            alert('您选中的个数是'+arr.length+'个');
        })
         
    })

    程序有点问题,就是不能实时反映当前的情况。

       
    jq选择器简明词典
    1. 基本选择器 释义 用法示例 备注
    #id
    .class
    还可以是通配符,元素或者群组
    等效于getElementById('')
    等效于getElementsByClass('')
    $("#myDiv");
    $('.myClass');
    $('*')
    $('div1,div2')
    也许是最好用的选择器。
    2. 层次选择器 释义 用法示例 备注
    ancestor descendant
    parent>child
    在给定的祖先元素下匹配所有的后代元素
    选取直接子元素
    $("form input")
    $('form>input')
     
    one+div 选取class为one的下一个div同辈元素 $(.one+div') jQuery替代方案:

    $('.one').next('div')可以替代$('.one+div')

    one~siblings 选取特定id元素后面所有特定类别同辈元素 $(.one~div)

    jQuery替代方案:

    $(#one).nextAll('div')可以替代$('#two~div')。

    3.过滤选择器 释义 用法示例 备注
    3.1 基本过滤选择器 释义 用法示例 备注
    :first和:last 获取指定类型匹配的第一个/最后一个元素 $('div:first')
    找出第一个div
    $('div:last')
    找出最后一个div
     
    not(selector} 去除所有与给定选择器匹配的元素 假设两个选择框,一个选中一个没选中:选择的是没被点选的那个复选框。
    $('input:not(:checked)')
     
    :even(偶数)
    :odd(奇数)
    选取索引值为偶数/奇数的元素,从0开始。
    注意索引值第0个即现实中第1个。
    $('div:even')
    选取的是偶数个索引值的div,也就是现实中第1,3,5,7..的div
    索引值都是从0开始的。除了Eq是单个元素,其它都是多个元素
    :eq(index)
    :gt(index)
    :lt(index)
    提取索引值/索引值之后/索引值之前的元素 $('input:eq(1)')
    索引值第1个也就是现实中第2个input标记。
    :header 选择所有标题元素(h1,h2,h3....h6),前面不用跟对象 $(':header')  
    :animated 选取当前执行动画的元素 $('div:animate')
    选取正在执行动画的div
     
    :focus 选取当前获取焦点的元素, 前面不用跟对象 $(':focus')  
    3.2 内容过滤选择器 释义 用法示例 备注
    :contains(text) 选取所有文本内容为text的元素 $('div:contains('我'))
    选取所有内容包含“我"的div元素
     
    :empty
    :parent
    选取不包含子元素或文本的空元素
    选取含有子元素或文本的元素(也就是非空元素)
    $('div:empty')
    选取所有的空div
    选取所有非空的div
    $('div:parent')
     
    :has(selector) 选取含有选择器所匹配的元素 $('div:has(p)')
    选取所有含有p元素的div
     
    3.3可见性过滤选择器 释义 用法示例 备注
    :hidden
    :visible
    选取所有不可见的元素 $('div:hidden')
    选取所有可见的div
    如果前面不跟对象,则默认所有不可见的被选取
    选取所有可见的元素 选取所有不可见的div
    $('div:visible')
     
    3.4 属性过滤选择器 释义 用法 备注
    [attribute] 选取所有拥有此属性的d元素 $('div[id]')
    选取含有id的div
     
    [attribute=value]
    [attribute!=value]
    选取此属性为value的元素 $('div[title=haha]')
    选取title为haha的div
     
    选取属性值不为value的元素 $(div['title!=haha]')
    选取title为haha的div
     
    [attribute^=value] 选取属性以value开始的元素    
    [attribute$=value]   选取属性以value结束的元素    
    [attribute*=value]   选取属性含有value的元素    
    [attribute|=value] 选取属性为给定字符串,或以该字符串为前缀(前缀-后缀)的元素    
    [attribute-=value] 选取属性用空格分隔的值中包含value的元素    
    [attribute1][attribute2]..[attributeN] 多个属性选择器的交集    
    3.5 子元素过滤选择器 释义 用法 备注
    :nth-dhild(index/even/odd/eqation) 选取每个父元素下第index个子元素或奇偶数子元素   index从1算起,是个集合元素
    :first-child 每个父元素下第一个子元素 $('ul li:firsrt-child')
    选取每个ul的第一个li元素
    不同于:first,这是个集合元素
    :last-child 每个父元素下最后一个子元素    
    :only-child 独生子元素会被匹配,否则无效。   都是集合元素
    3.6 表单对象的属性过滤选择器 释义 用法 备注
    :enable


    :disable
    选取所有可用元素 $('form1:enable')
    选取id为form1的表单内所有可用元素
     
    选取所有不可用元素    
    :checked (单选框,复选框)所有被选中的元素 $('input:checked')  
    :selected (下拉列表)所有被选中的元素 $('select option:selected')  
    4. 表单选择器 释义 用法 备注
    :input 选取所有,input、textarea,select,button元素   前面不用跟对象
    :text 选取所有单行文本框    
    :password 选取所有密码框    
    :radio 选取所有单选框    
    :checkbox 选取所有复选框    
    :submit 选取所有提交按钮    
    :image 选取所有图像按钮    
    :reset 选取所有重置按钮    
    :button 选取所有button按钮    
    :fil      
           

    注意事项:

    (1)当选择器含有特殊字符(比如16进制颜色代码)

    \#666

    (2)注意:xxx的空格问题,意义和表现都是不同的。

    【久违的案例】某购物网站品牌列表效果

    项目需求:点击显示更多,弹出隐藏的选项,同时将重要推荐高亮显示,同时按钮文字变成:收起。再次单击收起,变回原来的页面。可以先写出JavaScript的工作方式。

    先布局

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <div id="section">
        <h2>jQuery选择器辞典</h2>
        <ul>
            <li class="main"><a href="javascript:;">基本选择器</a></li>
            <li class="main"><a href="javascript:;">层次选择器</a></li>
            <li class="main"><a href="javascript:;">过滤选择器</a></li>
            <li class="main"><a href="javascript:;">表单选择器</a></li>
            <li class="minor"><a href="javascript:;">基本过滤选择器</a></li>
            <li class="minor"><a href="javascript:;">内容过滤选择器</a></li>
            <li class="minor"><a href="javascript:;">属性过滤选择器</a></li>
            <li class="minor"><a href="javascript:;">子元素过滤选择器</a></li>
            <li class="minor"><a href="javascript:;">表单对象的过滤属性选择器</a></li>
            <li><a href="javascript:;">补白</a></li>
        </ul>
        <div id="showhide">
            显示所有
        </div>
    </div>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    *{
        margin:0;padding:0;
    }
    ul li{list-style: none;}
    a{text-decoration: none;}
     
     
    #section{
        width:800px;
        margin:100px auto;
    }
    h2{
        width: 400px;
        text-align: center;
        margin: 0 auto;
        margin-bottom: 50px;
    }
     
    ul li{
         
        float: left;
    }
    .minor{
        display: none;
    }
    ul li a{
        display: block;
        width: 200px;
        line-height: 40px;
        font-size: 16px;
        text-align: center;
        color: black;
    }
    ul li a:hover{
        color: rgb(255,85,0);
        text-decoration: underline;
    }
     
    #showhide{
        clear:both;
        width:80px;
        border: 1px solid black;
        background: url(../images/down.gif) no-repeat 4px center;
        margin:0 auto;
        padding-left: 20px;
        cursor: pointer;
    }

    js:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    window.onload=function(){
        var oBtn=document.getElementById('showhide');
        var aMinor=document.getElementsByClassName('minor');
        var aMain=document.getElementsByClassName('main');
        var bShow=false;
        var i=0;
     
     
        oBtn.onclick=function(){
            bShow=!bShow;
            if(bShow){
                for(i=0;i<aMinor.length;i++){
                    aMinor[i].style.display='block';
                }
                for(i=0;i<aMain.length;i++){
                    aMain[i].getElementsByTagName('a')[0].style.color='#FF5500';
                }
                oBtn.style.background='url(images/up.gif) no-repeat 4px center'
     
            }else{
                for(i=0;i<aMinor.length;i++){
                    aMinor[i].style.display='none';
                }
                for(i=0;i<aMain.length;i++){
                    aMain[i].getElementsByTagName('a')[0].style.color='black';
                }
                oBtn.style.background='url(images/down.gif) no-repeat 4px center'
                      
            }
        }
         
    }

    评述:由于原生js的局限性,需要在html中导入较多的class。而且获取a的属性也相当麻烦。

    jquery:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $(document).ready(function(){
        var bShow=false;
        $('#showhide').click(function(){
            bShow=!bShow;
            if(bShow){
                $('.minor').css('display','block');
                $('.main>a').css('color','#ff5500');
                $(this).css('background','url(images/up.gif) no-repeat 4px center');
            }else{
                $('.minor').css('display','none');
                $('.main>a').css('color','#000');
                $(this).css('background','url(images/down.gif) no-repeat 4px center');
            }
     
        })
    })

    确实简化了一些声明。但是有些多余的class其实是不必要的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $(document).ready(function(){
        var $aMinor=$('ul li:gt(3):not(:last)');
        //获取索引值大于3的品牌集合(除了最后一条)
        $('#showhide').click(function(){
            if($aMinor.is(":visible")){
                $aMinor.hide();//对应的方法是show,不用再写display的css()方法了。
                $('.main>a').css('color','#000');
                $(this)
                    .css('background','url(images/down.gif) no-repeat 4px center')
                    .text('展开');//改变里面的文本
            }else{
                $aMinor.show();
                $('.main>a').css('color','#ff5500');
                $(this)
                    .css('background','url(images/up.gif) no-repeat 4px center')
                    .text('收起');
            }
     
        })
    })
  • 相关阅读:
    js复习---工厂函数---构造函数的执行过程
    21年初的措不及防-------
    element ui checkbox实现多项全选反选功能
    vue 实现导航锚点联动
    this.$router.currentRoute 和 this.$route的 区别
    重置vue组件的data数据 this.$options.data()
    父组件中如何拿到引入的子组件里element-ui 的form表单ref对象
    线程笔记
    面向对象
    关于上传和下载的笔记
  • 原文地址:https://www.cnblogs.com/djtao/p/5924118.html
Copyright © 2011-2022 走看看