首页 > 前端篇:jQuery常见知识(二)
头像
青椒炒牛肉
发布于 2021-12-06 17:30
+ 关注

前端篇:jQuery常见知识(二)

目录

  • jQuery选择器
  • jQuery属性和操作方法
  • 对象的过滤与查找
  • 事件和动画

正文

对象的过滤与查找

筛选、查找孩子-父母-兄弟标签

属性 说明
children() 子标签中找
find() 后代标签中找
parent() 父标签
prevAll() 前面所有的兄弟标签
nextAll() 后面所有的兄弟标签
siblings() 前后所有的兄弟标签

案例

<div>
  <ul>
    <span>span文本1</span>
    <li>AAAAA</li>
    <li title="hello" class="box2">BBBBB</li>
    <li class="box" id='cc'>CCCCC</li>
    <li title="hello">DDDDDD</li>
    <li title="two"><span>span文本2</span></li>
    <span>span文本3</span>
  </ul>
  <span>span文本444</span><br>
  <li>eeeee</li>
  <li>EEEEE</li>
  <br>
</div>
  //1. ul标签的第2个span子标签
  $ul.children('span:eq(1)').css('background', 'red')
//2. ul标签的第2个span后代标签
$ul.find('span:eq(1)').css('background', 'red')
  //3. ul标签的父标签
  $ul.parent().css('background', 'red')
  //4. id为cc的li标签的前面的所有li标签
  var $li = $('#cc')
  $li.prevAll('li').css('background', 'red')
  //5. id为cc的li标签的所有兄弟li标签
  $li.siblings('li').css('background', 'red')

文档增删改

属性 说明
append(content) 向当前匹配的所有元素内部的最后插入指定内容
prepend(content) 向当前匹配的所有元素内部的最前面插入指定内容
before(content) 将指定内容插入到当前所有匹配元素的前面
after(content) 将指定内容插入到当前所有匹配元素的后面替换节点
replaceWith(content) 用指定内容替换所有匹配的标签删除节点
empty() 删除所有匹配元素的子元素
remove() 删除所有匹配的元素

案例

<ul id="ul1">
  <li>AAAAA</li>

  <li title="hello">BBBBB</li>
  <li class="box">CCCCC</li>

  <li title="hello">DDDDDD</li>
  <li title="two">EEEEE</li>
  <li>FFFFF</li>

</ul>
<br>
<br>
<ul id="ul2">
  <li>aaa</li>
  <li title="hello">bbb</li>
  <li class="box">ccc</li>
  <li title="hello">ddd</li>
  <li title="two">eee</li>
</ul>
  //1. 向id为ul1的ul下添加一个span(最后)
  var $ul1 = $('#ul1')
  $ul1.append('<span>append()添加的span</span>')
  //2. 向id为ul1的ul下添加一个span(最前)
  $ul1.prepend('<span>prepend()添加的span</span>')
  //3. 在id为ul1的ul下的li(title为hello)的前面添加span
  $ul1.children('li[title=hello]').before('<span>before()添加的span</span>')
  //4. 在id为ul1的ul下的li(title为hello)的后面添加span
  $ul1.children('li[title=hello]').after('<span>after()添加的span</span>')
  //5. 将在id为ul2的ul下的li(title为hello)全部替换为p
  $('#ul2>li[title=hello]').replaceWith('<p>replaceAll()替换的p</p>')
  //6. 移除id为ul2的ul下的所有li
  $('#ul2').empty()  // <p>也会删除

事件和动画

事件绑定与解绑

  1. 事件绑定(2种):
    • eventName(function(){})
      绑定对应事件名的监听, 例如:$('#div').click(function(){});
    • on(eventName, funcion(){})
      通用的绑定事件监听, 例如:$('#div').on('click', function(){})
    • 优缺点:
      eventName: 编码方便, 但只能加一个监听, 且有的事件监听不支持
      on: 编码不方便, 可以添加多个监听, 且更通用
  2. 事件解绑:
    • off(eventName)
  3. 事件的坐标
    • event.clientX, event.clientY 相对于视口的左上角
    • event.pageX, event.pageY 相对于页面的左上角
    • event.offsetX, event.offsetY 相对于事件元素左上角
  4. 事件相关处理
    • 停止事件冒泡 : event.stopPropagation()
    • 阻止事件默认行为 : event.preventDefault()

案例

<div class="out">
  外部DIV
  <div class="inner">内部div</div>
