day82-jQuery-事件、动画、each、data、插件

1. 事件
    常用事件:
    click(function(){...})
    hover(function(){...})
    blur(function(){...})
    focus(function(){...})
    change(function(){...})
    keydown(function(){...})
    keyup(function(){...})

    1.1 我们今后要用的jQuery绑定事件的方式
        1.1.1 点击的标签对象.on("click", function(){...})
            
        1.1.2 父对象.on("click", "点击的标签对象的id、classname、tagname等等", function(){...})
            优点:
            1.适用于 给未来的元素(页面生成的时候还没有的标签) 绑定事件 (事件委托),
                子元素无法处理的,委托给父元素处理。            
            2.事件冒泡
                子元素无法处理的,委托给父元素处理,父元素无法处理的,委托给爷爷元素处理。
                把事件向上级汇报处理。    
            3.事件捕获
                利用事件冒泡,给已经存在的标签绑定事件,用来捕获后代标签的事件.
            
        示例:新增一行,并且可以删除这一行。
            $("table").on("click", ".delete", function () {
                              // 删除按钮绑定的事件
                            })

    1.2 hover事件示例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>hover事件</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .nav {
            height: 40px;
            width: 100%;
            background-color: #3d3d3d;
            position: fixed;
            top: 0;
        }

        .nav ul {
            list-style-type: none;
            line-height: 40px;
        }

        .nav li {
            float: left;
            padding: 0 10px;
            color: #999999;
            position: relative;
        }

        .nav li:hover {
            background-color: red;
            color: white;
        }

        .clearfix:after {
            content: "";
            display: block;
            clear: both;
        }

        .son {
            position: absolute;
            top: 40px;
            right: 0;
            height: 50px;
            width: 100px;
            background-color: #00a9ff;
            display: none;
        }

        .hover .son{
            display: block;
        }
    </style>
</head>
<body>
<div class="nav">
    <ul class="clearfix">
        <li>登录</li>
        <li>注册</li>
        <li>购物车
            <p class="son">
                空空如也...
            </p>
        </li>
    </ul>
</div>
<script src="jquery-3.4.1.min.js"></script>
<script>
    $(".nav li").hover(
        function () {
            $(this).addClass("hover");
        },//两函数使用逗号隔开
        function () {
            $(this).removeClass("hover");
        }
    );
</script>
</body>
</html>

    1.3 阻止后续事件执行
        return false; // 常见阻止表单提交等

    1.4 移除事件
        .off("click", function(){...})

    1.5 页面载入
        当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。
        这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度。
      两种写法:
          $(document).ready(function(){
                            // 在这里写你的JS代码...
                            })
      简写:
          $(function(){
                  // 你在这里写你的代码
                  })
    示例:
<body> <script> function foo() { // 在这里写你的JS代码... } // 文档树就绪后执行 $(document).ready( function () { foo(); } ); </script> </body> 2. 动画效果 // 基本 show([s,[e],[fn]]) hide([s,[e],[fn]]) toggle([s],[e],[fn]) // 滑动 slideDown([s],[e],[fn]) slideUp([s,[e],[fn]]) slideToggle([s],[e],[fn]) // 淡入淡出 fadeIn([s],[e],[fn]) fadeOut([s],[e],[fn]) fadeTo([[s],o,[e],[fn]]) // o是opacity透明度 fadeToggle([s,[e],[fn]]) // 自定义(了解即可) animate(p,[s],[e],[fn]) 2.1 基本示例:图片展示和隐藏 <img src="1.jpg" alt=""> $('img').show(5000); //图片在5秒内从小到大展示完成 $('img').hide(5000); //图片在5秒内从打到小隐藏完成 $('img').toggle(5000); //图片在5秒内,有图片就隐藏,没有图片就展示出来 2.2 滑动示例:菜单隐藏 <div>菜单一</div> <div> <ul> <li>111</li> <li>222</li> <li>333</li> </ul> </div> $('ul').slideUp(1000); //向上滑动隐藏 $('ul').slideDown(1000); //向下滑动展示 $('ul').slideToggle(1000); //展示变隐藏,隐藏变展示 2.3 淡入淡出:图片展示和隐藏 <img src="1.jpg" alt=""> $('img').fadeIn(5000); //图片在5秒内淡入展示 $('img').fadeOut(5000); //图片在5秒内淡出隐藏 $('img').fadeToggle(5000); //图片在5秒内,有图片就淡出,没有图片就淡入 $('img').fadeTo(3000,0.3); //图片在3秒内,透明度变为0.3 2.4 自定义 示例:点赞特效。有个问题,每次点击都增加一个i标签。 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>点赞动画示例</title> <style> div { position: relative; display: inline-block; } div>i { display: inline-block; color: red; position: absolute; right: -16px; top: -5px; opacity: 1; } </style> </head> <body> <div id="d1">点赞</div> <script src="jquery-3.2.1.min.js"></script> <script> $("#d1").on("click", function () { var newI = document.createElement("i"); newI.innerText = "+1"; $(this).append(newI); $(this).children("i").animate({ opacity: 0 }, 1000) }) </script> </body> </html> 3. each循环 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>001</div> <div>002</div> <div>003</div> <div>004</div> <div>005</div> <script src="jquery-3.4.1.min.js"></script> <script> var $divEles = $('div'); for (var i = 0; i < $divEles.length; i++) { console.log($divEles[i].innerText) } //上下两个循环结果一样
    //jquery对象的循环
$divEles.each(function () { //each是指$divEles对象的每一个元素 console.log($(this).text()); //$(this)就是$divEles,写一个this语句就行 });
    //数组的循环
var a1 = [11,22,33,44,55]; $.each(a1,function (index,value) { if(value===22){return false}//断开each循环 console.log(index+':'+value); }); //0:11 $.each(a1,function (index,value) { if(value===22){return}//退出当前这一次循环 console.log(index+':'+value); }); //0:11 //2:33 //3:44 //4:55

    //对象的循环
  var dict = {'name':'tom','age':18};
  $.each(dict,function(key,value){
       console.log(key,value)
    })
</script> </body> </html> 4. data:最重要的用法是:保存点击过的jQuery对象,方便后面找到它使用。详见示例:表格、新增、编辑、删除、each、data、事件委托 jQuery对象可以存放 数字、字符串和jQuery对象 示例: <div id="d1">迈腾2020</div> <img src="1.jpg" alt=""> 4.1 数字: $('#d1').data('age',18); $('#d1').data('age'); //结果是18 4.2 字符串: $('#d1').data('name','maiteng'); $('#d1').data('name'); //'maiteng' 4.3 jQuery对象 var $imgEle = $('img'); $('#d1').data('img',$imgEle); //找到一个对象$('#d1')(任意jQuery对象都可以),保存jQuery对象$imgEle。 $('#d1').data('img'); //获取$imgEle对象 $('#d1').data('img').attr('src','4.jpg') //属性修改

  4.4 data传参
    
<div data-name="tom" data-age="18"></div>  //把键值对{‘name’:"tom",‘age’:18}保存在div标签里面。
    <button id="btn">获取数据</button>
    <button id="btn1">设置数据</button>

    
$(function () {
               $('#btn').on('click',function () {
      // 获取数据
            console.log($('div').data('name'));  //tom
            console.log($('div').data('age'));  //18
             });

        $('#btn1').on('click',function () {
      // 设置数据
            $('div').data('name','marry');
            $('div').data('age','20');
                   //$('div').data({'name':'marry','age':'20'});可以使用键值对设置,更加方便
                     });
          });

5. 插件:自定义新函数jQuery.extend({键值对});
    
    示例:
        <script>
        jQuery.extend({
              min: function(a, b){return a < b ? a : b;},    // {}里面是键值对
              max: function(a, b){return a > b ? a : b;}
            });
        jQuery.min(2,3);    // => 2
        jQuery.max(4,5);    // => 5
        </script>
-----------------------------------------------------------------------------------------------------
示例:表格、新增、编辑、删除、each、data、事件委托
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>表格</title>
    <style>
        th,td {
            text-align: center;
        }
        .cover{
            background-color:rgba(0,0,0,0.4);
            position:fixed;
            top:0;
            right:0;
            bottom:0;
            left:0;
        }
        .modal-new,.modal-modify{
            background-color:white;
            width:300px;
            height:200px;
            position:fixed;
            top:50%;
            left:50%;
            margin-top:-100px;
            margin-left:-150px;

        }
        .hide{display:none;}
    </style>
</head>
<body>
<table border="1">
    <thead>
    <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>1</td>
        <td>tom</td>
        <td>18</td>
        <td>
            <input type="button" value="编辑" class="modify"> <input type="button" value="删除" class="cancel">
        </td>
    </tr>
    <tr>
        <td>2</td>
        <td>marry</td>
        <td>20</td>
        <td>
            <input type="button" value="编辑" class="modify"> <input type="button" value="删除" class="cancel">
        </td>
    </tr>
    <tr>
        <td>3</td>
        <td>alex</td>
        <td>38</td>
        <td>
            <input type="button" value="编辑" class="modify"> <input type="button" value="删除" class="cancel">
        </td>
    </tr>
    </tbody>
</table>
<input type="button" id="new" value="新增">
<div class="cover hide"></div>
<form class="modal-new hide" action="">
    <p>新增数据</p>
    <p>
        <label for="newName">姓名</label>
        <input type="text" id="newName">
    </p>
    <p>
        <label for="newAge">年龄</label>
        <input type="text" id="newAge">
    </p>
    <p>
        <input type="button" value="确定" id="newSure">
        <input type="button" value="退出" id="newExit">
    </p>
</form>
<form class="modal-modify hide" action="">
    <p>修改数据</p>
    <p>
        <label for="modifyName">姓名</label>
        <input type="text" id="modifyName">
    </p>
    <p>
        <label for="modifyAge">年龄</label>
        <input type="text" id="modifyAge">
    </p>
    <p>
        <input type="button" value="确定" id="modifySure">
        <input type="button" value="退出" id="modifyExit">
    </p>
</form>

<script src="jquery-3.4.1.min.js"></script>
<script>
    //把经常使用的对象存放在变量里面。
    var $tbodyEles = $('tbody');
//------------------新增开始---------------------------------
    //1.新增一行
        //1.1 点击新增,弹出模态框:cover和modal-new
    $('#new').on('click',function () {
        $('.cover,.modal-new').removeClass('hide');
        //1.2 创建tr和td标签。
        var trEles = document.createElement('tr');
        $(trEles).html('<td></td>'+'<td></td>'+'<td></td>'+'<td><input type="button" value="编辑" class="modify"> <input type="button" value="删除" class="cancel"></td>');
        $tbodyEles.append(trEles);
        //1.3 第一个td标签添加序号。
            //1.3.1 先找到tbody有多少个tr,tr的个数就是序号。
        var num = $('tbody tr').length;
        $(trEles).children().first().text(num);
    });

    //2.点新增弹出来的模态框的确定,获取姓名和年龄的值,赋予新创建的td。
    $('#newSure').on('click',function () {
        $tbodyEles.children().last().children().eq(1).text($('#newName').val());
        $tbodyEles.children().last().children().eq(2).text($('#newAge').val());
    });

    //3.点新增弹出来的模态框的退出,就清空姓名和年龄的值,然后隐藏模态框
    $('#newExit').on('click',function () {
        $('#newName').val('');
        $('#newAge').val('');
        $('.cover,.modal-new').addClass('hide');
    });
//------------------新增结束---------------------------------

//------------------编辑开始---------------------------------
    //4.点编辑,要使用事件委托来绑定事件
    //4.1弹出模态框:cover和modal-modify
    $tbodyEles.on('click','.modify',function () {
        $('.cover,.modal-modify').removeClass('hide');
    //4.2把当前编辑的jQuery对象$modify保存到tbody标签里面,方便后面使用。
        var $modify = $(this);//this是当前点击的DOM对象,$(this)是jQuery对象
        $tbodyEles.data('currentModify',$modify);
    //4.3获取表格里面姓名和年龄的值,填写到表单的姓名和年龄里面去。
        var name = $modify.parent().parent().children().eq(1).text();
        var age = $modify.parent().parent().children().eq(2).text();
        $('#modifyName').val(name);
        $('#modifyAge').val(age);
    });

    //5.点编辑弹出来的表单modal-modify,修改了姓名和年龄之后,按确定,
    //触发事件:把姓名和年龄的值,赋予跟当前编辑同一行的姓名和年龄。
    //$tbodyEles.data('currentModify')就是上面保存的当前编辑的jQuery对象$modify。
    $('#modifySure').on('click',function () {
        var mName = $('#modifyName').val();
        var mAge = $('#modifyAge').val();
        $tbodyEles.data('currentModify').parent().parent().children().eq(1).text(mName);
        $tbodyEles.data('currentModify').parent().parent().children().eq(2).text(mAge);
    });

    //6.点编辑弹出来的模态框的退出,就清空姓名和年龄的值,然后隐藏模态框
    $('#modifyExit').on('click',function () {
        $('#modifyName').val('');
        $('#modifyAge').val('');
        $('.cover,.modal-modify').addClass('hide');
    });
//------------------编辑结束---------------------------------

//------------------删除开始---------------------------------

    //7.删除一行,要用事件委托
    $tbodyEles.on('click','.cancel',function () {
    //7.1 先找到当前行的tr对象
        var $TrEles = $(this).parent().parent();
    //7.2 当前行的tr对象后面所有的tr的序号都要减一,
        // 当前行下面的所有对象$TrEles.nextAll()进行each循环,
    //$(this)就是$TrEles.nextAll(),而each会对$(this)的每一个对象循环。
        $TrEles.nextAll().each(function () {
            //each先找到第一个文本,然后减一,接着再找下一个
            var trNum = $(this).children().first().text();
            $(this).children().first().text(trNum-1);

        });
    //使用for循环也可以:
    //      for(var i = 0 ; i<$TrEles.nextAll().length; i++){
    //     var trNum1 = $($TrEles.nextAll()[i]).children().first().text();
    //     $($TrEles.nextAll()[i]).children().first().text(trNum1-1);
    // }
    //7.3 删除当前行,要最后进行,如果放在前面删除了,就无法找到当前对象了。
        $TrEles.remove();
    });
//------------------删除结束---------------------------------

</script>
</body>
</html>
    
原文地址:https://www.cnblogs.com/python-daxiong/p/12490937.html