jQuery中选择器的基础使用教程


Posted in Javascript onMay 23, 2016

其实选择器就像开罐器一样,会用这个工具的人,自然吃的到甜头,但不会用这个工具的人,不管罐头里面的面筋土豆有多美味,吃不到就是吃不到,就如同jquery再怎么强大,也只能看着荧幕,而不知该如何下手,不过虽然选择器不难,也容易上手,但老实说,我用了一年多下来,还是觉得自己只有用皮毛而已,所以希望藉着这一系列的笔记,让自己能更长进一些
DOM怎么吃
DOM可以说是JavaScript与网页之间的联系管道,他提供了一个模型,让JavaScript能藉由此模型来改变或操作整个网页,

<div class="one">
  <p>two_1</p>
  <p>two_2</p>
  <p>two_2</p>
</div>

我这边就简单介绍一下DOM模型,有个元素class名为one的是父元素,底下有三个儿子元素<p>,每个元素都视为一个节点,也可以看成一个树形图,因为我认为有些东西是Google会讲得比我好,所以还想知道更多纠结的父子关系...,可以去这,那边有很好的说明,这边就不多加解释,而当Jquery利用选择器抓取到DOM元素以后,就会将他包装成一个Jquery object,并且回传
$('#MyDiv')<-- 他是一个物件
这里有个观念十分重要,因为许多初学者,甚至是一些从Jquery开始学起Javascript的开发者(包括我),常常会把以下两个程序码搞混在一起

//原生JavaScript取id为a的div
var result1 = document.getElementById('a');
console.log(result1);

//用jquery取id为a的div
var result2=$('#a');
console.log(result2);

如果你执行这段程序码出来,??会发现console出来的结果,用JavaScript取出来的结果是DOM,可是一样的div用Jquery取出来的却是个包装过后的物件,换句话说,你不能直接对包装过后的Jquery物件增加DOM的事件,而是要用Jquery提供的事件,有人会说,那意思是不是说以后只能河水不犯井水,往后互不干涉,从此分道扬镳呢? 到也不是

var b=$('#a')[0];

只要跟上述程序码一样就可以取得DOM的元素了
$()工厂
不管是如何选择,我们都会用相同的函式$(),就如之前所讲的,他能接受CSS选择器的语法做为参数,而最主要的三个参数分别为tag name、ID与class,当然,这三个参数可以再与其他CSS语法做结合

//tag name
$('div')

//ID
$('#myId')

//class
$('.myClass')

而上述函式都会如同第一章所介绍的,都有隐式迭代的特色,而为了做到跨览器的支援,Jquery的选择器包含了CSS1-3,所以不用担心一些比较特别的浏览器(对就是IE6)不能执行,除非浏览器没有开启JavaScript
接着接下来我简单介绍几个用法
http://jsfiddle.net/XZnQ7/

//将不含color1 class的p增加一个color2 class
$('p:not(.color1)').addClass('color2');

http://jsfiddle.net/bpJct/3/

//这里是用正规表示法
$('a[href^="mailto:"]').addClass('font1');
$('a[href^="http"]').addClass('font2');
$('a[href$=".pdf"]').addClass('font3');

当然还提供了一些客制化(custom)的选择器,但一般来说原生(native)的方式会来的效能比较快,如果有注重这块的朋友,可能要尽量避免使用客制化的选择器例如以下范例

http://jsfiddle.net/MF8mu/
//替index为1的tr加上class
$('tr:eq(1)').addClass('color1');

//替index为1的tr加上class
$('tr:nth-child(1)').addClass('color2');

这里很特别的是,为什么都是替index为1的tr加上class,却是不同的结果呢?,因为:eq()算是一个JavaScript阵列,index是0起始,所以才会选到第二个,而nth-child()是CSS选择器的一种,所以index是以1起始,选到的就是第一个,以下的范例意思相同

http://jsfiddle.net/3PrJt/
//选择偶数的tr增加class
$('tr:even').addClass('color1');

//选择偶数的tr增加class
$('tr:nth-child(even)').addClass('color2');

