1. 程式人生 > 實用技巧 >11.jQuery—事件和篩選器方法

11.jQuery—事件和篩選器方法

目錄

一、事件

1、事件和事件流

HTML和js的互動是通過事件驅動來實現的,事件流描述的就是頁面接受事件的順序,“DOM2級事件”規定的事件流包括三個階段:(1)事件捕獲階段;(2)處於目標階段;(3)事件冒泡階段。

2、繫結事件的兩種方式:

<script src="jquery-3.1.1.js"></script>
    <script>
        //方式一
        $('#d1').click(function(){
            $(this).css({'background-color':'green'});
        })
        //方式二
        $('#d1').on('click', function(){
            $(this).css({'background-color':'green'});
        })
    </script>

3、常用事件:

  • click(function(){}) 滑鼠單擊觸發
  • dbclick(function(){}) 滑鼠雙擊觸發
  • hover(function(){})
  • focus(function(){}) 滑鼠聚焦觸發事件
  • blur(function(){}) 滑鼠失焦觸發
  • change(function(){}) 內容發生變化,input等
  • keydown(function(){}) 鍵盤按下觸發
  • keyup(function(){}) 鍵盤彈起觸發
  • mouseover(function(){}) 滑鼠移動觸發
  • mouseenter(fucntion(){}) 滑鼠進入觸發

mouseover和mouseenter的區別是:mouseover事件是如果該標籤有子標籤,那麼移動到該標籤或者子標籤時會連續觸發,mouseenter事件不敢管有沒有子標籤只觸發一次,表示滑鼠進入這個標籤。

mouseover示例:

4、鍵盤按下和抬起

keydown和keyup事件(鍵盤按下和抬起事件,還有一些其他的key事件),如:按下shift實現批量操作。

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>keydown和keyup</title>
    <style>
        .c1{
            height: 100px;
            width: 100px;
            background-color:rgb(173, 111, 30);
        }
    </style>
</head>
<body>
    <from name="" id="">
    keydown<input type="text" id="k1" value="0"><br>
    keyup<input type="text" id="k2">
    </from>
    <div id="" class="c1"></div>

<script src="jquery-3.1.1.js"></script>
<script>
    var num = 0;
    //window物件下的,e\event時當前事件物件
    $(window).keydown(function(e){
        console.log(e.keyCode)
        num++;
        //$("#k1").val(num)
        //e.keyCode    是每個按鍵對應的keyCode值,通過不同的值觸發不同的事件
        if(e.keyCode === 37){
            $('.c1').css({'background-color':'red'});

        }else if(e.keyCode === 39){
            $('.c1').css({'background-color':'green'})
        }
    });
    $(window).keyup(function(e){
        $('#k2').val(e.keyCode)
    })
</script>
</body>

二、事件冒泡

在一個物件上觸發某類事件(比如單擊onclick事件),如果此物件定義了此事件的處理程式,那麼此事件就會呼叫這個處理程式,如果沒有定義此事件處理程式或者事件返回true,那麼這個事件會向這個物件的父級物件傳播,從裡到外,直至它被處理(父級物件所有同類事件都將被啟用),或者它到達了物件層次的最頂層,即document物件(有些瀏覽器是window)。即一個子標籤的事件可能會觸發父級標籤的事件處理函式。

1、阻止事件冒泡

  1. 阻止事件冒泡:e.stopPropagation()方法
  2. 阻止預設行為:e.prevenDefault()方法
  3. return false 在jQuery中可以阻止事件冒泡和預設事件:jQuery不支援事件捕獲
$('a').click(function (ev) {
    //方法一:同時阻止預設事件和冒泡事件
    ev.preventDefault();    // 阻止預設事件
    ev.stopPropagation();   // 再阻止冒泡事件
    alert('不再跳轉頁面');
 
    // 方法二:
    return false;  // 這個可以阻止a標籤的預設事件和冒泡事件
})
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件冒泡</title>
    <style>
        #d1{
            background-color: red;
            height: 100px;

        }
        #d2{
            background-color: green;
            height: 100px;
            width: 100px;
        }
    </style>
</head>
<body>
    <div id="d1" class="" >
        <div id="d2" class=""></div>
    </div>
<script src="jquery-3.1.1.js"></script>
<script>
    $('#d1').click(function(){
        alert('父級標籤');
    });
    $('#d2').click(function(e){
        alert('子級標籤');
        //解決事件冒泡,這樣點選子標籤時,父標籤的的alert不會彈出,阻止事件冒泡
        //return false;
        //e.stopPropagation();
        
    })
</script>
</body>

三、事件繫結和移除

1、當前dom新增事件的兩種方法

// 方式一:給當前dom元素新增click事件
$('#box').click(fn);
 
// 方式二:給當前的dom元素繫結事件 bind()
// 語法:jquery物件.bind('事件型別',fn)
$('#box').bind('click mouseenter', function () {
    alert('事件被綁定了')
})

2、詳細事件和函式繫結到元素——bind()繫結方法

語法:$(select).bind(event, data,function)

引數:第一個引數是事件型別,常用click,blur,hover等;多個事件型別可以通過將每個空格分隔開來一次繫結。

可以通過傳遞事件型別/處理程式對的物件來同時繫結多個事件處理程式

