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

Web前端学习笔记—— jQuery之事件机制、补充、插件

程序员文章站 2022-03-03 07:50:12
...

jQuery事件机制

  • JavaScript中已经学习过了事件,jQuery对JavaScript事件进行了封装,增加并扩展了事件处理机制。jQuery不仅提供了更加优雅的事件处理语法,而且极大的增强了事件的处理能力。

jQuery事件发展历程(了解)

简单事件绑定–bind事件绑定–delegate事件绑定–on事件绑定(推荐)

  • 简单事件注册
click(handler)			单击事件
mouseenter(handler)		鼠标进入事件
mouseleave(handler)		鼠标离开事件

缺点:不能同时注册多个事件

  • bind方式注册事件
// 第一个参数:事件类型
// 第二个参数:事件处理程序
$('p').bind('click mouseenter', function(){
    // 事件响应方法
});

缺点:不支持动态事件绑定

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>title</title>
  <script src="jquery-1.12.1.js"></script>
  <script>
    $(function () {

      //为按钮绑定鼠标进入,鼠标离开,点击事件
      //第一种写法
//      $("#btn").mouseenter(function () {
//        $(this).css("backgroundColor","red");
//      });
//      $("#btn").mouseleave(function () {
//        $(this).css("backgroundColor","green");
//      });
//      $("#btn").click(function () {
//        alert("啊~我被点了");
//      });

      //第二种写法:链式编程
//      $("#btn").mouseenter(function () {
//        $(this).css("backgroundColor","red");
//      }).mouseleave(function () {
//        $(this).css("backgroundColor","green");
//      }).click(function () {
//        alert("啊~我被点了");
//      });

      //第三种写法:bind方法绑定事件
//      $("#btn").bind("click",function () {
//        alert("哦买雷电嘎嘎闹");
//      });
//      $("#btn").bind("mouseenter",function () {
//        $(this).css("backgroundColor","red");
//      });
//      $("#btn").bind("mouseleave",function () {
//        $(this).css("backgroundColor","green");
//      });

      //第四种写法:链式编程
//      $("#btn").bind("click",function () {
//        alert("哦买雷电嘎嘎闹");
//      }).bind("mouseenter",function () {
//        $(this).css("backgroundColor","red");
//      }).bind("mouseleave",function () {
//        $(this).css("backgroundColor","green");
//      });
      //第五种写法:使用键值对的方式绑定事件
//      $("#btn").bind({"click":function () {
//        alert("哦买雷电嘎嘎闹");
//      },"mouseenter":function () {
//        $(this).css("backgroundColor","red");
//      },"mouseleave":function () {
//        $(this).css("backgroundColor","green");
//      }});
    });
  </script>
</head>
<body>
<input type="button" value="显示效果" id="btn" />

</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>title</title>
  <script src="jquery-1.12.1.js"></script>
  <script>
    $(function () {
      //为按钮绑定多个相同事件
//      $("#btn").click(function () {
//        console.log("小苏好猥琐哦");
//      }).click(function () {
//        console.log("小苏好美啊");
//      }).click(function () {
//        console.log("天冷了,注意身体");
//      });

//      $("#btn").bind("click",function () {
//        console.log("哈哈,我又变帅了");
//      }).bind("click",function () {
//        console.log("我轻轻来,正如我轻轻走,挥一挥手,不带走一个妹子");
//      });

      //bind方法绑定多个相同的事件的时候,如果使用的是键值对的方式,只能执行最后一个
      $("#btn").bind({"click":function () {
        console.log("如果有一天我邪恶了");
      },"click":function () {
        console.log("请记住,我曾纯洁过");
      }});

    });

    //bind方法内部是调用的另一个方法绑定的事件

  </script>
</head>
<body>
<input type="button" value="显示效果" id="btn"/>

</body>
</html>
  • delegate注册委托事件
// 第一个参数:selector,要绑定事件的元素
// 第二个参数:事件类型
// 第三个参数:事件处理函数
$('.parentBox').delegate('p', 'click', function(){
    // 为 .parentBox下面的所有的p标签绑定事件
});

缺点:只能注册委托事件,因此注册时间需要记得方法太多了

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>title</title>
  <style>
    div{
      width: 200px;
      height: 100px;
      border: 2px solid green;
    }
    p{
      width: 150px;
      height: 50px;
      border: 1px solid red;
      cursor: pointer;
    }
  </style>
  <script src="jquery-1.12.1.js"></script>
  <script>
    //点击按钮为div中的p标签绑定事件
    $(function () {
      $("#btn").click(function () {
        //为父级元素绑定事件,父级元素代替子级元素绑定事件
        //子级元素委托父级绑定事件

        //父级元素调用方法,为子级元素绑定事件
        $("#dv").delegate("p","click",function () {
          alert("啊!~,被点了");
        });
      });
    });

    //为元素绑定事件三种方式
    /*
    * 对象.事件名字(事件处理函数);---$("#btn").click(function(){});
    * 对象.bind("事件名字",事件处理函数);---$("#btn").bind("click",function(){});
    * 父级对象.delegate("子级元素","事件名字",事件处理函数);---->$("#dv").delegate("p","click",function(){});
    *
    *
    * */
  </script>
