关于jQuery是前端方法库
特点:
1 优质的选择器和筛选方法
2 好用的饮食迭代
3 强大的链式编程
jQuery向外暴露两个变量:jQuery和$ (jQuery === $)

选择器

//  jQuery选择器 $(选择器) 返回元素集合
  // id选择器
  console.log($('#li3')); // jQuery.fn.init(1)
  // 类选择器
  console.log($('.c1'));
  // 标签选择器
  console.log($('li'));
  // 特殊选择器
    // 第一个元素
    console.log($('li:first'));
    // 最后一个元素
    console.log($('li:last'));
    // 获取第4个元素(索引是3)
    console.log($('li:eq(3)'));
    // 索引奇数个
    console.log($('li:odd'));

筛选器

对选择器元素进行二次筛选

jQuery筛选器
  // .first() 第一个
  console.log($('li').first());
  // .last() 最后一个
  console.log($('li').last());
  // eq(n) 选择第n个
  console.log($('li').eq(3));
  // next()
  console.log($('#li3').next());
  // prev()
  console.log($('#li3').prev());
  // prevALl() 上面所有
  console.log($('#li3').prevAll());
  // nextALl() 下面所有
  console.log($('#li3').nextAll());
  // parent()父元素
  console.log($('#li3').parent());
  // parents()上级所有元素
  console.log($('#li3').parents());
  // find('.c1') 在所有后代元素中查找类名未c1的元素
  console.log($('ul').find('.c1'));
  // siblings() 查找所有的兄弟元素
  console.log($('.c1').siblings());
  // index() 获取元素的索引
  console.log($('.c1').index());

属性操作

attr() 和 removeAttr() 可操作自定义和原生属性

// 1 获取 第4个li的id属性
  console.log($('li').eq(3).attr('id')); // li3
  console.log($('li').eq(3).attr('index')); // 3
  // 2 设置 属性名和属性值
  $('li').eq(1).attr('id','c1')
  // 3 删除元素属性
  $('li').eq(1).removeAttr('id')

prop()和removeProp()

// 1 可获取原生属性,不可获取通过attr设置的属性,和自定义属性
  console.log($('li').eq(3).prop('id')); // li3
  console.log($('li').eq(3).prop('index')); // undefined
  // 2 设置属性,可设置原生和自定义属性,自定义属性不在标签中展示,存储在对象属性中
  $('li').eq(3).prop('id','2333') //element结构中可查看
  $('li').eq(3).prop('data-id','2444') // 可获取
  console.log($('li').eq(3).prop('data-id'));//2444 可获取
  // 3 removeProp()不能删除原生属性和标签自带的属性,能删除props设置的属性
  $('li').eq(3).removeProp('id') //原生id属性删除失败
  $('li').eq(3).removeProp('index') //自带的index属性删除失败
  $('li').eq(3).removeProp('data-id')
  console.log($('li').eq(3).prop('data-id')) // undefined 删除prop成功

类名操作

类名操作
  // 1 添加类名 addClass(类名)
  $('div').addClass('cls3')
  // 2 判断类名是否存在
  console.log($('div').hasClass('cls3')); // true
  // 3 移除类名
  $('div').removeClass('cls2')
  // 4 类名切换,toggleClass() 类名存在则移除,不存在则添加
  setInterval(function(){
    $('div').toggleClass('cls2')
  },1000)

文本操作

// 元素文本操作
  // 1 获取元素的`超文本内容`
  console.log($('div').html()); //     <p>我是p元素</p>
  // 2 设置超文本内容
  $('div').html('233')
  $('div').html('<span>haha</span>')
  // 3 设置获取元素文本内容 text()
  console.log($('div').text()); // 我是p元素
  $('div').text('我是text') //设置文本内容
  // 4 获取表单标签的内容 val()
  // console.log($('input').val()); //名字
  $('input').val('年龄')

元素样式操作

// 元素样式操作
  // 1 获取元素样式
  console.log($('div').css('background-color')); // rgb(255, 192, 203)
  // 2 设置样式 css(样式名,样式值)
  $('div').css('border','10px solid skyblue')
  // 3 css(对象) 批量设置样式
  $('div').css({
    border:'5px dashed blue',
    // 'border-radius':'50%', //或者下面这种写法
    borderRadius:'50%'
  })

