JQuery意义 - Why?
  为什么要使用JQuery,从我个人来说,就是这么几点:简化代码 + 统一行为 + 功能强大 + 搭配方便
  简化代码是从写代码的角度来说的,实现同样的功能,如果用JavaScript内置对象和函数去完成的话,需要写很多代码,而使用JQuery这种类库却很简洁,下面的例子会体现出来。
  统一行为是从浏览器的兼容性的角度来说的,实现一个行为,如果用JavaScript内置对象和函数去完成的话,需要处理很多的兼容性问题,这个在前面我们已经见识过了,使用JQuery这种类库,我们就不需要(或者说不总是需要)去考虑兼容性问题了。
  功能强大是从JQuery提供的功能的角度来说的,在众多的类库中,无疑JQuery提供了最为全面的功能,这一点促使它甚至成为了微软的御用类库,默认加到了Web工程中,不仅如此,只要是使用类库的网站,大部分选择的都是JQuery,在网站开发中使用JQuery基本变成了固定的模式。
  搭配方便是从JQuery与其它的类库配合使用的角度来说的,使用JQuery这种以提供行为为主的类库配合上Bootstrap这类以提供布局为主的类库,简直可以说是页面开发的通吃组合。再加上另外两个兄弟,形成的"JQuery+Bootstrap+AngularJS+NodeJS"开发模式,几乎成为了当今最为热门的开发方式(最起码兄弟我是这么认为的)。
 
JQuery引用 - Where?
  引用一个类库的方式大家已经很熟悉了,不再多说:
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>

  这是引用CDN上的文件,通常大家也会把这个类库下载下来放到本地,然后引用。

  不管引用的这个文件是哪的,上面这行代码基本上都是放到页面尾部。把脚本放到页面尾部可以提高页面的加载速度,这也是基本常识了。
 
JQuery对象 - What?
  JQuery最重要的概念,就是jQuery对象。它是一个全局对象,可以简写为美元符号$。也就是说,jQuery和$两者是等价的(下面的例子中使用的都是美元符号$,不过很多人认为,为了不和其它类库中定义的$函数冲突,最好还是使用jQuery函数)。
  在网页中加载JQuery函数库以后,就可以使用jQuery对象了。JQuery全部的方法,都定义在这个对象上面。所以使用JQuery类库的第一步自然是获取jQuery对象。
  前面我们讲DOM的时候说过,为了操作DOM,必须对HTML元素进行抽象,得到对应的JavaScript中的DOM对象,这样才能通过这些对象操作HTML。
  同样的道理,jQuery对象就是所有HTML元素在JQuery类库中的抽象,所有的相关方法自然是定义在这个对象上。
  当我首次使用JQuery的时候,我一直对$(selector)心存困惑,直到很久之后,我才豁然开朗,原来jQuery对象就是通过这个函数获取到的,函数的参数决定了获取到的jQuery对象。不过jQuery对象一不是一般的对象,它是包装了满足参数条件的所有DOM对象的一个类似于数组的对象,这是很重要的一个特征。
  到这里,我们就有必要分清两个概念了:JQuery对象与DOM对象
  通过上面我们知道它们都是JavaScript中的对象,具有不同的方法集。DOM对象通过document获得,然后可以执行相关的操作;JQuery对象通过$()函数获得,然后可以执行相关的操作
  于是同样是在浏览器中编程,那么不可避免的,我们有时候是使用DOM编程,有时候是使用JQuery编程,这就涉及到了DOM对象与JQuery对象的转换,通常来说有如下方式:
  从DOM对象转为JQuery对象,这个很简单,因为$函数的参数支持DOM对象直接传进来:
var domObj = document.getElementById('testDiv');
var jQueryObj = $(domObj);

  而JQuery对象作为一个DOM对象的包装集,使用索引值的方式获取的就是DOM对象,如下面例子中的获取第1个元素:

var domObj = $('#testDiv')[0];
var domObj = $("#testDiv").get(0);

  当然了,JQuery对象枚举的时候返回的也是DOM对象,如下所示:

$("#testDiv").each(function() { alert(this); });

  这个例子中的this就是DOM对象。

 
