欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

jQuery知识梳理20190818

程序员文章站 2022-11-24 08:15:15
jQuery知识梳理20190818 [TOC] 1. 时间绑定和解绑 2. 区别mouseover与mouseenter 3. 时间委托(委派/代理) 4 . 多库共存 如果有2个库都有$, 就存在冲突。 jQuery库可以释放$的使用权, 让另一个库可以正常使用, 此时jQuery库只能使用jQ ......

jquery知识梳理20190818

1. 时间绑定和解绑

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>18_事件绑定与解绑</title>
</head>
<style type="text/css">
  * {
    margin: 0px;
  }
  .out {
    position: absolute;
    width: 200px;
    height: 200px;
    top: 20px;
    left: 10px;
    background: blue;
  }
  .inner {
    position: absolute;
    width: 100px;
    height: 100px;
    top: 50px;
    background: red;
  }
  .divbtn {
    position: absolute;
    top: 250px;
  }
</style>
<body style="height: 2000px;">
<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. 事件绑定(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()
-->
<script src="js/jquery-1.10.1.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
  $(function () {
    // 1.给class为out的div的点击事件绑定监听函数,打印'out clicked'(用两种方法绑定)
    /*$('.out').click(function () {
      console.log('out click1')
    })*/
    $('.out').on('click', function () {
      console.log('out clicked2')
    })

    //2.给class为inner的div的鼠标移入和鼠标移出事件绑定监听函数
    /*$('.inner')
      .mouseenter(function () {
        console.log('进入...')
      })
      .mouseleave(function () {
        console.log('离开...')
      })*/
    $('.inner')
      .on('mouseenter', function () {
        console.log('进入...')
      })
      .on('mouseleave', function () {
        console.log('离开...')
      })
    /*$('.inner').hover(function () {
      console.log('进入...')
    }, function () {
      console.log('离开...')
    })*/

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

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

    //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 () {
      var time = date.now(event)
      alert(time)
      if(time%2===0) {
        // 阻止事件默认行为
        event.preventdefault()
      }
    })
  })
</script>
</body>
</html>

2. 区别mouseover与mouseenter

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>19_事件切换</title>
</head>
<style type="text/css">
    * {
        margin: 0px;
    }
    .div1 {
        position: absolute;
        width: 200px;
        height: 200px;
        top: 50px;
        left: 10px;
        background: olive;
    }
    .div2 {
        position: absolute;
        width: 100px;
        height: 100px;
        top: 50px;
        background: red;
    }
    .div3 {
        position: absolute;
        width: 200px;
        height: 200px;
        top: 50px;
        left: 230px;
        background: olive;
    }
    .div4 {
        position: absolute;
        width: 100px;
        height: 100px;
        top: 50px;
        background: yellow;
    }
    .divtext{
        position: absolute;
        top: 330px;
        left: 10px;
    }
</style>
<body>
<div class="divtext">
    区分鼠标的事件
</div>
<div class="div1">
    div1.....
    <div class="div2">div2....</div>
</div>
<div class="div3">
    div3.....
    <div class="div4">div4....</div>
</div>
<!--
区别mouseover与mouseenter?
* mouseover: 在移入子元素时也会触发, 对应mouseout
* mouseenter: 只在移入当前元素时才触发, 对应mouseleave
hover()使用的就是mouseenter()和mouseleave()
-->
<script src="js/jquery-1.10.1.js" type="text/javascript"></script>
<script type="text/javascript">
    $('.div1').mouseover(function () {
        console.log('移入div1或其子元素')
    }).mouseout(function () {
        console.log('移出div1或其子元素')
    })

    $('.div3').mouseenter(function () {
        console.log('移入div3元素')
    }).mouseleave(function () {
        console.log('移出div3元素')
    })

    $('.div3').hover(function () {
        console.log('移入div33元素')
        this.style.background = 'red'
    }, function () {
        console.log('移出div33元素')
        this.style.background = 'blue'
    })
</script>
</body>
</html>

3. 时间委托(委派/代理)

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>20_事件委托2</title>
</head>
<body>
<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>