事件绑定

// 1 on(s事件类型,函数处理)
      $('#box1').on('click',function(){
        console.log('box1');
      })
      $('#box2').on('click',function(){
        console.log('box2');
        return false; // 目的是阻止事件冒泡 
      })
      $('a').on('click',function(){
        console.log('点击链接事件');
        return false; //阻止链接默认转跳
      })
  // 2 on(事件类型,委托元素,处理函数)//从box2委托过来的click事件才能处理,直接点击box1不做处理
      $('#box1').on('click','#box2',function(){
        console.log('box2的点击事件委托给box1');
      })
  // 3 on(事件类型,数据,处理函数)
      $('#box1').on('click',100,e => {
        console.log(e.data);
      })
  // 4 one()事件绑定,传参和on()一样,只是one只触发一次
  // 5 off(事件类型) 取消事件类型的所有处理函数
    // off(事件类型,事件处理函数)
    function f1(){
      console.log('box1');
    }
    function f2(){
      console.log('box2');
      return false; // 目的是阻止事件冒泡 
    }
    $('#box1').on('click',f1)
    $('#box2').on('click',f2)
    $('#box1').off('click')
  // 6 trigger(事件类型) 自动触发事件
    $('#box1').on('click', ()=>{
      console.log('box1');
    })
    setInterval(() => {
      $('#box1').trigger('click')
    },2000)

页面加载

// 1 页面加载事件,可绑定多次;页面加载完毕后就触发
  $(window).ready(function(){
    console.log('load');
  })
  // 页面加载事件简写
  $(function(){
    console.log(66);
  })
  // 2 特殊事件,hover(移入处理,移出处理)
  $('div').hover(function(){
    // 移入处理
    console.log('移入');
  },function(){
    // 移出处理
    console.log('移出');
  })

隐式迭代
获取到的元素集合,调用jQuery方法,默认遍历集合,给每一个元素都添加方法

// 隐式迭代:
  // 获取所有div元素并绑定事件
  $('div').on('click',function(){
    console.log(this); //this是原生DOM对象(类似<div>haha</div>)
  })

绑定jq中的方法:原生DOM转为jq集合

$('div').on('click',function(){
    console.log(this);
    // this.css('border','10px solid green') //  this.css is not a function因为只有jQ的集合才能调用jq方法其他不可
    // 解决办法:原生DOM转为jq集合 ====> $(原生DOM对象)
    $(this).css('border','10px solid green')
  })

jq对象转为原生DOM

// jq对象转为原生DOM
  console.log($('div').eq(0)); // jq集合对象
  console.log($('div').eq(0)[0]); // 原生DOM对象

链式编程
只有前面的方法返回的是jq集合才可继续链式编程

// 链式编程
  $('div').css('width','400px')
  console.log($('div').css('width','400px'));//jq集合调用方法后返回的还是jq集合
  // 链式编程:只有前面的方法返回的是jq集合才可继续链式编程
  $('div').css('width','400px').click(()=>{
    console.log('点击');
  }).height(400)

元素操作
创建元素

// 1 创建标签元素
  let p = $('<p>我是p元素</p>')
  console.log(p);

1 添加元素(父子关系)

// jQuery元素操作
  
  // (父子关系)
  // 2 将元素B添加到元素A末尾
  $('.d1').append(p)
  // 3 将元素B添加到元素A最前面
  $('.d1').prepend(p)
  // 4 将元素A添加到元素B内部的最后面
  p.appendTo($('.d1'))
  // 4 将元素A添加到元素B内部的最后面
  p.prependTo($('.d1'))

2 添加元素(兄弟关系)

// (兄弟关系)
  // 5 将元素B添加到元素A后面  A.after(B)
  $('.d1').after(p)
  // 6 将元素B添加到元素A前面  A.before(B)
  $('.d1').before(p)
  // 7 将元素B添加到元素A后面  B.insertAfter(A)
  p.insertAfter($('.d1'))
  // 8 将元素B添加到元素A前面   B.insertBefore(A)
  p.insertBefore($('.d1'))

3 替换

