3. jQuery从入门到精通

1. 了解jQuery

1.1 是什么: What?

  • 一个JS函数库: write less, do more
  • 封装简化DOM操作(CRUD) / Ajax

1.2 为什么用它: why?

  • 强大选择器: 方便快速查找DOM元素
  • 隐式遍历(迭代): 一次操作多个元素
  • 读写合一: 读数据/写数据用的是一个函数
  • 链式调用: 可以通过.不断调用jQuery对象的方法
  • 事件处理
  • DOM操作(CUD)
  • 样式操作
  • 动画
  • 浏览器兼容

1.3 如何使用: How?

  • 引入jQuery库
    • 本地引入与CDN远程引入
    • 测试版与生产版(压缩版)
  • 使用jQuery
    • 使用jQuery函数: $/jQuery
    • 使用jQuery对象: $.xxx(执行$()得到的)

2. jQuery的2把利器

2.1 jQuery函数: $/jQuery

  • jQuery向外暴露的就是jQuery函数, 可以直接使用

当成一般函数使用: $(param)

  • param是function: 相当于window.onload = function(文档加载完成的监听)
  • param是选择器字符串: 查找所有匹配的DOM元素, 返回包含所有DOM元素的jQuery对象
  • param是DOM元素: 将DOM元素对象包装为jQuery对象返回 $(this)
  • param是标签字符串: 创建标签DOM元素对象并包装为jQuery对象返回
 <script src="js/jquery-1.10.1.js" type="text/jacascript"></script>
 <script type="text/javascript">
 	$(function(){
 		$('#btn').click(function(){
 		//this是什么?发生事件的dom元素(button)
 			alert($(this).html())
 			$('<input type="text" name="msg3"/><br/>').appendTo('div')
 		})
	})

当成对象使用: $.xxx

  • each(obj/arr, function(key, value){}) 隐式遍历数组
var arr=[1,2,3]
//隐式遍历数组
$.each(arr,function(index,item){
	console.log(index,item)
})
  • $.trim():去除两端空格
var str='   ljw   '
console.log(----+$.trim(str)+'----')

2.2 jQuery对象

  • 包含所有匹配的n个DOM元素的伪数组对象

  • 执行$()返回的就是jQuery对象

基本行为:

  • length/size(): 得到dom元素的个数

  • [index]: 得到指定下标对应的dom元素

  • each(function(index, domEle){}): 遍历所有dom元素

  • index(): 得到当前dom元素在所有兄弟中的下标

var $buttons=$('button')
console.log($buttons.size(),$buttons.length)
console.log($buttons[2].innerHTML,$buttons.get(2).innerHTML)
$buttons.each(function(index,domEle){
	console.log(index,domEle.innerHTML)
})
$buttons.each(function(){
	console.log(this)
})
console.log($('#btn3').index())

伪元素

  • Object对象
  • Length属性
  • 数值下标属性
  • 没有数组特别的方法:forEach(),push(),pop(),splice()

3 使用 jQuery 核心函数

3.1 选择器

是什么?

  • 有特定语法规则(css选择器)的字符串
  • 用来查找某个/些DOM元素: $(selector)

分类

  • 基本
    • #id
    • tagName
    • .class
    • selector1,selector2,selector3: 并集
    • selector1selector2selector3: 交集
$('#div1').css('background','red')
$('div').css('background','red')
$('.box').css('background','red')
//选择所有的div和span元素
$('div,span').css('background','red')
//选择所有class属性为box的div
$('div.box').css('background','red')
  • 层次
    • selector1>selector2: 子元素
    • selector1 selector2: 后代元素
    • selector1+selector2:紧接在selector1后面的selector2元素
    • selector1~selector2:在selector1后面的所有selector2元素
