1. 程式人生 > >jQuery基礎事件繫結

jQuery基礎事件繫結

學習要點:

1.繫結事件

2.簡寫事件

3.複合事件

JavaScript有一個非常重要的功能,就是事件驅動。當頁面完全載入後,使用者通過滑鼠 或鍵盤觸發頁面中繫結事件的元素即可觸發。jQuery為開發者更有效率的編寫事件行為,封 裝了大量有益的事件方法供我們使用。

一.繫結事件

在 JavaScript 課程的學習中,我們掌握了很多使用的事件,常用的事件有:click、dblclick、mousedown、mouseup、mousemove、mouseover、mouseout、change、select、submit、keydown、keypress、keyup、blur、focus、load、resize、scroll、error。那麼,還有更多的事件可以參考 手冊中的事件部分。

jQuery 通過.bind()方法來為元素繫結這些事件。可以傳遞三個引數:bind(type, [data], fn), type 表示一個或多個型別的事件名字串;[data]是可選的,作為 event.data 屬性值傳遞一個 額外的資料,這個資料是一個字串、一個數字、一個數組或一個物件;fn 表示繫結到指 定元素的處理函式。

//使用點選事件

$('input').bind('click', function () {                     //點選按鈕後執行匿名函式

alert('點選!');

});

//普通處理函式

$('input').bind('click', fn);                                  //執行普通函式式無須圓括號

function fn() {

alert('點選!');

}

//可以同時繫結多個事件

$('input').bind('mouseout mouseover', function () {     //移入和移出分別執行一次

$('div').html(function (index, value) {

return value + '1';

});

});

//通過物件鍵值對繫結多個引數

$('input').bind({                                                      //傳遞一個物件

'mouseout' : function () {                                  //事件名的引號可以省略

alert('移出');

},

'mouseover' : function () {

alert('移入');

}

});

//使用 unbind 刪除繫結的事件

$('input').unbind();                                                  //刪除所有當前元素的事件

//使用 unbind 引數刪除指定型別事件

$('input').unbind('click');                                          //刪除當前元素的 click 事件

//使用 unbind 引數刪除指定處理函式的事件

function fn1() {

alert('點選 1');

}

function fn2() {

alert('點選 2');

}

$('input').bind('click', fn1);

$('input').bind('click', fn2);

$('input').unbind('click', fn1);                                   //只刪除 fn1 處理函式的事件 二.簡寫事件

為了使開發者更加方便的繫結事件,jQuery 封裝了常用的事件以便節約更多的程式碼。我 們稱它為簡寫事件。

簡寫事件繫結方法

方法名

觸發條件

描述

click(fn)

滑鼠

觸發每一個匹配元素的 click(單擊)事件

dblclick(fn)

滑鼠

觸發每一個匹配元素的 dblclick(雙擊)事件

mousedown(fn)

滑鼠

觸發每一個匹配元素的 mousedown(點選後)事件

mouseup(fn)

滑鼠

觸發每一個匹配元素的 mouseup(點選彈起)事件

mouseover(fn)

滑鼠

觸發每一個匹配元素的 mouseover(滑鼠移入)事件

mouseout(fn)

滑鼠

觸發每一個匹配元素的 mouseout(滑鼠移出)事件

mousemove(fn)

滑鼠

觸發每一個匹配元素的 mousemove(滑鼠移動)事件

mouseenter(fn)

滑鼠

觸發每一個匹配元素的 mouseenter(滑鼠穿過)事件

mouseleave(fn)

滑鼠

觸發每一個匹配元素的 mouseleave(滑鼠穿出)事件

keydown(fn)

鍵盤

觸發每一個匹配元素的 keydown(鍵盤按下)事件

keyup(fn)

鍵盤

觸發每一個匹配元素的 keyup(鍵盤按下彈起)事件

keypress(fn)

鍵盤

觸發每一個匹配元素的 keypress(鍵盤按下)事件

unload(fn)

文件

當解除安裝本頁面時繫結一個要執行的函式

resize(fn)

文件

觸發每一個匹配元素的 resize(文件改變大小)事件

scroll(fn)

文件

觸發每一個匹配元素的 scroll(滾動條拖動)事件

focus(fn)

表單

觸發每一個匹配元素的 focus(焦點啟用)事件

blur(fn)

表單

觸發每一個匹配元素的 blur(焦點丟失)事件

focusin(fn)

表單

觸發每一個匹配元素的 focusin(焦點啟用)事件

focusout(fn)

表單

觸發每一個匹配元素的 focusout(焦點丟失)事件

select(fn)

表單

觸發每一個匹配元素的 select(文字選定)事件

change(fn)

表單

觸發每一個匹配元素的 change(值改變)事件

submit(fn)

表單

觸發每一個匹配元素的 submit(表單提交)事件

注意:這裡封裝的大部分方法都比較好理解,我們沒必要一一演示確認,重點看幾個需