</div>

<div class='divBtn'>
  <button id="btn1">取消绑定所有事件</button>
  <button id="btn2">取消绑定mouseover事件</button>
  <button id="btn3">测试事件坐标</button>
  <a href="http://www.baidu.com" id="test4">百度一下</a>
</div>
  //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')
   })
  //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()
    }
  })

事件切换

区别mouseover与mouseenter?

  • mouseover: 在移入子元素时也会触发, 对应mouseout
  • mouseenter: 只在移入当前元素时才触发, 对应mouseleave
  • hover()使用的就是mouseenter()和mouseleave()

区别on('eventName', fun)与eventName(fun)

  • on('eventName', fun): 通用, 但编码麻烦
  • eventName(fun): 编码简单, 但有的事件没有对应的方法

事件委派

案例1

<ul>
  <li>11111</li>
  <li>1111111</li>
  <li>11***11</li>
  <li>11***11</li>
</ul>

<li>22222</li>
<br>
<button id="btn">添加新的li</button>
<br>
  1. 点击 li 背景就会变为红色
  2. 点击 btn 就添加一个 li
需求1
  $('ul>li').click(function () {
    this.style.background = 'red'
  })
需求2
  $('#btn').click(function () {
    $('ul').append('<li>新增的li....</li>')
  })

案例2

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

<li>22222</li>
<br>
<button id="btn1">添加新的li</button>
<button id="btn2">删除ul上的事件委托的监听器</button>
  // 设置事件委托
  $('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')
  })

淡入淡出

效果 说明
fadeIn() 带动画的显示
fadeOut() 带动画隐藏
fadeToggle() 带动画切换显示/隐藏

案例

html代码
<button id="btn1">慢慢淡出</button>
<button id="btn2">慢慢淡入</button>
<button id="btn3">淡出/淡入切换</button>
<div class="div1"></div>
JavaScript 代码
 /*
   需求:
   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() 带动画的切换展开/收缩

案例

<button id="btn1">慢慢收缩</button>
<button id="btn2">慢慢展开</button>
<button id="btn3">收缩/展开切换</button>

<div class="div1"></div>
 /*
   需求:
   1. 点击btn1, 向上滑动
   2. 点击btn2, 向下滑动
   3. 点击btn3, 向上/向下切换
   */
  var $div1 = $('.div1')

  // 1. 点击btn1, 向上滑动
  $('#btn1').click(function () {
    $div1.slideUp(3000)
  })

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

  // 3. 点击btn3, 向上/向下切换
  $('#btn3').click(function () {
    $div1.slideToggle()
  })

显示与隐藏

效果 说明
show() (不)带动画的显示
hide() (不)带动画的隐藏
toggle() (不)带动画的切换显示/隐藏

案例

<button id="btn1">瞬间显示</button>
<button id="btn2">慢慢显示</button>
<button id="btn3">慢慢隐藏</button>
<button id="btn4">显示隐藏切换</button>

<div class="div1"></div>
/*
  需求:
  1. 点击btn1, 立即显示
  2. 点击btn2, 慢慢显示
  3. 点击btn3, 慢慢隐藏
  4. 点击btn4, 切换显示/隐藏
   */
  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动画本质 : 在指定时间内不断改变元素样式值来实现的

  1. animate(): 自定义动画效果的动画
  2. stop(): 停止动画

案例

<button id="btn1">逐渐扩大</button>
<button id="btn2">移动到指定位置</button>
<button id="btn3">移动指定距离</button>
<button id="btn4">停止动画</button>

<div class="div1"></div>
/*
   需求:
    1. 逐渐扩大
      1). 宽/高都扩为200px
      2). 宽先扩为200px, 高后扩为200px
    2. 移动到指定位置
      1).移动到(500, 100)处
      2).移动到(100, 20)处
    3.移动指定的距离
      1). 移动距离为(100, 50)
      2). 移动距离为(-100, -20)
    4. 停止动画
   */
  var $div1 = $('.div1')

  /*
   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()
  })

结语

  • jQuery常见知识点更新完毕,需要详细了解jQuery可以查询官方文档,想学习该部分知识点可以到某站学习。

推荐文章

前端篇:朋友面试之Vue框架,回去等通知吧(一)
前端篇:朋友面试之Vue框架,故事未止(二)
网络篇:和面试官扯皮OSI七层协议(收藏吃灰系列)

全部评论

(3) 回帖
加载中...
话题 回帖