<!--
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)
-->
<script src="js/jquery-1.10.1.js"></script>
<script>
  $(function () {
    //事件委托
    $('ul').delegate('li', 'click', function () {
            console.log(this) // 点击发生事件的li
      this.style.background = 'red'
    })

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

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

4 . 多库共存

如果有2个库都有$, 就存在冲突。 jquery库可以释放$的使用权, 让另一个库可以正常使用, 此时jquery库只能使用jquery了。

 jquery.noconflict()

5.window.onload$(document).ready()的区别

  • window.onload:包括页面的图片加载完后才会回调(晚), 只能有一个监听回调。
  • $(document).ready():等同于: $(function(){}), 页面加载完就回调(早),可以有多个监听回调。

6. 自定义插件

  • 扩展jquery的工具方法:$.extend(obj)
jquery.extend({
  min: function(a, b) { return a < b ? a : b; },
  max: function(a, b) { return a > b ? a : b; }
});
  • 扩展jquery对象的方法:$.fn.extend(object)
jquery.fn.extend({
  check: function() {
    return this.each(function() { this.checked = true; });
  },
  uncheck: function() {
    return this.each(function() { this.checked = false; });
  }
});

  • 自定义文件:my_jquery_plugin.js
/*
 扩展jquery的工具方法 : $.extend(object)
   min(a, b) : 返回较小的值
   max(c, d) : 返回较大的值
   lefttrim() : 去掉字符串左边的空格
   righttrim() : 去掉字符串右边的空格
 */

//正则
/*
 ^   匹配字符串开始
 \s  匹配空格
 +   匹配一次或者多次
 $   匹配字符串的末尾
 */
//扩展$ 
$.extend({
  min: function (a, b) {
    return (a < b) ? a : b
  },
  max: function (a, b) {
    return (a > b) ? a : b
  },
  lefttrim: function (strtobetrimed) {
    return strtobetrimed.replace(/^\s+/, '')
  },
  righttrim: function (strtobetrimed) {
    return strtobetrimed.replace(/\s+$/, '')
  }
})

//扩展 $('#id').xxxxx
//$.fn.extend(object)
// checkall() : 全选
// uncheckall() : 全不选
// reversecheck() : 全反选
$.fn.extend({
  checkall: function () {
    // console.log('checkall')
    this.prop('checked', true)
  },
  uncheckall: function () {
    this.prop('checked', false)
  },
  reversecheck: function () {
    this.each(function () {
      this.checked = !this.checked
    })
  }
})
  • 使用自定义插件
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>25_扩展插件</title>
  <style type="text/css">
    * {
      margin: 0px;
    }
    .div1 {
      position: absolute;
      width: 100px;
      height: 100px;
      top: 50px;
      left: 10px;
      background: red;
    }
  </style>
</head>
<body>
<input type="checkbox" name="items" value="足球"/>足球
<input type="checkbox" name="items" value="篮球"/>篮球
<input type="checkbox" name="items" value="羽毛球"/>羽毛球
<input type="checkbox" name="items" value="乒乓球"/>乒乓球
<br/>
<input type="button" id="checkedallbtn" value="全 选"/>
<input type="button" id="checkednobtn" value="全不选"/>
<input type="button" id="reversecheckedbtn" value="反选"/>
<!--
1. 扩展jquery的工具方法
  $.extend(object)
2. 扩展jquery对象的方法
  $.fn.extend(object)
-->
<script src="js/jquery-1.10.1.js" type="text/javascript"></script>
<script src="js/my_jquery_plugin.js" type="text/javascript"></script>
<script type="text/javascript">
  /*
   需求:
   1. 给 $ 添加4个工具方法:
     * min(a, b) : 返回较小的值
     * max(c, d) : 返回较大的值
     * lefttrim() : 去掉字符串左边的空格
     * righttrim() : 去掉字符串右边的空格
   2. 给jquery对象 添加3个功能方法:
     * checkall() : 全选
     * uncheckall() : 全不选
     * reversecheck() : 全反选
   */
  // 得到最大最小值
  var a = 1
  var b = 2
  var result_min = $.min(a, b)
  var result_max = $.max(a, b)
  console.log(result_min)
  console.log(result_max)

  // 左trim 右trim
  var str = '   悟空    '
  console.log('|' + str + '|')
  var resultstrleft = $.lefttrim(str)
  console.log('|' + resultstrleft + '|')
  var resultstrright = $.righttrim(str)
  console.log('|' + resultstrright + '|')

  //全选
  $('#checkedallbtn').click(function () {
    $(':checkbox').checkall()
  })
  //全不选
  $('#checkednobtn').click(function () {
    $(':checkbox').uncheckall()
  })
  //反选
  $('#reversecheckedbtn').click(function () {
    $(':checkbox').reversecheck()
  })
</script>
</body>
</html>

7. 使用插件

  • 插件是基于jquery编写的扩展库。jquery官网上有很多插件:http://plugins.jquery.com/
  • 常见插件:
    • 表单校验插件:jquery-validation
    • jquery ui
    • 日期插件:laydate
  • 根据文档和demo使用插件