认识了解jQuery

学习网站

为什么要用 jQuery

  • DOM API
    -- 难用,很难记住;
    -- 存在兼容性问题;
    -- 功能太少,不能与时俱进,浏览器更新了,才可以使用新的语法。
  • jQuery
    -- 兼容性好;
    -- API 友好,和语义的理解很接近;
    -- 功能强大,与时俱进。

什么时候适合用 jQuery

  • DOM 操作较多(事件监听)
  • 简单的 AJAX
  • 需要兼容多款浏览器

什么时候不用 jQuery

  • 页面交互极为简单,兼容性不高
  • 页面对流量有苛刻的要求,比如在弱网络上
  • 上级强制、团队已经有了 jQuery 的代替品

jQuery 做什么

jQuery是一个库,是一个工具包,里面有各种各样的小工具,包括

  • 选择网页元素
  • 改变结果集
  • 元素的操作:取值和赋值
  • 元素的操作:移动
  • 元素的操作:复制、删除和创建
  • 工具方法
  • 事件操作
  • 特殊效果
  • AJAX
  • http://devdocs.io/jquery/

jQuery版本

  • jQuery1.xx兼容IE678,文件大,体积大
  • jQuery2.xx不在兼容IE678,体积小

jQuery 的两种 API(使用方式)

//1. $.(函数名)
$.noConflict()
$.each()
//2. $.(元素选择器).(函数名)
$('ul').addClass()
$('p').text('hi')

jQuery的ready,window.onload和$(handler)的区别

  • window.onload事件,是指页面上所有的元素加载完成之后(包括图片等),再去执行函数。要把Js语句放到前面,要加一个Onload。
  • $(handler)是指页面上DOM元素加载完就可以执行函数。
    handler是页面要处理的执行函数。也就是说把要执行的语句放到()里面,就可以实现把JS放在任何位置,无论是head还是body里面都可以。 `().reday(handler)(this is not recommended)`
  • window.onload的执行时间太长,要等所有的加载完成才会执行JS。

jQuery选择器

使用jQuery获取元素

jQuery定义了一套选择器规则,和CSS选择器目的一样,都是为了选择出符合特定规则的元素。了方便使用者jQuery刻意和CSS选择器使用相同的语法,几乎支持所有类型的CSS3选择器,当然也有一些其特定的选择器。
在这里http://jquery.cuishifeng.cn/直接查找响应的API即可。

  • jquery和DOM的区别
    $('xxx')选出来的元素是jQuery对象,可以理解成是对DOM元素的一次封装,和本身的原生DOM不是一个。即
$('xxx') === document.querySelector('xxx')
结果为false 

当用$选择一些元素时,获取的是JQuery对象,所以只能使用jQuery方法。所以API是jQuery对象的API,不是原生DOM 的API。

$('xxx').html('123')  // true
document.querySelector('xxx').html('123')   // false
document.querySelector('xxx').innerHTML = '123'    // true
  • jQuery对象和原生对象的转换
$('xxx')[0]  // jQuery对象就可以转换成原生对象
$('xxx')[0].innerText = '123'    // true
$(document.querySelector('xxx'))  //DOM对象就可以变成jQuery对象。
$(document.querySelector('xxx')).html('123')  // true
  • 获取到jQuery对象并且想得到其中的某一项,用.eq()方法
$('xxx').eq(n)  // 得到的是jQuery对象

兄弟元素获取

  • .next([selector]), .prev([selector])
    next取得匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合。如果提供一个选择器,那么只有紧跟着的兄弟元素满足选择器时,才会返回此元素。prev正好相反,获取元素之前的同辈元素
$('.test').next();
$('.test').prev('li');
.nextAll([selector]), .prevAll([selector])
nextAll获得每个匹配元素集合中每个元素所有后面的同辈元素,选择性筛选的选择器,prevAll与之相反,获取元素前面的同辈元素
  • .siblings([selectors])
    获得匹配元素集合中每个元素的兄弟元素,可以提供一个可选的选择器
$('li.third-item').siblings()
  • 父子元素获取.parent([selector])
    取得匹配元素集合中,每个元素的父元素,可以提供一个可选的选择器
$('li.item-a').parent()
  • .parents([selector])
    获得集合中每个匹配元素的祖先元素,可以提供一个可选的选择器作为参数
$('li.item-a').parents('div')
  • .children([selector])
    获得匹配元素集合中每个元素的子元素,选择器选择性筛选
$('ul.level-2').children()
  • .find([selector])
    查找符合选择器的后代元素
$('ul').find('li.current');
筛选当前结果集
  • .first() === .eq(0)
    获取当前结果集中的第一个对象
  • .last() === .eq(n-1)
    获取当前结果集的最后一个对象
  • .filter(selector), .filter(function(index))
    筛选当前结果集中符合条件的对象,参数可以是一个选择器或者一个函数