</head>
<body>
<input type="button" value="为div绑定事件" id="btn" />
<div id="dv">
  <p>这是p</p>
</div>
</body>
</html>
  • on注册事件

on注册事件(重点)

  • jQuery1.7之后,jQuery用on统一了所有事件的处理方法。
  • 最现代的方式,兼容zepto(移动端类似jQuery的一个库),强烈建议使用。

on注册简单事件

// 表示给$(selector)绑定事件,并且由自己触发,不支持动态绑定。
$(selector).on( 'click', function() {});

on注册事件委托

// 表示给$(selector)绑定代理事件,当必须是它的内部元素span才能触发这个事件,支持动态绑定
$(selector).on( 'click','span', function() {});

事件委托原理

// 事件委托的原理
var ul = document.querySelector('#ul');
ul.onclick = function (e) {
  // console.log(e.target.tagName);
  if (e.target.tagName.toLowerCase() === 'li') {
    console.log(e.target);
  }
}

on注册事件的语法:

// 第一个参数:events,绑定事件的名称可以是由空格分隔的多个事件(标准事件或者自定义事件)
// 第二个参数:selector, 执行事件的后代元素(可选),如果没有后代元素,那么事件将有自己执行。
// 第三个参数:data,传递给处理函数的数据,事件触发的时候通过event.data来使用(不常使用)
// 第四个参数:handler,事件处理函数
$(selector).on(events[,selector][,data],handler);
  • 通过源码查看 bind click delegate on 注册事件的区别

事件解绑

  • unbind方式(不用)
$(selector).unbind(); // 解绑所有的事件
$(selector).unbind('click'); // 解绑指定的事件
  • undelegate方式(不用)
$( selector ).undelegate(); // 解绑所有的delegate事件
$( selector).undelegate( 'click' ); // 解绑所有的click事件
  • off方式(推荐)
// 解绑匹配元素的所有事件
$(selector).off();
// 解绑匹配元素的所有click事件
$(selector).off('click');

触发事件

$(selector).click(); // 触发 click事件
$(selector).trigger('click');

jQuery事件对象

jQuery事件对象其实就是js事件对象的一个封装,处理了兼容性。

// screenX和screenY	对应屏幕最左上角的值
// clientX和clientY	距离页面左上角的位置(忽视滚动条)
// pageX和pageY	距离页面最顶部的左上角的位置(会计算滚动条的距离)

// event.keyCode	按下的键盘代码
// event.data	存储绑定事件时传递的附加数据

// event.stopPropagation()	阻止事件冒泡行为
// event.preventDefault()	阻止浏览器默认行为
// return false:既能阻止事件冒泡,又能阻止浏览器默认行为。

案例

  • 按键变色 [19-按键变色.html]
<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .wrap {
            width: 400px;
            height: 400px;
            margin: 100px auto 0;
        }

        .wrap h1 {
            text-align: center;
        }

        .wrap div {
            width: 400px;
            height: 300px;
            background: pink;
            font-size: 30px;
            text-align: center;
            line-height: 300px;
        }
    </style>
    <script src="vendor/jquery.js"></script>
    <script>
        $(function () {
            //需求:在页面中按下键盘上的键的时候,获取他的Unicode编码给定body背景色;
            $(document).keyup(function (event) {
                //alert(event.keyCode);
                //r:82;   p:80;    b:66;    o:79;    y:89;    s:83;
                $("#keyCodeSpan").text(event.keyCode);
                changeDivBackground(event.keyCode);
            });

            //封装一个方法,根据传递的参数值,改变div的背景色;
            function changeDivBackground(num){
                switch (num){
                    case 82:
                        $("#bgChange").css("background-color","red");
                        break;
                    case 80:
                        $("#bgChange").css("background-color","purple");
                        break;
                    case 66:
                        $("#bgChange").css("background-color","blue");
                        break;
                    case 79:
                        $("#bgChange").css("background-color","orange");
                        break;
                    case 89:
                        $("#bgChange").css("background-color","yellow");
                        break;
                    case 83:
                        $("#bgChange").css("background-color","skyblue");
                        break;
                    default :
                        $("#bgChange").css("background-color","pink");
                        $("#keyCodeSpan").text("查无此键");
                }
            }


        });
    </script>
</head>
<body>

    <div class="wrap">
        <h1>按键改变颜色</h1>
        <div id="bgChange">
            keyCode为:
            <span id="keyCodeSpan"></span>
        </div>
    </div>

</body>
</html>

jQuery补充知识点

链式编程

  • 通常情况下,只有设置操作才能把链式编程延续下去。因为获取操作的时候,会返回获取到的相应的值,无法返回 jQuery对象。
end(); // 筛选选择器会改变jQuery对象的DOM对象,想要回复到上一次的状态,并且返回匹配元素之前的状态。

each方法

  • jQuery的隐式迭代会对所有的DOM对象设置相同的值,但是如果我们需要给每一个对象设置不同的值的时候,就需要自己进行迭代了。