JQuery模式 - How?
  使用JQuery的步骤是:获取JQuery对象,执行相关操作。概括起来就是:
$(selector).action(parameters);

  下面分别看看这两个部分:

1. 获取JQuery对象的途径 - 选择器selector
  下面我们就来看看selector这个参数;selector参数可以是一个字符串,也可以是DOM对象。
  使用DOM对象作为参数的话就是直接把DOM对象转换成jQuery对象,这个在上面已经总结过了。
  字符串形式的selector是最主要的使用方式,它可以是下列的各种形式:
1)CSS选择器语法
  这里只是给出一些常见的选择器的例子,完整的选择器列表参看后面的参考文档:
// 基础选择器
$('#testDiv') // 选择id为testDiv的元素,一般id在整个页面是唯一的
$('p') // 选择页面中所有的p元素
$('.big') // 选择页面中所有的CSS类为big的元素
// 选择器的与或关系
$('.big,p') // 选择页面中所有CSS类为big的元素和所有的p元素
$('p#testDiv') // 选择页面中所有的CSS类为big的p元素
// 层次选择器
$('form input') // 选择页面中所有的form元素下面的所有的input元素
$('form>input') // 选择页面中所有的form元素下面直接属于form的input元素
$('#name+img') // 选择页面中id为name的元素后面紧跟着的img元素
$('#name~img') // 选择页面中id为name的元素后面所有的img元素
// 各种条件的过滤器:索引值,内容过滤,属性过滤,子元素过滤
$('tr:first'), $('tr:last') // 选择第一行/最后一行表格
$('input:not(:checked)') // 选择页面中没有被checked的input,not后面的参数可以是任意的选择器
$('tr:even'), $('tr:odd') // 偶数行/奇数行
$('tr:eq(1)'),$('tr:gt(1)'), $('tr:lt(1)') // 满足条件的第二行/第二行后面的/第二行前面的
$(':header') // 所有h1, h2, h3元素
$('div:not(:animated)') // 所有没有在执行动画效果的div
$("div:contains('Name')") // 所有内容中含有Name字符串的div
$('div:has(p)') // 所有含有p元素的div
$('tr:hidden'), $('tr:visible') // 隐藏/显示的行
// 所有有id属性的div/id值为name的div/id值不为name的div
$('div[id]'), $("div[id='name']"), $("div[id!='name']")
// 所有id属性值以name开头/结尾/包含name的div
$("div[id^='name']"), $("div[id$='name']"), $("div[id*='name']")
// 满足多个属性条件的div
$("div[id='name'][name$='man']")
// 在每个ul中查找第2个li,nth-child后面的参数可以是even, odd, index值, 倍数如3n, 3n+1等等。
// 注意这个参数是从1开始的,而eq()是从0开始的。
$('ul li:nth-child(2)')
// 在每个ul的子元素中中查找第一个/最后一个li
$('ul li:first-child'), $('ul li:last-child') // 表单选择器与过滤器:
// 选择所有的input/text/password...
$(':input'), $(':text'), $(':password'), $(':radio'), $(':checkbox')
$(':button'), $(':submit'), $(':image'), $(':reset'), $(':file')
// 选择启用/禁用/checked/选中的input,option
$(':input:enabled'), $(':input:disabled'), $(':input:checked'), $('select option:selected')
2)字符串形式的元素
  如果直接在jQuery构造函数中输入HTML代码,返回的也是jQuery实例。
$('<li class="greet">test</lt>')

  上面代码从HTML代码生成了一个jQuery实例,它与从CSS选择器生成的jQuery实例完全一样。唯一的区别就是,它对应的DOM结构不属于当前文档。

 
3)函数的第二个参数 - 限制查找范围
  默认情况下,jQuery将文档的根元素(html)作为寻找匹配对象的起点。如果要指定某个网页元素(比如某个div元素)作为寻找的起点,可以将它放在jQuery函数的第二个参数。
