1. 程式人生 > 實用技巧 >jQuery之事件

jQuery之事件

事件處理

事件繫結:

  • 兩種方式

    eventName(function(){}):繫結對應事件名的監聽,例如:$('#div').click(function(){})。

    on(eventName, funcion(){}):通用的繫結事件監聽,例如:$('#div').on('click', function(){})。

  • 優缺點

    eventName:編碼方便,但只能加一個監聽,且有的事件監聽不支援。

    on:編碼不方便,可以新增多個監聽,且更通用。

  • 常用

    click/mouseenter/mouseleave/mouseover/mouseout/focus/blur

事件解綁:

  off(eventName):解綁事件監聽。

事件座標:

  event.clientX,event.clientY:相對於視口的左上角。

  event.pageX,event.pageY:相對於頁面的左上角。

  event.offsetX,event.offsetY:相對於事件元素左上角。

圖示:

示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件繫結與解綁</title>
    <
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> </head> <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> <script type="text/javascript" src="../js/jquery.min.js"></script> <script type="text/javascript"> /* * 需求: * 1.給.out繫結點選監聽(用兩種方法繫結) * 2.給.inner繫結滑鼠移入和移出的事件監聽(用3種方法繫結) * 3.點選btn1解除.inner上的所有事件監聽 * 4.點選btn2解除.inner上的mouseover事件 * 5.點選btn3得到事件座標 * 6.點選.inner區域,外部點選監聽不響應 * 7.點選連結,如果當前時間是偶數不跳轉 */ $(function (){ //1.給.out繫結點選監聽(用兩種方法繫結) $('.out').click(function () { console.log('out click1'); }); $('.out').on('click', function () { console.log('out clicked2'); }); //2.給.inner繫結滑鼠移入和移出的事件監聽(用3種方法繫結) $('.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) { 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>

事件切換

區別mouseovermouseenter

  mouseover:在移入子元素時也會觸發,對應mouseout

  mouseenter:只在移入當前元素時才觸發,對應mouseleave

  hover():同時繫結滑鼠移入和移出監聽,使用的就是mouseenter()mouseleave()

示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件切換</title>
    <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>
</head>
<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>

<script type="text/javascript" src="../js/jquery.min.js"></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>

事件委派(委託)

說明:

  將多個子元素(li)的事件監聽委託給父輩元素(ul)處理。

  事件監聽繫結在父元素上,當操作任何一個子元素(li)時,事件會冒泡到父輩元素(ul)。

  父輩元素不會直接處理事件,而是根據event.target得到發生事件的子元素(li),通過這個子元素呼叫事件回撥函式。

事件委託的雙方:

  委託方:業主(li

  被委託方:中介(ul

好處:

  新增新的子元素,自動有事件響應處理。

  減少事件監聽的數量:n==>1。

事件委託API:

  $(parentSelector).delegate(childrenSelector, eventName, callback):設定事件委託。

  $(parentSelector).undelegate(eventName):移除事件委託。

示例一:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委託</title>
</head>
<body>

<ul>
    <li>11111</li>
    <li>1111111</li>
    <li>111111111</li>
    <li>11111111111</li>
</ul>

<li>22222</li>
<br>
<button id="btn">新增新的li</button>
<br>

<script type="text/javascript" src="../js/jquery.min.js"></script>
<script type="text/javascript">

    /*
     * 需求:
     * 1.點選 li 背景就會變為紅色
     * 2.點選 btn1 就新增一個 li
     */
    $(function (){
        //1.點選li背景就會變為紅色
        $('ul>li').click(function () {
            this.style.background = 'red'
        });
        //2.點選btn1就新增一個li
        $('#btn').click(function () {
            $('ul').append('<li>xxxxxxxxxxxx</li>')
        })
    });
</script>
</body>
</html>

示例二:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件委託</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>

<script type="text/javascript" src="../js/jquery.min.js"></script>
<script type="text/javascript">
    $(function (){
        //事件委託
        $('ul').delegate('li', 'click', function () {
            this.style.background = 'red'
        });
        $('#btn1').click(function () {
            $('ul').append('<li>xxxxxxxxx</li>')
        });
        $('#btn2').click(function () {
            //移除事件委託
            $('ul').undelegate()
        });
    });
</script>
</body>
</html>

事件相關

event.stopPropagation():停止事件冒泡。

event.preventDefault():阻止事件預設行為。