JQ的核心原理及常用方法

JQ的版本和下载

版本
1.x:兼容IE6-8,目前PC端开发常用的类库
2.x/3.x:不支持IE6-8,移动端一般用zepto.js
下载
官网下载: jquery.com
Github:https://github.com/jquery/jquery/ 源码
http://code.jquery.com
Node的npm包管理器下载npm install jquery(@1.11.3) 下载最新(指定版本)

JQ核心原理

方法类库,提供许多属性和方法(处理了浏览器兼容处理和一些细节优化)
jQuery本身是一个类,是基于构造函数模式构建的一个类库

var jQuery = function(selector, context){
  // jQuery.fn 就是它的原型,在它的原型上找init方法
  return new jQuery.fn.init(selector, context);
};
// 把原型上的方法都放在一个对象里(批量扩展类原型上的方法),
// 需要手动修改constructor
// 把这些方法放在原型上供实例使用
jQuery.fn = jQuery.prototype = {
  jquery: version,
  constructor: jQuery,
  ....
};
.....
init = jQuery.fn.init = function( selector, context ) {
  if ( !selector ) {
    return this;
  }
  if(typeof selector === "string"){ // 如果是字符串类型
    ...
  }else if(selector.nodeType){ // 如果是个元素节点(nodeType为1)
    ...
  }else if(jQuery.isFunction(selector)){  //如果是一个函数
    
  }
  // 返回创建的一个类数组
  return jQuery.makeArray( selector, this );
}

init.prototype = jQuery.fn;  // init的实例用的也是jQuery的原型
// 创建一个类数组
makeArray: function( arr, results ) {
    var ret = results || [];
    return ret;
},
....

window.jQuery = window.$ = jQuery;  // 把jQuery暴露在全局下

执行jQuery的时候,执行jQuery.fn.init,该方法构造出了一个类数组,让init的原型指向jQuery的原型,返回init的实例就相当于返回了一个jQuery的实例,init()就相当于jQuery类库的一个入口
$()/jQuery()操作都是在创建一个JQ实例,两者相同($===jQuery),这些实例都是类数组,称作JQ对象,可以使用JQ原型上提供的共有属性和方法
$()称为JQ的选择器(笼统),执行JQ方法,创造JQ的一个实例;执行这个方法可以传递一个selector参数,通过selector可以获取到需要操作的DOM元素集合(JQ类数组集合),第二个参数context是当前获取元素的上下文,不传递默认是document
selector参数支持传递三种格式:

  • 传递string,就是选择器,通过选择器获取元素
  • 传递元素对象,把JS原生对象转为JQ对象
  • 传递函数,代表等DOM结构加载完成再执行对应的JS代码(类似于window.onload)

$===jQuery -> true
$()===jQuery() -> false两个不同的实例
$() instanceof jQuery -> true

var $demo = $();
$demo:

  • 0: 某一个元素对象
  • length:类数组的长度
  • context:document
  • selector:'' 传递的选择器
  • _proto_:jQuery.prototype
    ....
// 获取一个不存在的元素
// 原生JS
var box = document.getElementById('box');
console.log(box); // 结果为undefined
// JQ
var $box = $('#box');
console.log($box); // 结果是一个空集合而不是undefined

一般CSS/CSS3中支持的选择器JQ选择器都支持

JQ对象和原生JS对象的转换

1、JQ转JS

var oBox = document.getElementById('box');  // 原生JS对象 不能使用JQ原型上的方法
var $box = $(oBox);  // 转换
$box.addClass();  // 此时的$box是JQ对象,可以使用JQ原型上的方法
JS-JQ

2、JS转JQ

var $body = $(body);  // JQ对象 不能使用原生JS的方法
$body[index];  // 在集合中获取指定索引的内容,即为原生JS对象

$body.get(index) <=> $body[index]
$body.eq(index);  // 在集合中获取指定索引的内容,但结果仍是JQ对象

selector传递一个方法时

$(function(){
  // 当页面中DOM结构加载完成,就会执行回调函数
  // window.onload:等到页面中DOM结构以及资源文件都加载完成执行相应JS代码
});
等价于
$(document).ready(function(){
});

1、$(function(){})利用了DOM二级事件绑定,可以执行多次,监听的是DOMContentLoaded事件,DOM结构加载完成就会触发执行
2、window.onload资源加载完才会执行,使用的是DOM零级事件绑定,一个页面中只能使用一次

JQ既是一个类也是一个对象

jQuery作为一个类,jQuery.prototype上设置的属性和方法是供JQ实例(DOM集合或元素)使用的属性和方法,即,使用来操作DOM的,比如:
addClass 增加样式类名
css:设置或者获取或者批量获取样式
removeClass:移除样式类名
.......
jQuery作为普通对象,也有一些属性和方法,但跟实例没有关系,都是工具类的方法
ajax
isFunction
unique:数组去重

jQuery原型上常用的方法
$('#box').index(); //-> 获取当前元素的索引,前面有几个兄弟索引就是几,若只有这一个元素,其索引为0
$('body').data(key, value) // 在body元素上存取数据
$('body').data(key) // 在body元素上取数据
$('body').removeData(key); // 在body元素上移除数据