// (替换)
  // A.replaceWith(B) 元素B将元素A替换
  $('span').replaceWith(p)
  p.replaceAll($('span'))

4 删除

// 删除元素
  // 1 A.empty() 将元素A中所有后代子节点清除
  $('.d1').empty()
  // 2 A.empty() 将元素自己移除
  $('span').remove()

5 克隆

// 克隆元素 A.clone() 返回克隆的元素A
  // 参数1:是否克隆元素A的事件,默认false,不克隆
  // 参数2:子元素是否克隆自身事件,默认跟随参数1
  $('.d1').click(function(){
    $(this).css('background-color','pink')
  })
  let d2 = $('.d1').clone() //d2没有继承事件
  let d2 = $('.d1').clone(true) //d2继承事件
  $('body').append(d2)

元素尺寸

// 元素的尺寸
  // 1 获取元素宽高width() 和 height() 是内容宽高,不包括padding和border、margin
  console.log($('div').width()); // 200
  console.log($('div').height());
  // $('div').height(400) // 设置

  // 2 innerWidth() 和 innerHeight() 获取元素内容宽高+padding,不包括border和margin
  console.log($('div').innerWidth()); // 220
  console.log($('div').innerHeight()); // 220
  // $('div').innerHeight(300)

  // 3 outerWidth() 和 outerHeight() //获取元素宽高
  // 参数为false或者不传,(内容+padding+border)
  // 参数为true,(内容+padding+border+margin)
  console.log($('div').outerWidth()); // 230
  console.log($('div').outerHeight()); // 230
  console.log($('div').outerWidth(true)); // 270
  console.log($('div').outerHeight(true)); // 250
  // $('div').outerWidth(600) // 设置

元素的位置

// 元素的位置
  // 1 offset() 获取元素相对于页面的定位
  console.log($('.d1').offset()); // {top: 20, left: 48}
  console.log($('.d2').offset()); // {top: 40, left: 50}
  // offset({}) 设置元素位置,相对页面
  $('.d2').offset({
    top:10,
    left:10
  })

  // 2 相对于父元素的定位
  console.log($('.d2').position()); // {top: 20, left: 10}

jq中的动画
1 基本动画

// 1 基本动画,显示、隐藏
  // show()
  // 参数1:时间 非必填
  // 参数2:运动曲线 swing linear 非必填
  // 参数3:动画结束后执行的函数、 非必填
  $('button').click(()=>{
    $('div').show(1000,'linear',function(){ // 显示div
      console.log(this);
    })
  })
  // hide() 隐藏
  $('button').click(()=>{
    $('div').hide(1000,'linear',() => {
      console.log(this);
    })
  })
  // toggle() 元素显示隐藏的切换 参数和show一样
  $('button').click(() => {
    $('div').toggle(1000) // 显示和隐藏的切换
  })

2 折叠动画

// 2 折叠动画 (下拉显示 收起隐藏)
  // slideDown() 效果:显示下拉动画 参数和show方法一样,
  $('button').click(()=>{
    $('div').slideDown(1000,()=>{
      console.log(123);
    })
  })
  // slideUp() 效果:收起隐藏 参数和show方法一样
  $('button').click(()=>{
    $('div').slideUp(1000)
  })
  // slideToggle() 效果:点击button,切换div显示和隐藏状态,
  $('button').click(()=>{
    $('div').slideToggle(1000)
  })

3 淡入淡出的动画

// 3 淡入淡出的效果
  // fadeIn() 淡入 (透明度从0-1) 参数和show一样
  $('button').click(()=>{
    $('div').fadeIn()
  })
  // fadeOut() 淡出 (透明度从1-0) 参数和show一样
  $('button').click(()=>{
    $('div').fadeOut()
  })
  // fadeTo()  参数1:时间; 参数2:指定透明度; 参数3:swing或者linear;参数4:结束后处理函数
  $('button').click(()=>{
    $('div').fadeTo(1000,0.3)
  })
  // fadeToggle()  效果:淡入淡出的切换效果,参数和show一样
  $('button').click(()=>{
    $('div').fadeToggle(1000)
  })

自定义动画