$('li').filter(':even')
$('li').filter(function(index) {
  return index % 3 == 2;
})
  • .not(selector), .not(function(index))
    从匹配的元素集合中移除指定的元素,和filter相反
  • .is(selector), is(function(index)), is(dom/jqObj)
    判断当前匹配的元素集合中的元素,是否为一个选择器,DOM元素,或者jQuery对象,如果这些元素至少一个匹配给定的参数,那么返回true
    if ( $target.is("li") ) {
    $target.css("background-color", "red");
  }
  • .has(selector), .has(dom)
    筛选匹配元素集合中的那些有相匹配的选择器或DOM元素的后代元素
$('li').has('span')

jQuery DOM操作

创建元素

只需要把DOM字符串传入$方法即可返回一个jQuery对象

var obj = $('<div class="test"><p><span>Done</span></p></div>');
$('div') //创建了一个div
$('<div id = "header>xxxx</div>')   // 创建一个DOM元素

添加元素

  • .append(content[,content]) / .append(function(index,html))
  1. 可以一次添加多个内容,内容可以是DOM对象、HTML string、 jQuery对象
  2. 如果参数是function,function可以返回DOM对象、HTML string、 jQuery对象,参数是集合中的元素位置与原来的html值
var li = $('<li>4</li>')
$('.container #wrap').append(li) 
//在最末尾添加一个li
  • .appendTo(target)
    把对象插入到目标元素尾部,目标元素可以是selector, DOM对象, HTML string, 元素集合, jQuery对象;
var li = $('<li>4</li>')
li.appendTo($('.container #wrap'))
//在最末尾添加一个li
  • .prepend(content[,content]) / .prepend(function(index,html))
    向对象头部追加内容,用法和append类似,内容添加到最开始
var li2 = $('<li>0</li>')
$('.container #wrap').prepend(li2)
//在最开始添加一个元素li
  • .prependTo(target)
    把对象插入到目标元素头部,用法和prepend类似
var li2 = $('<li>0</li>')
li2.prependTo($('.container #wrap'))
//在最开始添加一个元素li
  • .before([content][,content]) / .before(function)
    在对象前面(不是头部,而是外面,和对象并列同级)插入内容,参数和append类似
var div = $('<div>llll</div>')
$('.container').before('div')
//在.container的整体外部前面添加一个div。
  • .insertBefore(target)
    把对象插入到target之前(同样不是头部,是同级)
var div2 = $('<div>22222</div>')
div2.insertBefore($('.container'))
//在.container的整体外部前面添加一个div。
  • .after([content][,content]) / .after(function(index))
    和before相反,在对象后面(不是尾部,而是外面,和对象并列同级)插入内容,参数和append类似
var div = $('<div>llll</div>')
$('.container').after('div')
  • .insertAfter(target)
    和insertBefore相反,把对象插入到target之后(同样不是尾部,是同级)
var div2 = $('<div>22222</div>')
div2.insertAfter($('.container'))

删除元素

  • .remove([selector])
    删除被选元素(及其子元素)
$('#wrap').remove()
  • .empty()
    清空被选择元素内所有子元素,但是自身还存在
$('.container').empty()
  • .detach()
    .detach() 方法和.remove()一样, 除了 .detach()保存所有jQuery数据和被移走的元素相关联。当需要移走一个元素,不久又将该元素插入DOM时,这种方法很有用

包裹元素

  • wrap(wrappingElement) / .wrap(function(index))
    为每个对象包裹一层HTML结构,可以是selector, element, HTML string, jQuery object
    image.png
  • .wrapAll(wrappingElement)
    把所有匹配对象包裹在同一个HTML结构中
    image.png
  • .wrapInner(wrappingElement) / .wrapInner(function(index))
    包裹匹配元素内容
    image.png
  • .unwrap()
    把DOM元素的parent移除
  • html([string])
    这是一个读写两用的方法,用于获取/修改元素的innerHTML
  1. 当没有传递参数的时候,返回元素的innerHTML
  2. 当传递了一个string参数的时候,修改元素的innerHTML为参数值
    看个例子
$('div').html()
$('div').html('123')

后续这种读写两用的方法很多,原理都类似
如果结果是多个进行赋值操作的时候会给每个结果都赋值
如果结果多个,获取值的时候,返回结果集中的第一个对象的相应值

  • text()
    和html方法类似,操作的是DOM的innerText值

jQuery事件

事件处理中最头疼的就是浏览器兼容问题,jQuery封装了很好的API,可以方便的进行事件处理
在1.7之前的版本中jQuery处理事件有多个方法, (google 搜索: jquery live bind degelate)作用各不相同,后来统一的使用on(绑定事件)/off(解绑事件)方法

.on( events [,selector ] [,data ], handler(eventObject) )

  1. 各参数含义
  • events:一个或多个空格分隔的事件类型和可选的命名空间,或仅仅是命名空间,比如"click", "keydown.myPlugin", 或者 ".myPlugin"
  • selector:一个选择器字符串,用于过滤出被选中的元素中能触发事件的后代元素。如果选择器是 null 或者忽略了该选择器,那么被选中的元素总是能触发事件
  • data:当一个事件被触发时,要传递给事件处理函数的event.data
  • handler(eventObject):事件被触发时,执行的函数。若该函数只是要执行return false的话,那么该参数位置可以直接简写成 false