要注意區分的簡寫方法。

.mouseover()和.mouseout()表示滑鼠移入和移出的時候觸發。那麼 jQuery 還封裝了另外 一組:.mouseenter()和.mouseleave()表示滑鼠穿過和穿出的時候觸發。那麼這兩組本質上有 什麼區別呢?手冊上的說明是:.mouseenter() 和.mouseleave()這組穿過子元素不會觸發, 而.mouseover()和.mouseout()則會觸發。

//HTML 頁面設定

<div style="width:200px;height:200px;background:green;">

<p style="width:100px;height:100px;background:red;"></p>

</div>

<strong></strong>

//mouseover 移入

$('div').mouseover(function () {                               //移入 div 會觸發,移入 p 再觸發

$('strong').html(function (index, value) {

return value+'1';

});

});

//mouseenter 穿過

$('div').mouseenter(function () {                               //穿過 div 或者 p

$('strong').html(function (index, value) {            //在這個區域只觸發一次

return value+'1';

});

});

//mouseout 移出

$('div').mouseout(function () {                                 //移出 p 會觸發,移出 div 再觸發

$('strong').html(function (index, value) {

return value+'1';

});

}); 

//mouseleave 穿出

$('div').mouseleave(function () {                               //移出整個 div 區域觸發一次

$('strong').html(function (index, value) {

return value+'1'; 

});

}); 

.keydown()、.keyup()返回的是鍵碼,而.keypress 返回的是字元編碼。

$('input').keydown(function (e) {

alert(e.keyCode);                                              //按下 a 返回 65

});

$('input').keypress(function (e) {

alert(e.charCode);                                             //按下 a 返回 97

});

注意:e.keyCode 和 e.charCode 在兩種事件互換也會產生不同的效果,除了字元還有一 些非字元鍵的區別。更多詳情可以瞭解 JavaScript 事件處理那章。

.focus()和.blur()分別表示游標啟用和丟失,事件觸發時機是當前元素。而.focusin()

和.focusout()也表示游標啟用和丟失,但事件觸發時機可以是子元素。

//HTML 部分

<div style="width:200px;height:200px;background:red;">

<input type="text" value="" />

</div>

<strong></strong>

//focus 游標啟用

$('input').focus(function () {                                    //當前元素觸發

$('strong').html('123');

}); 

//focusin 游標啟用

$('div').focusin(function () {                                    //繫結的是 div 元素,子類 input 觸發

$('strong').html('123');

});

注意:.blur()和.focusout()表示游標丟失,和啟用類似,一個必須當前元素觸發,一個可 以是子元素觸發。

三.複合事件

jQuery 提供了許多最常用的事件效果,組合一些功能實現了一些複合事件,比如切換功 能、智慧載入等。

複合事件

方法名

描述

ready(fn)

當 DOM 載入完畢觸發事件

hover([fn1,]fn2)

當滑鼠移入觸發第一個 fn1,移出觸發 fn2

toggle(fn1,fn2[,fn3..])

已廢棄,當滑鼠點選觸發 fn1,再點選觸發 fn2...

//背景移入移出切換效果

$('div').hover(function () {

$(this).css('background', 'black');                      //mouseenter 效果

}, function () {

$(this).css('background', 'red');                         //mouseleave 效果,可省略

});

注意:.hover()方法是結合了.mouseenter()方法和.mouseleva()方法,並非.mouseover()

和.mouseout()方法。

.toggle()這個方法比較特殊,這個方法有兩層含義,第一層含義就是已經被 1.8 版廢用、

1.9 版刪除掉的用法,也就是點選切換複合事件的用法。第二層函式將會在動畫那章講解到。 既然廢棄掉了,就不應該使用。被刪除的原因是:以減少混亂和提高潛在的模組化程度。

但你又非常想用這個方法,並且不想自己編寫類似的功能,可以下載 jquery-migrate.js

檔案,來向下相容已被刪除掉的方法。

//背景點選切換效果(1.9 版刪除掉了)

<script type="text/javascript" src="jquery-migrate-1.2.1.js"></script>

$('div').toggle(function () {                                      //第一次點選切換

$(this).css('background', 'black');

}, function () {                                                       //第二次點選切換

$(this).css('background', 'blue');

}, function () {                                                       //第三次點選切換

$(this).css('background', 'red');

});

注意:由於官方已經刪除掉這個方法,所以也是不推薦使用的,如果在不基於向下相容 的外掛 JS。我們可以自己實現這個功能。

var flag = 1;                                                            //計數器

$('div').click(function () {

if (flag == 1) {                                                 //第一次點選

$(this).css('background', 'black');

flag = 2;

} else if (flag == 2) {                                        //第二次點選

$(this).css('background', 'blue');

flag = 3

} else if (flag == 3) {                                        //第三次點選

$(this).css('background', 'red');

flag = 1

}

});