//选中ul下所有的span
$('ul span').css('background','yellow')
//选中ul下所有的子元素span
$('ul>span').css('background','yellow')
//选中class为box的下一个li
$('.box+li').css('background','yellow')
//选中ul下的class为box的元素后面的所有兄弟元素
$('ul .box~*').css('background','yellow')
  • 过滤
    • 在原有匹配元素中筛选出其中一些
    • :first
    • :last
    • :eq(index) 等于
    • :lt 小于
    • :gt 大于
    • :odd 奇数
    • :even 偶数
    • :not(selector)
    • :hidden
    • :visible
    • [attrName] 有某个属性的
    • [attrName=value] 某个属性值为…的
//选择第一个div
$('div:first').css('background','red')
//选择最后一个class为box的元素
$('.box:last').css('background','red')
//选择所有class属性不为box的div
$('div:not(.box )').css('background','red')//没有class属性的也会被选中
//选择第二个和第三个li元素
$('li:gt(0):lt(2)').css('background','red')//多个过滤选择器不是同时执行,而是依次
$('li:lt(3):gt(0)').css('background','red')
//选择内容为BBBBB的li
$('li:contains("BBBBB")').css('background','red')
//选择隐藏的li
console.log($('li:hidden').length,$('li:hidden')[0])
//选择有title属性的li元素
$('li[title]').css('background','red')
//选择所有属性title为hello的li元素
$('li[title=hello]').css('background','red')
$('li[title="hello"]').css('background','red')
常见效果1:表格隔行变色
$('#data>tbody>tr:odd').css('background','#ccccff')
  • 表单
    • :input
    • :text
    • :checkbox
    • :radio
    • :checked: 选中的
//选择不可用的文本输入框
$(':text:disabled').css('background','red')
//显示选择爱好的个数
console.log($(':checkbox:checked').length)
//显示选择的城市名称
$(':submit').click(function(){
	var city=$('select>option:selected').html()//选择的option的标签体文本 
	city=$('select').val()//选择的option的value属性值
	alert(city)
})

3.2 工具

  • $.each():遍历数组或对象中是数据
  • $.trim():去除字符串两边的空格
  • $.type(obj):得到数据的类型
  • $.isArray(obj):判断是否是数组
  • $.isFunction(obj)判断是否是函数
  • $.parseJSON(json):解析json字符串转换为is对象/数组
$.each(obj,function(key,value){
	console.log(key,value)
})
console.log($.type($))//'function'
console.log($.isArray($('body')),$.isArray([]))//false true
//JSON对象:{}
var json='{"name":"Tom","age":12}'
//json对象===》JS对象
console.log($.parseJSON(json))
//JSON数组:[]
json='[{"name":"Tom","age":12},{"name":"JACK","age":13}]'
//json数组===》JS数组
console.log($.parseJSON(json))

JSON.parse(jsonString)
JSON.stringfy(jsObj/jsArr)
常见效果2:多Tab点击切换
var $contents=$('#container>div')
// 给3个li加监听
$('#tab>li').click(function(){ //隐式遍历
	 //隐藏所有内容div
	 $contents.css('display','none')
	 //显示对应的内容div
	 var index=$(this).index()
	 $contents[index].style.display='block' //dom法效率更高
	 $($contents[index]).css('display','block')//jQuery法
})

更加高效的方法:只隐藏当前显示层

var $contents=$('#container>div')
var currIndex=0
// 给3个li加监听
$('#tab>li').click(function(){ //隐式遍历
	 //隐藏当前已经显示的内容div
	 $contents[currIndex].style.display='none'
	 //显示对应的内容div
	 var index=$(this).index()
	 $contents[index].style.display='block' //dom法效率更高
	 currIndex=index
})

3.3 ajax

4. 使用 jQuery 对象

4.1 属性/文本

  • 操作标签的属性, 标签体文本
  • attr(name) / attr(name, value): 读写非布尔值的标签属性
  • prop(name) / prop(name, value): 读写布尔值的标签属性
  • removeAttr(name)/removeProp(name): 删除属性
  • addClass(classValue): 添加class
  • removeClass(classValue): 移除指定class
  • val() / val(value): 读写标签的value
  • html() / html(htmlString): 读写标签体文本