//普通事件绑定,最简单的用法
$('div').on('click',function(e){
  console.log(this)
  console.log(e)
});

//事件委托或事件代理,想让div下面所有的span绑定事件,可以把事件绑定到div上。
$('div').on('click','span',function(e){
  console.log(this)
  console.log(e)
});

//便于事件的分类及解绑
$('.box>ul').on('click.hello','li',function(){
   ......
    }
 $('.box>ul').off('click.hello')
    //添加.hello的作用是:便于解绑事件。对某个事件进行了多次绑定的时候,其他的绑定事件没有被解绑,只有添加了.hello的绑定被解绑了

//可以在绑定的饿时候给事件处理程序传递一些参数
$('div').on('click',{name:'lili',age:23},function(e){
  console.log(e.data) //可以获取到{name:'lili',age:23}
});

//事件的简写
$('.box>ul').click(function(){
  .....
})
//因为对应的事件类型,都有其对应的方法。
或者
  1. 事件代理,事件委托的例子
<body>
  <div class = "box">
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
    
  </div>
  <input id = "input" type = "text">
  <button id = 'btn'>添加</button>
  <div id = "wrap"></div>
  
  <script>
    //当点击li的时候,.wrap里面展示对应的文字
    /*
    $('.box>ul>li').on('click',function(){
      //this是原生对象的方法,要把它转换成jQuery对象$(this)
      var str = $(this).text() (=== var str = this.innerText())
      $('#wrap').text(str)
    })*/
    //通过inut添加的元素点击无法展现内容,所以使用事件代理
    $('.box>ul').on('click','li',function(){
      //this是原生对象的方法,要把它转换成jQuery对象$(this)
      var str = $(this).text()
      //this仍然代表点击的元素li
      $('#wrap').text(str)
    }
    //当点击添加的时候,要把input里面的内容添加到ul中,作为ul的最后一个元素
    $('#btn').on('click',function(){
      //获取input元素里面的值
      var value = $('#input').val()
      $('.bix>ul').append('<li> +value+ </li>')
    })
  </script>
</body>

.off( events [, selector ] [, handler ] )

移除一个事件处理函数

$('.box li').off('click')

.trigger( eventType [, extraParameters ] )

触发事件,根据绑定到匹配元素的给定的事件类型执行所有的处理程序和行为

$('li').eq(2).trigger('click')
//不需要用户点击,自动触发了点击事件
//也就是通过操作js模拟用户的点击

其他事件相关文档:https://www.jquery123.com/category/events/browser-events/

jQuery属性&CSS操作

属性相关

  • .val([value])
    这是一个读写双用的方法,用来处理input的value,当方法没有参数的时候返回input的value值,当传递了一个参数的时候,方法修改input的value值为参数值
$('input').val()
$('input').val('newValue');
//原生DOM的方式
$('input')[0].value = '123'
  • .attr()
  1. .attr(attributeName):获取元素特定属性的值
  2. .attr(attributeName,value) / .attr(attributesJson) / .attr( attributeName, function(index, attr) ):为元素属性赋值
$('#ipt').attr('type')  // 获取type的值
$('#ipt').attr()   //报错
$('#ipt').attr('type','checkbox')  //设置type的值
$('xxx').attr('id')  //读取ID的值
  • .removeAttr()
    为匹配的元素集合中的每个元素中移除一个属性(attribute)。.removeAttr() 方法使用原生的 JavaScript removeAttribute() 函数,但是它的优点是可以直接在一个 jQuery 对象上调用该方法,并且它解决了跨浏览器的属性名不同的问题。
  • .prop()/.removeProp()
    这两个方法是用来操作元素的property的,property和attibute是非常相似的概念,感兴趣可以看看jQuery的attr与prop

CSS相关

  • .css()
    这是个和attr非常相似的方法,用来处理元素的css
$('xxx').css({height: '30px','border':'1px solid red'})
//原生js
var xxx = document.querySelector('xxx')
xxx.style.backgroundColor = 'blue'
  • .css(propertyName) / .css(propertyNames)
    获取元素style特定property的值
  • .css(propertyName,value) / .css( propertyName, function(index, value) ) / .css( propertiesJson )
    设置元素style特定property的值
  • .addClass(className) / .addClass(function(index,currentClass))
    为元素添加class,不是覆盖原class,是追加,也不会检查重复
  • .removeClass([className]) / .removeClass(function(index,class))
    移除元素单个/多个/所有class
  • .hasClass(className)
    检查元素是否包含某个class,返回true/false
  • .toggleClass(className)
    toggle是切换的意思,方法用于切换,switch是个bool类型值,
    image.png

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