Jquery
jQuery
前端开发在开始写js代码之前一般先要解决的两个问题。
1.解决js标准本身的兼容性问题,es5shim.js 只需要一百多行代码即可解决 2.解决DOM扩展部分的兼容性问题。 需要一万行代码,经过江湖厮杀,最终jQuery称霸。
//第一个引入的js库用来解决兼容性问题
<!-- <script src="jquery.js></script>
<script src="header.js></script>
<script src="footer.js></script> -->
分开引入的js文件一定要解决一个问题, 不能污染全局作用域
var getElement = function(selector){
if( document.querySelector ){
return document.querySelector(selector)
}else{
console.error('please change you browers')
}
}
var a = getElement('.aaa')
两个问题 1.用户需要学习一门全新的语法。 2.用户需要避开库里面的所有全局变量。
实现原理
dom对象
javascript
var el = {
offsetWidth:12,
__proto__:HEMLDivElement
title:'aa'
__proto__:HEMLElement
src:'xxx.png'
__proto__:Element
getAttribute:fn;
__proto__:Node
nodeName:'IMG'
}
dom集合
var els = {
0:el,
1:el,
2:el,
length:3
__proto__:(并没有有价值的方法和属性)
}
jQuery对象
var els = {
0:el,
1:el,
2:el,
length:3
__proto__:
addClass:fn,
removeClass:fn,
tooggleClass:fn,
css:fn,
prop:fn,
........
}
jQuery是javascript的一个库 库就类似与一个仓库,以某种方式组织起来,存放方便易用函数的函数集合 jQuery库的优点: 1.全面解决pc端的兼容性问题 2.语法精炼,性能好。插件库非常庞大。
jQuery版本号之间的区别: 1.xxx->1.12 支持ie6-8 2.0 彻底的放弃了ie<10的支持。转向移动端开发 3.0
jQuery原理:
(function(){
var jQuery = function(selector){
var els = document.queryselectorAll(selector)
for( var i = 0;i < els.length ;i++ ){
this[i] = els[i]
}
this.length = els.length
}
jQuery.prototype.addClass = function(srt){
for(var i = 0;i < this.length ; i++ ){
this[i].classList.add(str)
}
}
var _d = function(){
return new jQuery(selector)
}
window.$ = _d
})()
- 理解javascript的关键点。 1.new的时候到底发生了什么 2.对象的原型链 3.函数身上一个属性(prototype)和一个方法(call) 4.this 的指向
jQuery的构造方法
1.构造一个空对象{} 2.把mao那个函数作为这个空对象的临时方法调用一次; 3.把mao那个函数身上的prototype那个属性拿来,作为自己原型链的一条 4.返回最终对象 每一个函数对象身上,都有一个其他对象不具备的属性,叫做。prptotype
$函数可以接受的参数类型。以及对应得返回值
选取元素 创建元素 $( ) * null => jquery对象(无键值,直接原型链) * 数组,对象集合 => 处理过的jQuery对象(键值length原型链) * 选择器 => 处理过的jQuery对象(键值/context/length/prevObject/selector/原型链) * html标签 => 处理过的jQuery对象(键值/context/length/prevObject/selector/原型链) * DOM集合 => 处理过的jQuery对象(键值/context/length/prevObject/selector/原型链) * DOM对象 => 处理过的jQuery对象(键值/context/length/原型链) * 函数 => 在函数加载完成的情况下直接调用
链式调用原理
var obj = {
width:100,
height:200,
addW:function(){
this.width += 10;
return this
//链式调用的时候,需要返回值为原集合
},
addH:function(){
this.height += 10;
return this
}
}
obj.addW().addW().addH().addH()
console.log(obj.width,obj.height)
jQuery中大多数方法都会返回一个jQuery集合 * 操作集合的方法返回的就是原集合 * 对集合做过过滤或者导致集合改变的一些方法返回改变后的jQuery集合 * $ .append这一类方法,当涉及到创建dom对象时,他们会返回创建完成后的一个jQuery集合 所以在jQueyr中链式调用很普遍 >只要返回结果是jquery集合 >那么即可使用链式调用
////链式调用
javascript
$('#selectors h1').width(500).height(200).css({color:'red'}).offset()
Object {top: 147.1875, left: 0}
jQuery中能使用的选择器
jQuery中选择器使用一个叫sizzle.js的库 从后往前找(在树中,着父元素只找一次,找子元素需要遍历) * parent > child 子选择器 父元素下的直接子元素 可以无限往下链
- prev + next 相邻一个选择器
-
prev ~ next 相邻所有选择器
- :eq()
- :even
- :odd
- :lt()
- :gt()
- :first
- :last
- :animated 所以有正在执行的jquery动画元素
- :header
- :lang() <div lang="spanish">找出属性中有lang属性的元素
- :root 找html当iframe引入
- :target 浏览器发生跳转时找跳转到那儿了
-
:not() $(‘li:not(.aa)’)选出li中没有.aa的元素
- :contains(n)标签元素包含内容n的元素
- :empty()$(‘p:empty’)内容为空的p标签
- :has() 可接受简单的选择器 $(‘li:has(p)’) 选取有p子元素的li
- :null() 可接受简单的选择器
-
:parent $(‘li:parent’) 有孩子的li,若li没有子元素,则不会选出来
- :visible 留下选中元素中可见的元素
-
:hidden 留下选中元素中隐藏的元素
- [attr] $(‘li[data-role]’)
- [attr=aa] $(‘li[data-role = aa]’)
-
[attr = aa] $(‘li[data-role != aa]’) -连字符 - [attr != aa] $(‘li[data-role]’)
- [attr * = aa] $(‘li[data-role]’) 包含内容
- [attr ^= aa] $(‘li[data-role]’) 以开头
- [attr ~= aa] $(‘li[data-role]’) 空格
-
[attr $= aa] $(‘li[data-role]’) 以结尾
- $(‘li:nth-child(1)’)
- $(‘li:first-child(1)’)
- $(‘li:last-child(1)’)
- $(‘li:only-child(1)’)
- $(‘li:nth-of-type(1)’)
- $(‘li:first-of-type’)
- $(‘li:last-of-type’)
- $(‘li:last-of-type()’)
- $(‘li:only-of-type’)
//中括号可链接写
javascript
$($0).next()
$($0).next().find('li')
$($0).next().find('li').css({color:red})
$($0).next().find('li:eq(n)').css({color:red})
//li中下标为n的元素的css样式改变
$($0).next().find('li:even').css({color:red})
//li中下标为偶数元素的css样式改变
$($0).next().find('li:first').css({color:red})
//li中下标为0的元素的css样式改变
$($0).next().find('li:last').css({color:red})
//li中下标最后一个元素的css样式改变
$($0).next().find('li:gt(5)').css({color:red})
//li中下标大于5的元素的css样式改变
$($0).next().find('li:lt(5)').css({color:red})
//li中下标小于5的元素的css样式改变
$($0).next().find('li:odd').css({color:red})
//li中下标为奇数的元素的css样式改变
# jQuery中的方法分为两类
1.直接出现在jquery函数对象身上,是一些基础性质的工具函数
2.出现在jQuery.fn函数对象的原型链上,用来批量(或者单个)操作jquery集合中的dom元素
- 大部分方法重载很严重
$('li').css('width');
//会取出集合中li元素中第一个元素的宽度
$('li').css('width','200');
//会设置集合中的所有元素的宽度为200
$('li').css({width:200,height:200,border:'1px solid black'})
//给选中的集合中的所有的元素,加上传入对象中的所有css样式
//给集合中的每一个元素 添加'width'这个属性
每一个元素的'width'属性值由第二个参数传入的函数来计算,也就意味着,jquery会对集合中的每一个元素调用回掉函数,调用的时候会传入两个参数,一个是当前元素在集合中的位置(0,1,2,3,4,5),另一个是当前元素现在的('width')值
$('li').css('width',function(){
return Math.random();
})
$('li').css({
width:function(){
return Math.random();
}
height:function(){
return Math.random();
}
backgroundColor:function(i){
return colors[i];
}
})
jQuery库的设计理念 1.解决兼容性问题 2.让从页面中查找元素变得轻松 3.提供很多内置方法,使对DOM集合的操作 变得更轻松 css addclass 这些方法通过内置的遍历去操作每一个DOM元素 jQuery不希望我们在循环中使用这些内置方法 ```javascript var els = document.querySelectorAll(“.item”); for(var i=0;i< els.length;i++){ $(els[i]).addClass(‘aa’); } $(‘.item’).addClass(‘aa’) //////////////// var colors = [‘red’,’blue’,’’]
//遍历一般为了1.给集合众的每一个DOM元素设置同样的值或行为
//遍历一般为了2.给集合众的每一个DOM元素设置不同的值或行为
1.$('li').attr('data-id');
2.$('li').attr('data-id','aaa')
3.$('li').attr('data-id',function(i){
return
})
4. $('li').attr({data-id:'AAA',data-role:'ccc'});
5. $('li').attr({data-id:function(i,w){return aa},data-role:function(i,w){return bb}}
6.以空格分开的字符串 addClass('a b c')移除多个removeClass('a b c')
节点操作
* .clone() 拷贝后得到的对象父元素等信息会丢失
给jQuery中添加子元素(正向可传入回调函数,反向不可)
返回值为,谁调用返回谁
* .append() 添加到最后一个子元素之后
* .prepend() 添加到第一个子元素之前
反向为(dom对象 dom集合 jquery对象 jquery集合 ‘选择器’)
* .appendTo() 把元素添加到指定元素的最后一个子元素之后
* .prependTo() 把元素添加到指定元素的第一个子元素之前
给jQuery中添加兄弟元素
* .after() 添加到本元素的后面
* .before() 添加到本元素的前面
反向为(dom对象 dom集合 jquery对象 jquery集合 ‘选择器’)
* .insertBefore() 添加本元素到某个元素的前面
* .insertAfter() 添加本元素到某个元素的后面
* .wrap() 给选定的n个元素的每一个外面包一个标签
* .wrapAll() 给选定的n个元素的外面包一个标签
* .wrapInner() 给选定的n个元素的每一个内容里面加一个标签
# TRAVERSING遍历
## Filtering过滤
* eq()
* first()
* last()
* is()
* has()
* not()
* filter()
* slice()
* map()
# Event
### on 的几种用法
* $('.item').on('click',function(){})
* $('.item').on('click',clickHandler)
* $('.item').on('click mouseleave mousenter',clickHandler)
* $('.item').on({
'click': fn1,
'mouseleave':fn2,
'mouseenter':fn3
})
> 事件委托的两种方式第二种将被废弃
* $('.item').on('click','selector',function(){})
* $('.item').delegate('selector','click',function(){})
> 目前的jquery中,主要使用on,off,one.triggle,triggleHandler,hover等
> 一些方法将被废除,如bind,delegate,die,live,unbind,undelegate,load,unload
## summary
1.on()的几种添加方式
* 一次绑定多个事件 用同一个处理函数
* 一次绑定多个事件 用不同的处理函数
2.事件委托的添加方式( 只能使用 on 和 delegate 方法 )
3.mouseover mouseout 方法由于事件冒泡带来的多次触发
一般我们使用mouseenter mouseleave以及hover( 对mouseenter 和mouseleave 的封装)
4.focus blur => focusin focuout 同上 后面两个不会冒泡
5.ready()事件一般用$(function(){})来替代
内部的处理方式是document.addEventListener('DOMContentLoaded');
如果文档结构(不包含图片,脚本等)已经加载完成,直接运行函数。
如果还没有加载完成 把函数绑定到"DOMContentLoaded"事件
6.trigger()会模仿浏览器触发事件(会冒泡) trigger不会
## Event Object
继承自原声事件对象
e.keyCode e.altKey e.target e.clientX
* e.currentTarget
```javascript
var qz = function(){
var aa = {a:1,b:2}
$($0).on('click',aa,function(e){
console.log(aa)
console.log(e.data)
})
setInterval(function(){
aa = {a:Math.random(),b:Math.random()}
},1000)
}
e.data用来取最初的原始值
e.relatedTarget用来获取鼠标离开后去了哪里
js中天然的异步(setInterval setTimeout)
- 事件
- 动画
- ajax
同步
- 正常的函数
- 正常的赋值
- 正常的逻辑运算
var a =function(){console.log(1)}
var b = function(){a();console.log(3)}
var c = function(r){b(),console.dir(r)}
var r = [1,2,3,4]
r.slice(0,2)
console.log(r)
c(r)
- .jquery 获取版本号
- .error() 报错
- .length 获取元素在页面中的数量
- .get 相当于下标
- .index a.index(b),返回b在a中的下标。a.index()返回a在他父元素的下标
-
.toArray 把jquery集合转化为数组
- .parseXML 在初期,java等不能解析超文本标记语言,所以需要做转化,转换出来后,也可当jquery对象进行操作