// jq自定义动画
  // animate(运动目标效果对象{样式},时间,运动曲线,运动结束后的执行函数)
  // 不可改变颜色
  $('.start').click(() => {
    $('div').animate({
      top:100,
      left:200,
      width:200,
      height:200,
      borderRadius:'50%',
      backgroundColor:'pink' //没有效果
    },500,'linear',function(){
      console.log(this);
    })
  })
  // stop() 暂停动画
  // finished() 停止动画,直接到目标效果
  $('.stop').click(function(){
    $('div').stop()
  })

jq-ajax-get-post请求

// jq中ajax请求-post-get
// $.get(agr) $.post(agr)
// 参数1:请求地址 必填
// 参数2:需要携带的数据,对象或查询字符串 选填
// 参数3:回调函数 选填
// 参数4:返回的数据格式,取值json xml text 默认是text 选填
$('button').click(function(){
  $.get('http://localhost:8888/test/first',function(res){
    console.log(res);
  })
})
$('button').click(function(){
  $.get('http://localhost:8888/test/third',{name:'kelly',age:18},function(res){
    console.log(res);
  },'json')
})
// post请求
$('button').click(function(){
  $.post('http://localhost:8888/test/fourth',{name:'kelly',age:18},function(res){
    console.log(res);
  },'json')
})

jQuery的综合ajax请求

// jQuery的综合ajax请求
// 语法:$.ajax(参数)
// 参数是一个对象,对象中的数据都是此次请求的配置
// url
// data 查询字符串或对象
// type 请求方式 默认get 
// dataType 期望返回的数据格式
// async 默认true
// error 请求失败的回调
// success 请求成功的回调
// timeout 请求超时设置的时间
// context 设置回调函数中this指向 默认this指向ajax
// status {} 状态回调码
$('button').click(function(){
  $.ajax({
    url:'http://localhost:8888/test/fourth',
    type:'post',
    data:'name=kelly&age=18',
    // timeout:1,//模拟请求超时 请求需要在1毫秒内完成,否则报错
    success(res){
      // console.log(res);
      // console.log(this); // 未设置context时,this指向ajax对象;否则指向context对象
    },
    error(xhr,error){
      console.log('请求失败');
      console.log(xhr);
      console.log(error);
    },
    // context:{name:'kelly',age:18}
  })
})

多库共存

// 多库共存
// 引入的jqJS文件,有两个变量暴露在外面,分别是$ 和 jQuery
// 若引入的js文件,除了jQuery外,还有别的方法库也暴露了$ 和 jQuery的话,会产生变量冲突
// jQuery可将$符的控制权交出
console.log($); // ƒ ( selector, context ) 
jQuery.noConflict();
console.log($); // undefined

// jQuery可将jQuery符的控制权交出
console.log(jQuery); // ƒ ( selector, context ) {
jQuery.noConflict(true)
console.log(jQuery); //undefined

// jQuery和$的控制权交给jq
let jq = jQuery.noConflict(true)
console.log(jQuery); //undefined
console.log($); //undefined
console.log(jq); // ƒ ( selector, context ) {

插件扩展

// 插件扩展
// jq中有一些方法是没有的
// 比如
let max =  Math.max(1,5,9);
console.log(max); //9
// 通过$.extend(参数)  给$和jQuery添加方法
// 参数就是一个对象,对象中的方法就是扩展 给$和jQuery使用的函数
// 将getMax方法扩展给$
$.extend({
  getMax(...arg){
     return Math.max(...arg)
  }
})
console.log($.getMax(1,2,8,4,5,6)); // 8


// 给$的元素集合添加方法 $.fn.extend(参数)
// 参数也是对象,对象中的方法就是元素集合的对象
// 给jq的元素集合(input)添加一个全选方法
// 如果想调用完自定义的扩展方法后可以继续进行链式编程,需要在自定义的方法中返回jq元素集合
$.fn.extend({
  fx(){
    // console.log(this);
    return this.each((i,value) => {
      if($(value).prop('checked')){
        $(value).prop('checked',false)
      }else{
        $(value).prop('checked',true)
      }
    })
  }
})
$('button').click(function(){
  $('input').fx().css({width:20,height:20})
})

// each() 遍历jq的元素集合
$('input').each((index,item) => {
  console.log(index,item);
})