作用:遍历jQuery对象集合,为每个匹配的元素执行一个函数

// 参数一表示当前元素在所有匹配元素中的索引号
// 参数二表示当前元素(DOM对象)
$(selector).each(function(index,element){});

多库共存

  • jQuery使用作为标示符,但是如果与其他框架中的冲突时,jQuery可以释放$符的控制权.
var c = $.noConflict();// 释放$的控制权,并且把$的能力给了c

案例

  • 五角星评分案例 [20-五角星评分案例.html]

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>五角星评分案例</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .comment {
            font-size: 40px;
            color: red;
        }

        .comment li {
            float: left;
            cursor: pointer;
        }

        ul {
            list-style: none;
        }
    </style>
    <script src="vendor/jquery.js"></script>
    <script>
        jQuery(function () {
            //设置两个五角星
            var SXWJX = "★";
            var KXWJX = "☆";

            //需求1: 鼠标进入哪个li,让当前的li和之前的所有li内容设置为实心五角星,后面的设置为空心五角星;
            //需求2: 鼠标移开当前li,让之前记录位置(默认没有)的li和之前的所有li内容设置为实心五角星,后面的设置为空心五角星;
            //需求3: 鼠标点击哪个li,这个li就变成别记录的五角星,然后设置一个类名,方便下次获取,其他的去掉类名;



            //需求1: 鼠标进入哪个li,让当前的li和之前的所有li内容设置为实心五角星,后面的设置为空心五角星;
            $(".comment li").mouseenter(function () {
                //让当前的li和之前的所有li内容设置为实心五角星,后面的设置为空心五角星;
                $(this).text(SXWJX).prevAll("li").text(SXWJX).end().nextAll("li").text(KXWJX);
            });
            //需求2: 鼠标移开当前li,让之前记录位置(默认没有)的li和之前的所有li内容设置为实心五角星,后面的设置为空心五角星;
            $(".comment li").mouseout(function () {
                //判断:有记录以记录位置为基准,没有记录位置,全部设置空五角星;
                $(".comment li").text(KXWJX);
                //有就覆盖掉
                if($(".current").length === 1){
                    //让之前记录位置(默认没有)的li和之前的所有li内容设置为实心五角星,后面的设置为空心五角星;
                    $(".current").text(SXWJX).prevAll("li").text(SXWJX).end().nextAll("li").text(KXWJX);
                }
            });
            //需求3: 鼠标点击哪个li,这个li就变成别记录的五角星,然后设置一个类名,方便下次获取,其他的去掉类名;
            $(".comment li").click(function () {
                $(this).addClass("current").siblings("li").removeClass("current");
            });

        });
    </script>
</head>

<body>

    <ul class="comment">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>

</body>

</html>

插件

常用插件

自己探索插件

jQuery插件开发

  • 给jQuery增加方法的两种方式
$.method = fn		静态方法
$.fn.method = fn	实例方法
  • 增加一个静态方法,实现两个数的和,插件
(function ($) {
  $.add = function (a, b) {
    return a + b;
  }
}(jQuery))

$.add(5, 6);
  • tab栏插件 [21-tab栏插件.html]
(function ($) {
  // {tabMenu: '#aa'}
  $.tab = function (options) {
    // 默认参数
    var defaults = {
      tabMenu: '#tab',
      activeClass: 'active',
      tabMain: '#tab-main',
      tabMainSub: '.main',
      selectedClass: 'selected'
    }
    // 把options中的属性,把对应属性的值赋给defaults对应的属性
    // defaults.tabMenu = options.tabMenu || defaults.tabMenu;
    // for(var key in options) {
    //   defaults[key] = options[key];
    // }
    $.extend(defaults, options);

    $(defaults.tabMenu).on('click', 'li', function () {
      $(this)
        .addClass(defaults.activeClass)
        .siblings()
        .removeClass(defaults.activeClass);

      //
      var index = $(this).index();
      //
      $(defaults.tabMain + ' ' + defaults.tabMainSub)
        .eq(index)
        .addClass(defaults.selectedClass)
        .siblings()
        .removeClass(defaults.selectedClass);
    })
  }
}(window.jQuery))
  • 表格插件 [22-表格插件.html]
(function($) {
  // 内部的变量,外部无法访问,防止变量名冲突
  var a = 0;
  // 给$增加了一个实例方法
  $.fn.table = function (header, data) {
    var array = [];
    array.push('<table>');
    array.push('<tr>');

    // 生成表头
    $.each(header, function () {
      array.push('<th>' + this + '</th>');
    })
    array.push('</tr>');


    // 生成数据行
    $.each(data, function (index) {
      // this是当前遍历到的数组中的每一个对象
      // 拼数据行
      array.push('<tr>');
      array.push('<td>' + (index + 1) + '</td>');

      // 遍历对象,拼表格
      for (var key in this) {
        array.push('<td>' + this[key] + '</td>');
      }

      array.push('</tr>');
    })
    array.push('</table>');

    this.append(array.join(''));
  }

}(window.jQuery))
  • 插件开发的原理
相关标签: WEB前端