//读取第一个div的title属性
console.log($('div:first').attr('title'))
//给所有的div设置name属性
$('div').attr('name','ljw')
//移除所有div的title属性
$('div').removeAttr('title')
//给所有的div设置class='ljw'
$('div').attr('class','ljw')
//给所有的div添加class='abc'
$('div').addClass('abc')
//移除所有div的guiguClass的class
$('div').removeClass('guiguClass')
//得到最后一个li的标签体文本
console.log($('li:last').html())
//设置第一个li的标签体为“<h1>mmmmmmm</h1>”
$('li:first').html('<h1>mmmmmmm</h1>')
//得到输入框中的value值
console.log($(':text').val())
//将输入框的值设置为ljw
$(':text').val('ljw')
//点击‘全选’按钮实现全选
var $checkboxs=$(':checkbox')
$('button:first').click(function(){
$checkboxs.prop('checked',true)
})
//点击‘全不选’按钮实现全不选
$('button:last').click(function(){
$checkboxs.prop('checked',false)
})
//表格隔行换色
$('#data>tbody>tr:odd').attr('class','odd')

4.2 CSS

  • style样式
    • css(styleName): 根据样式名得到对应的值
    • css(styleName, value): 设置一个样式
    • css({多个样式对}): 设置多个样式
//得到第一个p标签的颜色
console.log($('p:first').css('color'))
//设置所有p标签的文本颜色为red
$('p').css('color','red')
//设置第2个p的字体颜色(#ff0011),背景(blue),宽(300px),高(30px)
$('p:eq(1)').css({
	color:'#ff0011',
	background:'blue',
	width:300,
	height:30
})
  • 位置坐标
    • offset(): 读/写当前元素坐标(原点是页面左上角)
    • position(): 读当前元素坐标(原点是父元素左上角)
    • scrollTop()/scrollLeft(): 读/写元素/页面的滚动条坐标
1.点击btn1
$('#btn1').click(function(){
//打印div1相对于页面左上角的位置
var offset=$('.div1').offset()
console.log(offset.left,offset.top)
//打印div2相对于页面左上角的位置
offset=$('.div2').offset()
console.log(offset.left,offset.top)
//打印div1相对于父元素左上角的位置
var position=$('.div1').position()
console.log(position.left,position.top)
//打印div2相对于父元素左上角的位置
position=$('.div2').position()
console.log(position.left,position.top)
})

2.点击btn2
$('#btn2').click(function(){
//设置div2相对于页面的左上角的位置
	$('.div2').offset({
		left:50top:100
	})
})

3.得到div或页面滚动条的坐标
$('#btn1').click(function(){
	console.log($('div').scrollTop())//得到div的
	console.log($('html').scrollTop()+$('body').scrollTop())//得到页面,兼容不同浏览器
	console.log($(document.documentElement).scrollTop()+$(document.body).scrollTop())//效率更高
})
4.让div或页面的滚动条滚动到指定位置
$('#btn2').click(function(){
	$('div').scrollTop(200)
	$('html,body').scrollTop(300)
})
常见效果3:回到顶部
$('#to_top').click(function(){
	//瞬间滚到顶部
	$('html,body').scrollTop(0)
	//平滑滚到顶部
	var $page=$('html,body')
	   //总距离
	var distance=$('html').scrollTop()+$('body').scrollTop()
	   //总时间
	var time=500
	   //间隔时间
	var intervalTime=50
	var itemDistance=distance/(time/intervalTime)
	   //使用循环定时器不断滚动
	var intervalId=setInterval(function(){
		distance-=itemDistance
	   //到达顶部,停止定时器
		if(distance<=0){
			distance=0 //修正
			clearInterval(intervalId)
		}
		$page.scrollTop(distance)
	},intervalTime)
})
  • 尺寸
    • width()/height(): width/height
    • innerWidth()/innerHeight(): width + padding
    • outerWidth(false/true)/outerHeight(false/true): width + padding + border 如果是true,加上margin
