7. 强大的jQuery

jQuery一款用原生JS封装的,操作DOM的类库: 它里面封装了大量的方法(在原先的版本v1.xxx中,这些方法兼容所有的浏览器),基于这些方法我们可以快速的进行DOM操作和项目开发;

API 源码 http://jquery.cuishifeng.cn/

JQ三大版本

  • v1.xxx
  • jquery-1.11.3.min.js
    第一代版本的特点:大而全,方法是兼容所有浏览器(包括IE6),主要应用于需要考虑兼容的PC端项目中;
  • v2.xxx
    主要是为了移动端的开发准备,不在兼容低版本浏览器(例如IE8一下),配合出现的还有jQuery mobile 等UI库,但是第二代版本在移动端方面的处理不如Zepto.js;
  • v3.xxx 第三代版本
    也不再兼容IE低版本浏览器了,从性能等方面都要比直线的强,但是angular/vue/React这种框架崛起;

JQ中常用的方法

1、获取DOM元素

**操作方法:JQ选择器(根据选择器类型快速获取需要的元素);**
  $([selector],[context])`
  $('#box')
  $('.box')
  $('.box a')
  $('a',box)
  
JQ支持的选择器,传统CSS3中的大部分都支持、还支持一些自己独有的,
  如:
:eq(n)获取索引为n的;
:gt(n)大于这个索引的;
:lt(n)小于这个索引的; 

**节点之间关系的属性;**

用JQ选择器获取的元素,我们设置变量名的时候一般都以$开始;
let $box = $('.box');
$box.children('a');
$box.find('a');获取对应的后代元素
$('a').filter('.active'); 同级筛选(在所有的A中筛选出具备CLASS=’active‘样式雷的A)
$box.prev();获得上一个哥哥,// 可以在括号内加标签名获取上一个哥哥元素内标签为P 的
$box.preAll();所有哥哥元素
$box.next();获得下一个弟弟元素
$box.nextAll();所有弟弟
$box.siblings();获取所有兄弟弟
$box.index();获取索引
$("p").parent();获取父元素
$("p").parent();获取所有的祖先元素,一直到document;

2、DOM的增删改

let str = `<div id="box" class='box'>
...
</div>`;

$("p").add("<span>Again</span>");创建P添加span;
[ <p>Hello</p>, <span>Hello Again</span> ]
$('body').append(str);追加到容器BODY的末尾
$(body).html(str);  等价于innerHTML
$(body).html();   不传参是获取BODY中的HTML内容,除了这个方法还有text方法,等价于innerText;


..............................................
$A.insertBefore($B); 把`$A`放在`$B`前面(`$A,$B`都是页面中已经存在的东西), insertAfter 放在元素后面
$A.insertAfter($B); //=>把$A放到$B的后面
$(`<div id="box" class='box'>
    哈哈
