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 相关文章推荐
多选列表框动态添加,移动,删除,全选等操作的简单实例
Jan 13 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
Sep 04 Javascript
浅谈Javascript变量作用域问题
Dec 16 Javascript
jQuery制作仿Mac Lion OS滚动条效果
Feb 10 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
Jun 01 Javascript
javascript执行环境及作用域详解
May 05 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
Jan 13 Javascript
angular和BootStrap3实现购物车功能
Jan 25 Javascript
javascript遍历json对象的key和任意js对象属性实例
Mar 09 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
Apr 22 Javascript
使用D3.js构建实时图形的示例代码
Aug 28 Javascript
基于JavaScript实现简单扫雷游戏
Jan 02 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中文件上传的一个问题
2010/09/04 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
Node.js中常规的文件操作总结
2016/10/13 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
2017/04/25 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
python和shell变量互相传递的几种方法
2013/11/20 Python
python实现的简单文本类游戏实例
2015/04/28 Python
Python提取网页中超链接的方法
2016/09/18 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
Opencv求取连通区域重心实例
2020/06/04 Python
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
卫校毕业生自我鉴定
2013/10/31 职场文书
药学专业个人自我评价
2013/11/11 职场文书
师范毕业生个人求职信
2013/12/09 职场文书
学生会主席就职演讲稿
2014/01/14 职场文书
倡议书格式
2014/04/14 职场文书
全运会口号
2014/06/20 职场文书
校园广播稿精选
2014/10/01 职场文书
2014年保密工作总结
2014/11/22 职场文书
音乐会主持人开场白
2015/05/28 职场文书