$('li', someElement);

  上面代码表示,只寻找属于someElement对象下属的li元素。someElement可以是jQuery对象的实例,也可以是DOM对象。

  如果还以我们前面的DOM操作那一篇中长途查找与短途查找的分类来看,上面使用选择器的方式显然是属于长途查找的一种。
  下面来看看短途查找的方式,这个和前面一样,事先要获取到一个jQuery对象,然后基于这个对象,再进一步缩小查找的范围(当$函数指定第二个参数的时候,也可以缩小查找范围,从这个方面来说,这种也算是短途查找吧),看例子:
// first方法返回结果集的第一个成员,last方法返回结果集的最后一个成员。
$("li").first()
$("li").last()
// next方法返回紧邻的下一个同级元素,prev方法返回紧邻的上一个同级元素。
// 如果next方法和prev方法带有参数,表示选择符合该参数的同级元素。
$("li").first().next()
$("li").last().prev()
$("li").first().next('.item')
$("li").last().prev('.item')
// parent方法返回当前元素的父元素,parents方法返回当前元素的所有上级元素(直到html元素)。
// parent, parents, children这三个方法都接受一个选择器作为参数。
$("p").parent()
$("p").parent(".selected")
$("p").parents()
$("p").parents("div")
// children方法返回选中元素的所有子元素。
$("div").children()
$("div").children(".selected")
// 等同于
$('div > *')
$('div > .selected')
// siblings方法返回当前元素的所有同级元素。
$('li').first().siblings()
$('li').first().siblings('.item')
// nextAll方法返回当前元素其后的所有同级元素,prevAll方法返回当前元素前面的所有同级元素。
$('li').first().nextAll()
$('li').last().prevAll()

  当然除了这些与DOM操作类似的获取parent, child, sibling(兄弟节点)的操作外,JQuery还提供了其它的一些相当强大的过滤操作,例如:

// closest方法返回当前元素,以及当前元素的所有上级元素之中,第一个符合条件的元素。
// find方法返回当前元素的所有符合条件的下级元素。
$('li').closest('div')
$('div').find('li')
// add方法用于为结果集添加元素。
$('li').add('p')
// addBack方法将当前元素加回原始的结果集。
$('li').parent().addBack()
// end方法用于返回原始的结果集
$('li').first().end() // filter方法用于过滤结果集,它可以接受多种类型的参数,只返回与参数一致的结果。
// 返回符合CSS选择器的结果
$('li').filter('.item')
// 返回函数返回值为true的结果
$("li").filter(function(index) {
return index % 2 === 1;
})
// 返回符合特定DOM对象的结果
$("li").filter(document.getElementById("unique"))
// 返回符合特定jQuery实例的结果
$("li").filter($("#unique"))
// not方法的用法与filter方法完全一致,但是返回相反的结果,即过滤掉匹配项。
$('li').not('.item')
// has方法与filter方法作用相同,但是只过滤出子元素符合条件的元素。
$("li").has("ul")
// 上面代码返回具有ul子元素的li元素。

上面代码中的需要说明两点:

第一点,例子中的find方法,选中所有div元素下面的li元素,等同于$('li','div')。由于这样写缩小了搜索范围,所以要优于$('div li')的写法。
第二点,是这种"$('li').last().prevAll()"链式调用,每个jQuery对象的方法结束时都会返回当前的jQuery对象,所以可以直接把方法串起来这样调用。
 
选择器的知识就总结这些了,用好选择器是JQuery的核心,兄弟我还需努力。
 
参考资料:
JQuery官方网站:http://api.jquery.com/
JQueryUI官方网站:http://jqueryui.com/
一个全面的教程:http://kb.cnblogs.com/page/46450/