var $div=$('div')
//1.内容尺寸
console.log($div.width(),$div.height())//100 150
//2.内部尺寸
console.log($div.innerWidth(),$div.innerHeight())//120 170
//3.外部尺寸
console.log($div.outerWidth(),$div.outerHeight())//140 190
console.log($div.outerWidth(true),$div.outerHeight(true))//160 210

4.3 文档

  • 增加
    • append() / appendTo(): 插入后部
    • preppend() / preppendTo(): 插入前部
    • before(): 插到前面
    • after(): 插到后面
  • 删除
    • remove(): 将自己及内部的孩子都删除
    • empty(): 掏空(自己还在)
  • 更新
    • replaceWith()
//向id为ul1的ul下添加一个span(最后)
var $ul1=$('#ul1')
$ul1.append('<span>append()添加的span</span>')
$('<span>appendTo()添加的span</span>').appendTo($ul1)
//向id为ul1的ul下添加一个span(最前)
$ul1.prepend('<span>prepend()添加的span</span>')
//在id为ul1的ul下的li(title为hello)的前面添加span
$('<span>prepend()添加的span</span>').prependTo($ul1)
//在id为ul1的ul下的li(title为hello)的后面添加span
$ul1.children('li[title=hello]').before('<span>before()添加的span</span>')
//将在id为ul2的ul下的li(title为hello)全部替换为p
$('#ul2>li[title=hello]').replaceWith('<p>replaceWith()替换的p</p>')
//移除id为ul2的ul下的所有li
$('#ul2').empty()//清空ul2下所有内容
$('#ul2>li').remove()

4.4 筛选

  • 过滤
    • 在jQuery对象内部的元素中找出部分匹配的元素, 并封装成新的jQuery对象返回
    • first()
    • last()
    • eq(index)
    • filter(selector): 对当前元素提要求
    • not(selector): 对当前元素提要求, 并取反
    • has(selector): 对子孙元素提要求
var $lis=$('ul>li')
//ul下li标签第一个
$lis.first().css('background','red')
//ul下li标签的最后一个
$lis.last().css('background','red')
//ul下li标签的第二个
$lis.eq(1).css('background','red')
//ul下li标签中title属性为hello的
$lis.filter('[title=hello]').css('background','red')
//ul下li标签中title属性不为hello的
$lis.not('[title=hello]').css('background','red')
$lis.filter('[title!=hello]').filter('[title]').css('background','red')
//ul下li标签中有span字标签的
$lis.has('span').css('background','red')
  • 查找
    • 查找jQuery对象内部的元素的子孙/兄弟/父母元素, 并封装成新的jQuery对象返回
    • children(selector): 子元素
    • find(selector): 后代元素
    • preAll(selector): 前的所有兄弟
    • siblings(selector): 所有兄弟
    • parent(): 父元素
//ul标签的第2个span子标签
$ul.children('span:eq(1)').css('background','red')
//ul标签的第2个span后代标签
$ul.find('span:eq(1)').css('background','red')
//ul标签的父元素
$ul.parent().css('background','red')
//id为cc的li标签的前面的所有li标签
var $li=$('#cc')
$li.prevAll('li').css('background','red')
//id为cc的li标签的所有兄弟li标签
$li.siblings('li').css('background','red')
练习1.爱好选择器
var #checkedAllBox=$('#checkedAllBox')
var $items=$(':checkbox[name=items]')
//点击‘全选’:选中所有爱好
$('#checkedAllBtn').click(function(){
	$items.prop('checked',true)
})
//点击‘全不选’:所有爱好都不勾选
$('#checkedAllBtn').click(function(){
	$items.prop('checked',false)
})
//点击‘反选’:改变所有爱好的勾选状态
$('#checkedRevBtn').click(function(){
	$items.each(function(){
		this.checked=!this.checked
	})
	$checkedAllBox.prop('checked', $items.filter(':not(:checked)').length===0)
})
//点击‘提交’:提示所有勾选的爱好
$('#sendBtn').click(function(){
	$items.filter(':checked').each(function(){
		alert(this.value)
	})
})
//点击‘全选/全不选’:选中所有爱好,或者全不选
$checkedAllBox.click(function(){
	$items.prop('checked',this.checked)
})
//点击某个爱好时,必要时更新‘全选/全不选’的选中状态
$item.click(function(){
	$checkedAllBox.prop('checked', $items.filter(':not(:checked)').length===0)
})