在HTML5规范中div上读取预存的data-[key]值
<div data-xxx="test" ></div> // 存
$("div").data("xxx"); // test
对属性的操作
$("div").attr() // (批量)设置或获取当前元素的属性(自定义/内置)
$("div").removeAttr() // 移除前元素的属性
$("div").prop() // 操作表单元素的属性
$("div").removeProp() // 移除表单元素的属性
addClass/removeClass/toggleClass // 增加/移除样式类名
toggleClass // 当前样式名有就移除没有就增加(toggle前缀就是切换的)
hasClass // 验证当前样式名是否存在
$('#box').html([val]) // 不传递val就是获取内容,传递就是设置内容等价于原生JS中的innerHTML
$('input').val([val]) // 表单元素的设置或获取
css // 设置或者获取或者批量获取样式,获取到的结果没有去单位
offset() // 获取元素在当前视口的相对偏移,返回top 和 left两个整型属性
position() // 获取元素相对父元素的偏移,返回top 和 left
scrollTop/scrollLeft([val]) // 设置/获取当前元素卷去的高度/宽度
width/height // 元素的宽/高
innerWidth/innerHeight // = clientWidth/clientHeight
outerWidth/outerHeight // = offsetWidth/offsetHeight

$('#box').on('click', function(){}) // 事件绑定
append/appendTo //添加到末尾
parent.append(son) // 给父元素添加一个子元素
son.appendTo(parent) // 把一个元素追加到其父元素的末尾
prepend/prependTo // 添加到开头
逻辑同append
$('#box').remove() // 移除当前盒子
$('#box').clone(true) // 深度克隆当前盒子 除样式之外,内容也一并克隆

jQuery对象常用的方法
\$.noConflict() 若项目中同时引用了两个用$操作的类库,该方法可以转让$的使用权,
var j = \$.noConflict() j此时就可以用来代表原始$,jQuery执行也可以
var j = \$.noConflict(true) 表示把$和jQuery的使用权都转让出去,现在只能使用j()进行操作

// noConflict()方法源码
var _$ = window.$,
      _jQuery = window.jQuery;
jQuery.noConflict = function(deep) {
  if( window.$ === jQuery){
    window.$ = _$;  // 转让$
  }
 if( deep && window.jQuery === jQuery){
    window.jQuery = _jQuery;  // 深度转让jQuery
  }
  return jQuery;  // 返回jQuery给新的变量,就可以使用新变量来执行操作了
}

\$.ajax() 封装ajax,帮助我们发送请求

常用方法

筛选方法

filter:同级过滤
children:子集过滤
find:后代过滤
prev:获取上一个兄弟元素
prevAll:获取所有哥哥元素
next:获取下一个兄弟元素
nextAll:获取所有弟弟元素
siblings:获取所有兄弟元素
parent:父亲元素
parents:所有祖先元素(一直到HTML为止)

//  filter二次筛选
var $links = $('a');  // 获取所有a标签集合
$links.filter('.bg');  // 在集合中获取到样式类为.bg的元素集合

//  children
$('#box').children('a');  // 筛选出box子元素中带a标签的元素集合
<=> $('#box>a')

// find
$('#box').find('.bg');     // 筛选出box后代中样式类为.bg的元素集合
<=> $('#box .bg')

$('#box').prev('a');  // 获取上一个a标签的兄弟元素,不指定就是上一个任意标签兄弟元素

each

JQ原型上的each:遍历JQ对象中的每一项
对象上的each:不同于遍历jQuery对象的 $().each() 方法,此方法可用于遍历任何对象,包括数组,类数组,对象等
内置的each:要用原型上的each处理,JQ内部调用

// JQ原型上each的用法
$("img").each(function(index, item){
   // 参数顺序和数组的forEach相反
   // $(this) -> 当前遍历这一项 JQ对象
 });

// 对象上的each
$.each([对象], function(index, item));  // 对象可以是数组,类数组,对象
// 对对象,回调函数中的this是value;for in循环遍历对象,共有属性和方法也会遍历到
// 对数组,回调函数中的this是item

// 内置的each
$('div').addClass('box');  // 会给每个获取的div都增加样式类名,内部调用each
$('div').css('width'); // 获取的时候只返回第一个,设置是批量

extend

$extend():把方法扩展到JQ对象上,这个操作一般是用来完善类库的
$.fn.extend():把方法扩展到JQ原型上的,供实例使用,一般用来写JQ插件

// 扩展工具方法,完善类库
$.entend({
  aa: function(){}
});
$.aa();  // 执行

// 扩展到JQ原型上的,供实例使用
$.fn.extend({
  bb: function(){
    // this->操作当前方法的JQ实例
  }
});
$('xxx').bb();   // 执行

extend

JQ中提供了元素运动的动画库
stop:结束当前元素正在运行的动画,执行下一个新动画(实现动画必会执行)
finish:类似stop,finish会立即跳到当前动画的目标位置再继续下一个,而stop则是当前停止的位置开始执行下一个动画
animate([target], [duration], [effect], [callback])

  • [target]:对象
  • [duration]:MS
  • [effect]:linear,ease, ease-in, ease-out,ease-in-out
  • [callback]:回调函数,动画结束时做的事情
    show(1000/fast/slow)
    hide
    toggle
    fadeIn
    fadeOut
    fadeToggle
    slideUp
    slideDown
    slideToggle
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,474评论 1 45
  • 一:认识jquery jquery是javascript的类库,具有轻量级,完善的文档,丰富的插件支持,完善的Aj...
    xuguibin阅读 1,708评论 1 7
  • 通过jQuery,您可以选取(查询,query)HTML元素,并对它们执行“操作”(actions)。 jQuer...
    枇杷树8824阅读 655评论 0 3
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,182评论 0 3
  • 一、样式篇 第1章 初识jQuery (1)环境搭建 进入官方网站获取最新的版本 http://jquery.co...
    凛0_0阅读 3,380评论 0 44