JavaScript大杂烩14 - 使用JQuery(上)的更多相关文章

  1. JavaScript(14)jQuery(JavaScript 库)

    JavaScript 框架(库) JavaScript 高级程序设计(特别是对浏览器差异的复杂处理),通常非常困难也非常耗时.为了应对这些调整,很多的 JavaScript (helper) 库应运而 ...

  2. JavaScript大杂烩15 - 使用JQuery(下)

    前面我们总结了使用各种selector拿到了jQuery对象了,下面就是对这个对象执行指定的行为了. 2. 操作对象 - 行为函数action 执行jQuery内置的行为函数的时候,JQuery自动遍 ...

  3. Java程序猿JavaScript学习笔记(14——扩大jQuery UI)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  4. jquery上传文件控件Uploadify

    基于jquery的文件上传控件,支持ajax无刷新上传,多个文件同时上传,上传进行进度显示,删除已上传文件. 要求使用jquery1.4或以上版本,flash player 9.0.24以上. 有两个 ...

  5. jQuery上定义插件并重设插件构造函数

    插件alert的全部代码,每个插件都定义在如下类似的作用域中: +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ========= ...

  6. jQuery上传插件Uploadify使用帮助

    Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.它的功能特色总结如下: 支持单文件或多文件上传,可控制并发上传的文件数 在服务器端支持各种语言与之配合使用,诸如PHP, ...

  7. JQuery上传插件uploadify优化

    旧版的uploadify是基于flash上传的,但是总有那么些问题,让我们用的不是很舒服.今天主要分享下在项目中用uploadify遇到的一些问题,以及优化处理 官方下载 官方文档 官方演示 下面是官 ...

  8. jquery 上传空间uploadify使用笔记

    基于jquery的文件上传控件,支持ajax无刷新上传,多个文件同时上传,上传进行进度显示,删除已上传文件. 要求使用jquery1.4或以上版本,flash player 9.0.24以上. 有两个 ...

  9. jquery上传控件个人使用

    转了一篇jquery的上传控件使用博文,但是,经过测试貌似不行,自己研究了一下,效果实现.记下,以后使用. 下载“Uploadify”,官方版本为php的,很多文件不需要,删除带.php的文件. &l ...

随机推荐

  1. oracle中常见的对表、表空间和视图的操作

    创建表:create table t1(key1 type default 0,key2 type not null) 删除表:drop table t1; 删除表数据:truncate table ...

  2. 005. Asp.Net Routing与MVC 之三: 路由在MVC的使用

    上次讲到请求如何激活Controller和Action,这次讲下MVC中路由的使用.本次两个关注点: 遗留:ModelBinder.BindModel的过程 MVC中路由的使用 MVC 5中的Acti ...

  3. Oracle 创建表并设置主键自增

    创建数据库 CREATE TABLE STUDENT(ID NUMBER PRIMARY KEY, NAME VARCHAR(200) NOT NULL, SEX VARCHAR(200), CREA ...

  4. nginx如何实现高并发

    nginx如何实现高并发 简单来讲,就是异步,非阻塞,使用了epoll和大量的底层代码优化. 稍微详细一点展开的话,就是nginx的特殊进程模型和事件模型的设计. 进程模型 nginx采用一个mast ...

  5. TCP/IP 笔记 - Internet协议

    IP是TCP/IP协议族中的核心协议,TCP.UDP.ICMP.IGMP数据都通过IP数据报传输.IP提供了一种"尽力而为.无连接"的数据交付服务:尽力而为表示不保证IP数据报能成 ...

  6. Kafka实战-入门

    1.概述 经过一个多月的时间观察,业务上在集成Kafka后,各方面还算稳定,这里打算抽时间给大家分享一下Kafka在实际场景中的一些使用心得.本篇博客打算先给大家入个门,让大家对Kafka有个初步的了 ...

  7. 一句命令修复Xcode6.2插件失效的问题

    Xcode升级到6.2之后XVim无法使用了. 打开终端输入: find ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins - ...

  8. hiveServer2 和 metastore的一点解读。

    刚看了hive官网的文档,对于一些概念结合自己的经验,似乎又多了一些理解,想一想还是记下来的好,一来我是个有些健忘的人,过一段时间即便忘了,循着这个帖子,也能快速把知识点抓起来:二来或许对别人也有些启 ...

  9. filezilla通过root账户远程连接管理ubuntu server服务器文件

    前言: 准备重温一下今天在工作中遇见的一个问题,在刚刚安装上的server上测试,做好的文件不是很好传到server项目目录,于是使用了filezilla这个工具,它可以使用ssh来连接,于是乎就引入 ...

  10. 打印小票,使用的是BarcodeLib

    打印 private void Control_Click(object s,EventArgs e) { if (((Control)s).Name == "button1") ...