</div>`).insertBefore($A)  需要把新增加元素放到$A前面,需要把字符串用$()包起来,相当于创建了一个元素
   
..................................................................
$A.appendTo($B); //=>   `$B.append($A) `在\$B容器的末尾追加$A
$A.prependTo($B);  //=>`$B.prepend($A)` 在\$B容器的开头追加$A

..................................................................
$A.clone();  //=>实现元素的克隆
$A.remove(); //=>实现元素的删除

..................................................................
//=>操作表单元素的内容
$inp.val()     获取表单元素内容
$inp.val('AAA')      设置表单元素内容
//html和text方法是操作非表单元素内容的

3、操作自定义属性

$box.attr('data-type');获取自定义属性值;
$box.attr('data-type','B');设置自定义属性值;
$box.attr({
    'type':1,
    'name':'AA'
    }); 批量设置
$box.removeAttr('data-type') ; 移除自定义属性
  表单元素一般使用prop或者removeProp
$radio.prop('checked');
$radio.prop('checked',true);

4、操作CSS样式(盒子模型属性)

**设置样式**
$box.css('width',200); css 方法是设置或批量设置样式(原理是设置STYLE行内样式);
$box.css({with:200,height:200}),写的值不加单位,方法会帮我们自动设置上px单位;
$box.addClass('active')  设置样式类(原理是对className的操作),`removeClass`验证是否存在某个样式类;
toggleClass 之前就是移除,没有就是新增;
**获取样式**
$box.css('width')    不设置值的时候就是获取  (原理是 getComputedStyle,所有经过计算的样式都可以获取);
$box.offset() 当前元素距离BODY的左偏移和上偏移;
$box.position()  当前元素距离父级的左偏移和上偏移
$box.innerWidth/.innerHeight/.outerWidth/.outerHeight() //=>等价于clientWidth/Height 和 offsetWidth/Height
$(document).scrollTop([val]); //=>可以获取或者设置scrollTop的信息,对应的方法 .scrollLeft
$box.width();获取盒子宽高(传递值进来就是设置)

5、获取样式

$box.css('width'); //=>不设置值的时候就是获取(原理是getComputedStyle,所有经过计算的样式都可以获取)
$box.offset(); //=>当前元素距离BODY的左偏移和上偏移
$box.position(); //=>当前元素距离父参照物的左偏移和上偏移
$box.innerWidth/.innerHeight/.outerWidth/.outerHeight() //=>等价于clientWidth/Height 和 offsetWidth/Height
$(document).scrollTop([val]); //=>可以获取或者设置scrollTop的信息,对应的方法 .scrollLeft

事件处理

//=>事件处理**strong text**
$元素.on([event type],[function])
$元素.off([event type],[function])
$元素.bind()  $元素.unbind()  $元素.delegate() ...
$元素.click() .mouseover .mouseout ...等常用事件的快捷绑定
$box.on('click',function(){});
$box.click(function(){});

//=>动画处理
.animate([目标样式],[总时间],[运动方式],[运动完做的事情])
.stop / .finish
$box.stop().animate({
    top:100,
    left:200
},1000,'linear',function(){});

//=>AJAX请求处理
let _DATA=null;
$.ajax({
    url:'json/product.json',
    method:'GET',
    async:false,
    dataType:'json',
    success:result=>{
        //result:当请求成功执行success函数,result就是从服务器获取的结果
        _DATA=result;
    }
});

//=>常用的工具方法
$.each([数组、类数组、对象],function(index,item){
    //=>遍历数组中的每一项 index:索引 item:当前循环这一项(对象:index是属性名 item属性值)
});
$('A').each(function(index,item){});

$.toArray()转换为数组  $.merge()数组合并  $.makeArray()把类数组转换为数组  $.uniqueSort()去重加排序  $.type数据类型检测 ...

JQ源码

基于JQ选择器创建出来的是JQ类的一个实例,就可以调取jQuery.prototype上的方法
1.创建出来的JQ实例是一个类数组(JQ对象) 基于makeArray创建出来的
2.SELECTOR支持三种数据格式

  • [STRING]
    • 选择器 $('.box')
    • 创建元素 $('<div>...</div>')
  • [元素对象:JS原生对象]
    • 把原生JS对象转换为JQ对象(只有这样才能调取JQ中的方法)
    • 把JQ对象转换为原生对象,直接基于索引获取即可,例如:$A[0],真实项目中建议大家使用JQ自带的get方法实现,因为它更加完善,可以支持负数索引 $A.get(0)
    • eq方法也是根据索引获取集合中的某一项(也支持负数索引),只不过返回的结果不是原生JS对象,依然是JQ的一个实例
  • [函数]
    • $(function(){}) 等待页面中的DOM结构加载完成再执行函数,等价于 $(document).ready(function(){})

JQ方法
jQuery给我们提供的方法放到了两个位置上

1.原型上 jQuery.prototype={get:...}
$().get()
只有jQuery的实例才可以调用

2.对象上 jQuery.ajax=...
$.ajax()
直接调取使用

JQ中只有一个EACH:用来遍历数组、对象、类数组中的每一项的,$a.each()最后也会转换为$.each($a)这种模式

each: function (callback) {
    //this:$navList
    return jQuery.each(this, callback);
}
each: function (obj, callback) {
    var length, i = 0;
    if (isArrayLike(obj)) {
        length = obj.length;
        for (; i < length; i++) {
            if (callback.call(obj[i], i, obj[i]) === false) {
                //=>每循环一次,执行一次函数,把函数中的this设置为循环项
                //传递索引和循环项
                break;
            }
        }
    } else {
        for (i in obj) {
            if (callback.call(obj[i], i, obj[i]) === false) {
                break;
            }
        }
    }
    return obj;
}

检测当前对象是数组还是类数组

function isArrayLike(obj) {
    // Support: real iOS 8.2 only (not reproducible in simulator)
    // `in` check used to prevent JIT error (gh-2145)
    // hasOwn isn't used here due to false negatives
    // regarding Nodelist length in IE
    var length = !!obj && "length" in obj && obj.length,
        type = toType(obj);
    if (isFunction(obj) || isWindow(obj)) {
        return false;
    }
    return type === "array" || length === 0 ||
        typeof length === "number" && length > 0 && (length - 1) in obj;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容

  • 22、JQ的基础语法、核心原理和项目实战 jQ的版本和下载 jQuery版本 1.x:兼容IE6-8,是目前PC端...
    萌妹撒阅读 1,742评论 0 0
  • 一:认识jquery jquery是javascript的类库,具有轻量级,完善的文档,丰富的插件支持,完善的Aj...
    xuguibin阅读 1,706评论 1 7
  • 一、样式篇 第1章 初识jQuery (1)环境搭建 进入官方网站获取最新的版本 http://jquery.co...
    凛0_0阅读 3,358评论 0 44
  • 第一章 jQuery简介 1-1 jQuery简介 1.简介 2.优势 3.特性与工具方法 1-2 环境搭建 进入...
    mo默22阅读 1,578评论 0 11
  • 1、轮播效果 2、弹出广告 3、隔行换色 4、全选、取消全选 5、省市联动 6、左右选中
    最美下雨天阅读 112评论 0 0