第二個引數是可選引數,作為envet.data屬性值傳遞給事件物件的額外資料物件

第三個引數是用來繫結的處理函式

function add() {
    console.log('click');
}
function add2() {
    console.log('mouse-over')
}
// 給jquery物件新增不同的事件
$('#box').bind({
    'click': add,
    'mouseenter':add2
})

3、移出事件——unbind()

語法:unbind(type,fn)

第一個引數:事件型別。如果不寫引數,移除所有的事件:

// 如果沒有引數表示移除所有事件
$('#box').unbind();

第二個引數:將要移除的函式

$( "#foo").unbind( "click" ,function(){})

4、事件委託

事件委託是通過事件冒泡的原理,利用父標籤去捕獲子標籤的事件,將未來新增進來的某些子標籤自動綁上事件。將字標籤的事件統一給委託父標籤。

 事件委託(代理)使用情景:

  (1)為DOM中的很多元素繫結相同事件:事件註冊在祖先級元素上,代理其子級元素。可以減少事件註冊數量,節約記憶體開銷,提高效能。

  (2)為DOM中尚不存在的元素繫結事件:對js動態新增的子元素可自動繫結事件。

事件代理作用:

  (1)效能比較好;(2)針對新建立的元素,直接可以擁有事件。

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件委託</title>
</head>
<body>
    <div id='d1'>
        <button class='b1'>按鈕</button>
    </div>
<script src="jquery-3.1.1.js"></script>
<script>
    //這裡新增的按鈕不會有繫結事件
    //  $('.b1').on('click' ,function(){
    //     alert('轉圈圈');
    //     var btn = document.createElement('button');
    //     $(btn).text('按鈕');
    //     $(btn).addClass('b1');
    //     console.log(btn);
    //     //新增到div標籤裡面
    //     $('#d1').append(btn);
    // })
    //將button點選事件委託給父輩<div id="d1">的標籤,按鈕有繫結事件
    $('#d1').on('click', '.b1' ,function(){
        alert('轉圈圈');
        var btn = document.createElement('button');
        $(btn).text('按鈕');
        $(btn).addClass('b1');
        console.log(btn);
        //新增到div標籤裡面
        $('#d1').append(btn);
    })
</script>
</body>

四、頁面載入

等待整個頁面中的內容載入完成,觸發window.onload對應的函式裡面的內容

window.onload缺點:有覆蓋現象,會被後面的window.onload給重新複製

採用引入js的方式引入事件,會等待頁面載入完成再觸發,在頁面中寫,只會等待標籤載入完成就觸發對應事件,不會等待圖片和視訊載入完成

1. jquery檔案要在使用jquery的程式碼之前引入

2. js程式碼最好都放到body標籤下面或者裡面的最下面來寫

3.window.onload
	// window.onload = function () {
    //     $('.c1').click(function () {
    //         $(this).css({'background-color':'green'});
    //     })
    // }
4.頁面載入,$(function (){alert('xx');}) -- $(document).ready(function(){});
	頁面載入與window.onload的區別
    1.window.onload()函式有覆蓋現象,必須等待著圖片資源載入完成之後才能呼叫
    2.jQuery的這個入口函式沒有函式覆蓋現象,文件載入完成之後就可以呼叫(建議使用此函式)
    
示例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery.js"></script>
    <script>
        // 等待整個頁面中的內容全部載入完成之後,觸發window.onload對應的函式裡面的內容
        // window.onload 有覆蓋現象,會被後面的window.onload給重新賦值
        // window.onload = function () {
        //     $('.c1').click(function () {
        //         $(this).css({'background-color':'green'});
        //     })
        // }

        $(function () {
            $('.c1').click(function () {
                $(this).css({'background-color':'green'});
            })
        });

    </script>
    <script src="xx.js"></script>


    <style>
        .c1{
            background-color: red;
            height: 200px;
            width: 200px;
        }
    </style>
</head>
<body>
<div class="c1"></div>
<img src="" alt="">
</body>
</html>

五、表單事件

1、change():表單元素髮生改變時觸發事件

//change()事件————表單元素髮生改變時觸發事件
//此事件僅限於input元素、textarea框、select元素。
//對於選擇框,複選框和單選按鈕,當用戶使用滑鼠進行選擇時,會立即觸發事件。
$('select').change(function(){
    console.log($('select option:selected').text());
 
    $('.show').text($('select option:selected').text());
})

2、select():文字元素髮生改變時觸發事件

// select()事件————文字元素髮生改變時觸發事件
// 僅限於用在input type=text 或 textarea  表單元素
$('#other').select(function () {
    console.log($(this).val());
})

3、submit():表單元素髮生改變時觸發事件

// form表單和服務端有很大的掛鉤:form表單有預設的submit行為,當對input type=submit按鈕點選的時候會觸發form的預設action行為,
// 此時可以呼叫 jquery的submit方法通過e.preventDefault()來阻止預設事件,這樣我們就能動態的跟服務端來發送資料了
$('form').submit(function (ev) {
    // alert(1111);  // 觸發submit事件彈出1111,再觸發form表單的預設行為跳轉到路飛官網
 
    // 阻止預設事件
    ev.preventDefault();
    alert(1111);  // 只會觸發submit事件彈出1111
})