就如同刚刚所讲的,index起始不同(JavaScript起始为0,CSS为1),所以虽然都是取偶数,但却是不同列
再来就一些FORM常用的选择器 http://jsfiddle.net/qcXSy/3/

$(':button').click(function(){
    alert('a');
});

这就代表说绑定所有的bitton一个click事件,其他还有像:input、:button、:enabled、:disabled都可以跟其他选择器一起组合成新的选择器
更加强大的.filter()
当有时候一般的选择器已经不能不能满足我们复杂的DOM时,例如要抓div的爸爸的哥哥的儿子的妹婿的二姑的大舅时...,这时候还可以用一个方法filter,这个方法特别的地方在于他可以带function进去 http://jsfiddle.net/wGz3k/
可以看到function里面限制return index == 1才可以增加CSS,这个好处就在于可以在里面做很多复杂的逻辑运算
当然Jquery还有太多太多选择器可以使用,像还有.next()、.parent()、.children()一般常用的这几个,其实就很够用了我认为,再多的选择器有时候好像只是展示不同的写法,但其实只要能抓取到你想要的元素,解决问题
你甚至想要这样写$('div').children().children().children().children().children()也不会有人说不行..

实例
一个网站中有10种的文章分类,我们设计一个类似WordPress显示各文章分类的名称及其文章数量的栏目,当用户进入一个页面时,默认显示前面5个分类的名称以及最后一个分类——其他分类,用户可以通过单击“显示全部分类”按钮来显示全部分类,同时一些推荐的分类会加下划线显示,按钮中的文字会改变为“显示部分分类”,再次单击“显示部分分类”后会回到之前的页面状态。

首先为了实现这个功能,我们需要写出相应的 html

<div class="CategoryBox">
  <h2>分类列表</h2>
  <ul>
    <li><a href="#">互联网(55)</a></li>
    <li><a href="#">前端(22)</a></li>
    <li><a href="#">css(10)</a></li>
    <li><a href="#">jQuery(12)</a></li>
    <li><a href="#">后台(28)</a></li>
    <li><a href="#">Php(10)</a></li>
    <li><a href="#">jsp(6)</a></li>
    <li><a href="#">.net(5)</a></li>
    <li><a href="#">CMS(9)</a></li>
    <li><a href="#">其他分类(3)</a></li>  
  </ul>
  <div class="more">
    <a href="more.html"><span>显示全部分类</span></a>
  </div>
</div>

 

在Html写后好再添加一些简单的css,然后就可以开始jQuery的编写。

 

下面的代码将实现页面加载完毕后选取相应的对象并隐藏,这里选取的是第6个分类到第9个分类4个对象,因为需要控制隐藏和显示的便是这四个分类。

var $category = $('ul li:gt(4):not(:last)');
$category.hide();

$('ul li:gt(4):not(:last)')的意思便是获取索引值大于4的li元素并且去掉最后一个,需要注意的是索引值是从0开始,所以这样便可以获取第6到第9个分类。

下面将会获取“显示全部分类”按钮,并且给该按钮添加一个事件,单击该按钮后显示所有分类

var $toggleBtn = $('.more a');
$toggleBtn.click(function() {
  $category.show();
  return false;
});

 
.show()是用于显示元素的动画,另外由于给超链接添加onclick事件,因此需要添加return false语句阻止该超链接跳转。

写到这里,我们不难发现,jQuery的选择器跟css选择器有相近之处,其原理都是先以选择器选择对象,再添加操作,不过jQuery的选择器明显比css的丰富和简便得多,这也是使用jQuery能大大提高网站开发效率的重要原因。

接着上面的例子,根据文章开头设定的条件,在单击“显示全部分类”的按钮后,部分推荐的分类会添加下划线,同时按钮中的文字会变成“显示部分分类”,因此我们还需要在.show()和return false之间添加以下代码:

$('.more a span').text("显示部分分类");
$('ul li').filter(":contains('前端'),:contains('css'),:contains('jQuery'),:contains('CMS')").addClass("feature");

 
.text()用于改变对象中的文字,filter()可以用于选出推荐对象,这里推荐的是前端,CSS,jQuery,CMS,然后使用addClass()为它们添加“feature”类,因为我已预先写feature类的css,所以以上推荐对象在单击按钮后便会加上下划线。至此,可以说基本完成了这次需要的jQuery,当然用户单击“显示部分分类”后的效果还没有写上相应的jQuery。但有了前面的一段jQurey代码,相信写出单击“显示部分分类”后的代码应该不难。