4.5 事件

  • 绑定事件
    • eventName(function(){})
    • on(‘eventName’, function(){})
    • 常用: click, mouseenter/mouseleave mouseover/mouseout focus/blur
    • hover(function(){}, function(){})
  • 解绑事件
    • off(‘eventName’)
  • 事件坐标
    • event.offsetX: 原点是当前元素左上角
    • event.clientX: 原点是窗口左上角
    • event.pageX: 原点是页面左上角
  • 事件相关
    • 停止事件冒泡: event.stopPropagation()
    • 阻止事件的默认行为: event.preventDefault()
//1. 给.out绑定点击监听(用两种方法绑定)
  $('.out').click(function () {
   console.log('click out')
   })
   
  $('.out').on('click', function () {
    console.log('on click out')
  })

  //2. 给.inner绑定鼠标移入和移出的事件监听(用3种方法绑定)
   $('.inner')
   .mouseenter(function () { // 进入
    console.log('进入')
   })
   .mouseleave(function () { // 离开
   console.log('离开')
   })
   
   $('.inner')
   .on('mouseenter', function () {
   console.log('进入2')
   })
   .on('mouseleave', function () {
   console.log('离开2')
   })

  $('.inner').hover(function () {
    console.log('进入3')
  }, function () {
    console.log('离开3')
  })


  //3. 点击btn1解除.inner上的所有事件监听
  $('#btn1').click(function () {
    $('.inner').off()
  })

  //4. 点击btn2解除.inner上的mouseenter事件
  $('#btn2').click(function () {
    $('.inner').off('mouseenter')
  })

  //5. 点击btn3得到事件坐标
  $('#btn3').click(function (event) { // event事件对象
    console.log(event.offsetX, event.offsetY) // 原点为事件元素的左上角
    console.log(event.clientX, event.clientY) // 原点为窗口的左上角
    console.log(event.pageX, event.pageY) // 原点为页面的左上角
  })

  //6. 点击.inner区域, 外部点击监听不响应
  $('.inner').click(function (event) {
    console.log('click inner')
    //停止事件冒泡
    event.stopPropagation()
  })
  
  //7. 点击链接, 如果当前时间是偶数不跳转
  $('#test4').click(function (event) {
    if(Date.now()%2===0) {
      event.preventDefault()
    }
  })

事件委托

  • 事件委托(委派/代理):
    • 将多个子元素(li)的事件监听委托给父辈元素(ul)处理
    • 监听回调是加在了父辈元素上
    • 当操作任何一个子元素(li)时, 事件会冒泡到父辈元素(ul)
    • 父辈元素不会直接处理事件, 而是根据event.target得到发生事件的子元素(li), 通过这个子元素调用事件回调函数
  • 事件委托的2方:
    • 委托方: 业主 li
    • 被委托方: 中介 ul
  • 使用事件委托的好处
    • 添加新的子元素, 自动有事件响应处理
    • 减少事件监听的数量: n==>1
  • jQuery的事件委托API
    • 设置事件委托: $(parentSelector).delegate(childrenSelector, eventName, callback)
    • 移除事件委托: $(parentSelector).undelegate(eventName)
	// 设置事件委托
  $('ul').delegate('li', 'click', function () {
    // console.log(this)
    this.style.background = 'red'
  })

  $('#btn1').click(function () {
    $('ul').append('<li>新增的li....</li>')
  })

  $('#btn2').click(function () {
    // 移除事件委托
    $('ul').undelegate('click')
  })

事件面试题

  • 区别mouseovermouseenter?
    • mouseover: 在移入子元素时也会触发, 对应mouseout
    • mouseenter: 只在移入当前元素时才触发, 对应mouseleave
      hover()使用的就是mouseenter()和mouseleave()
  • 区别on('eventName', fun)eventName(fun)
    • on(‘eventName’, fun): 通用, 但编码麻烦
    • eventName(fun): 编码简单, 但有的事件没有对应的方法

    4.6 效果

  • 动画效果
    • 在一定的时间内, 不断改变元素样式
    • slideDown()/slideUp()/slideToggle()
    • fadeOut()/fadeIn()/fadeToggle()
    • show()/hide()/toggle()
    • animate({结束时的样式}, time, fun)
    • stop()
淡入淡出
  • 不断改变元素的透明度(opacity)来实现的
    • fadeIn(): 带动画的显示
    • fadeOut(): 带动画隐藏
    • fadeToggle(): 带动画切换显示/隐藏
/*
   需求:
   1. 点击btn1, 慢慢淡出
     * 无参
     * 有参
       * 字符串参数
       * 数字参数
   2. 点击btn3, 慢慢淡入
   3. 点击btn3, 淡出/淡入切换,动画结束时提示“动画结束了”
   */

  var $div1 = $('.div1')

  $('#btn1').click(function () {
    // $div1.fadeOut()
    // $div1.fadeOut('slow')
    $div1.fadeOut(1000, function () {
      alert('动画完成了!!!')
    })
  })

  $('#btn2').click(function () {
    $div1.fadeIn()
  })

  $('#btn3').click(function () {
    $div1.fadeToggle()
  })

滑动
  • 滑动动画: 不断改变元素的高度实现
    • slideDown(): 带动画的展开
    • slideUp(): 带动画的收缩
    • slideToggle(): 带动画的切换展开/收缩
// 1. 点击btn1, 向上滑动
  $('#btn1').click(function () {
    $div1.slideUp(3000)
  })

  // 2. 点击btn2, 向下滑动
  $('#btn2').click(function () {
    $div1.slideDown()
  })

  // 3. 点击btn3, 向上/向下切换
  $('#btn3').click(function () {
    $div1.slideToggle()
  })
显示与隐藏
  • 显示隐藏,默认没有动画, 动画(opacity/height/width)
    • show(): (不)带动画的显示
    • hide(): (不)带动画的隐藏
    • toggle(): (不)带动画的切换显示/隐藏
var $div1 = $('.div1')
  //1. 点击btn1, 立即显示
  $('#btn1').click(function () {
    $div1.show()
  })

  //2. 点击btn2, 慢慢显示
  $('#btn2').click(function () {
    $div1.show(1000)
  })

  //3. 点击btn3, 慢慢隐藏
  $('#btn3').click(function () {
    $div1.hide(1000)
  })

  //4. 点击btn4, 切换显示/隐藏
  $('#btn4').click(function () {
    $div1.toggle(1000)
  })
自定义动画
  • jQuery动画本质 : 在指定时间内不断改变元素样式值来实现的
    • animate(): 自定义动画效果的动画
    • stop(): 停止动画
/*
   1. 逐渐扩大
     1). 宽/高都扩为200px
     2). 宽先扩为200px, 高后扩为200px
   */
  $('#btn1').click(function () {
    
    $div1.animate({
      width: 200,
      height: 200
    }, 1000)
   
    $div1
      .animate({
        width: 200
      }, 1000)
      .animate({
        height: 200
      }, 1000)

  })

  /*
   2. 移动到指定位置
     1).移动到(500, 100)处
     2).移动到(100, 20)处
   */
  $('#btn2').click(function () {
    // 1).移动到(500, 100)处
    $div1.animate({ // 向右下移动
      left: 500,
      top: 100
    }, 1000)

    // 2).移动到(100, 20)处
    $div1.animate({ // 向左上移动
      left: 100,  // 300
      top: 20  // 50
    }, 1000)
  })

  /*
   3.移动指定的距离
     1). 移动距离为(100, 50)
     2). 移动距离为(-100, -20)
   */
  $('#btn3').click(function () {
    // 1). 移动距离为(100, 50)
	$div1.animate({
      left: '+=100',
      top: '+=50'
    }, 1000)

    // 2). 移动距离为(-100, -20)
    $div1.animate({
      left: '-=100',
      top: '-=20'
    }, 3000)
  })

  $('#btn4').click(function () {
    $div1.stop()
  })