在单击“显示部分分类”后的效果中其中一个是需要去掉推荐分类的下划线效果,我们可以使用removeClass(),用法与addClass相同。

现在余下的问题是如何把两段代码写在一起,由于用户在两个事件上单击的是同一个按钮,因此事件仍然是在刚才的按钮元素上,要使两种状态在一个元素上进行,我们可以使用判断:

if(元素显示状态 ) {
//隐藏元素
}else{
//显示元素
}

 
整个完整的jQuery代码如下:

$(document).ready(function() {
    var $category = $('ul li:gt(4):not(:last)');
    $category.hide();
    var $toggleBtn = $('.more a');
    $toggleBtn.click(function() {
      if($category.is(":visible")) {
        $category.hide();
        $('.more a span')
          .text("显示全部分类");
        $('ul li').removeClass("feature");
      }else{
        $category.show();
        $('.more a span')
          .text("显示部分分类");
        $('ul li').filter(":contains('前端'),:contains('css'),:contains('jQuery'),:contains('CMS')")
          .addClass("feature");
      }
      return false;
    });
});

 
上面的判断语句,用法与一般的高级编程语言相近,但放在jQuery这个以轻便闻名的js库中不免显得繁琐,其实在jQuery中有更为轻便的方法去实现上面的例子,即toggle()方法,代码如下:

$(document).ready(function(){
    var $category = $('ul li:gt(4):not(:last)');
    $category.hide();
    var $toggleBtn = $('.more a');
    $toggleBtn.toggle(function(){
      $category.show();
      $('.more a span')
        .text("显示部分分类");
      $('ul li').filter(":contains('前端'),:contains('css'),:contains('jQuery'),:contains('CMS')")
        .addClass("feature");
    },function(){
      $category.hide();
      $('.more a span')
        .text("显示全部分类");
      $('ul li').removeClass("feature");
    });
});

具体的效果可以看demo note-selector

Javascript 相关文章推荐
用js实现下载远程文件并保存在本地的脚本
May 06 Javascript
33种Javascript 表格排序控件收集
Dec 03 Javascript
基于jQuery的history历史记录插件
Dec 11 Javascript
关于textarea提交的内容无法换行的解决办法
Apr 09 Javascript
jquery图片放大功能简单实现
Aug 01 Javascript
Javascript浅谈之引用类型
Dec 18 Javascript
javascript 10进制和62进制的相互转换
Jul 31 Javascript
详解vue.js2.0父组件点击触发子组件方法
May 10 Javascript
基于JavaScript实现弹幕特效
Aug 27 Javascript
JS文件中加载jquery.js的实例代码
May 05 jQuery
vue form 表单提交后刷新页面的方法
Sep 04 Javascript
vue router 源码概览案例分析
Oct 09 Javascript
基于BootStrap的图片轮播效果展示实例代码
May 23 #Javascript
AngularJS上拉加载问题解决方法
May 23 #Javascript
在IE8上JS实现combobox支持拼音检索功能
May 23 #Javascript
浅析JavaScript 箭头函数 generator Date JSON
May 23 #Javascript
用js实现放大镜的效果的简单实例
May 23 #Javascript
jQuery实现摸拟alert提示框
May 22 #Javascript
javascript实现标签切换代码示例
May 22 #Javascript
You might like
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
获取PHP警告错误信息的解决方法
2013/06/03 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
Vue列表页渲染优化详解
2017/07/24 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
python网络编程之数据传输UDP实例分析
2015/05/20 Python
Python可变参数用法实例分析
2017/04/02 Python
python数据处理实战(必看篇)
2017/06/11 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
三年级评语大全
2014/04/23 职场文书
岳庙导游词
2015/02/04 职场文书
共青团员自我评价
2015/03/10 职场文书
数学复习课教学反思
2016/02/18 职场文书
小学作文之描写天气
2019/08/15 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技