4.7 jQuery对象使用特点

5. jQuery插件

5.1 1. 扩展jQuery的工具方法

$.extend(object)

$.extend({
  xxx: fuction () {} // this是$
})
$.xxx()
  • 给 $ 添加4个工具方法:
    • min(a, b) : 返回较小的值
    • max(c, d) : 返回较大的值
    • leftTrim() : 去掉字符串左边的空格
    • rightTrim() : 去掉字符串右边的空格
$.extend({
    min: function (a, b) {
      return a < b ? a : b
    },
    max: function (a, b) {
      return a > b ? a : b
    },
    leftTrim: function (str) {
      return str.replace(/^\s+/, '')
    },
    rightTrim: function (str) {
      return str.replace(/\s+$/, '')
    }
  })

  console.log($.min(3, 5), $.max(3, 5))
  var string = '   my atguigu    '
  console.log('-----' + $.leftTrim(string) + '-----')
  console.log('-----' + $.rightTrim(string) + '-----')

5.2 扩展jQuery对象的方法

$.fn.extend(object)

$.fn.extend({
  xxx: function(){}  // this是jQuery对象
})
$obj.xxx()
  • 给jQuery对象 添加3个功能方法:
    • checkAll() : 全选
    • unCheckAll() : 全不选
    • reverseCheck() : 全反选
  $.fn.extend({
    checkAll: function () {
      this.prop('checked', true) // this是jQuery对象
    },
    unCheckAll: function () {
      this.prop('checked', false)
    },
    reverseCheck: function () {
      // this是jQuery对象
      this.each(function () {
        // this是dom元素
        this.checked = !this.checked
      })
    }
  })

  var $items = $(':checkbox[name=items]')
  $('#checkedAllBtn').click(function () {
    $items.checkAll()
  })
  $('#checkedNoBtn').click(function () {
    $items.unCheckAll()
  })
  $('#reverseCheckedBtn').click(function () {
    $items.reverseCheck()
  })

6. 面试题

6.1 多库共存

  • 问题 : 如果有2个库都有 $ , 就存在冲突
  • 解决 : jQuery库可以释放 $ 的使用权, 让另一个库可以正常使用, 此时jQuery库只能使用jQuery了
  • API : jQuery.noConflict()
(function () {
  window.$ = function () {
    console.log('my lib $()...')
  }
})()

  // 释放$的使用权
  jQuery.noConflict()
  // 调用myLib中的$
  $()
  // 要想使用jQuery的功能, 只能使用jQuery
  jQuery(function () {
    console.log('文档加载完成')
  })
  console.log('+++++')

6.2 onload与ready

区别: window.onload与 $(document).ready()

  • window.onload
    • 包括页面的图片加载完后才会回调(晚)
    • 只能有一个监听回调
  • $(document).ready()
    • 等同于: $(function(){})
    • 页面加载完就回调(早)
    • 可以有多个监听回调
  /*
   需求:
   1. 直接打印img的宽度,观察其值
   2. 在 $(function(){}) 中 打印 img 的宽度
   3. 在 window.onload 中打印宽度
   4. 在 img 加载完成后打印宽度
   */

  // 1. 直接打印img的宽度,观察其值
  console.log('直接', $('#logo').width())
  
  window.onload = function () {
    console.log('onload', $('#logo').width())
  }
  window.onload = function () {
    console.log('onload2', $('#logo').width())
  }
  
  $(function () {
    console.log('ready', $('#logo').width())
  })
  $(function () {
    console.log('ready2', $('#logo').width())
  })
  
  $('#logo').on('load', function () {
    console.log('img load', $(this).width())
  })

  /*$(document).ready(function () {

  })*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值