jQuery事件_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
因?yàn)镴avaScript在瀏覽器中以單線程模式運(yùn)行,頁(yè)面加載后,一旦頁(yè)面上所有的JavaScript代碼被執(zhí)行完后,就只能依賴觸發(fā)事件來(lái)執(zhí)行JavaScript代碼。
瀏覽器在接收到用戶的鼠標(biāo)或鍵盤(pán)輸入后,會(huì)自動(dòng)在對(duì)應(yīng)的DOM節(jié)點(diǎn)上觸發(fā)相應(yīng)的事件。如果該節(jié)點(diǎn)已經(jīng)綁定了對(duì)應(yīng)的JavaScript處理函數(shù),該函數(shù)就會(huì)自動(dòng)調(diào)用。
由于不同的瀏覽器綁定事件的代碼都不太一樣,所以用jQuery來(lái)寫(xiě)代碼,就屏蔽了不同瀏覽器的差異,我們總是編寫(xiě)相同的代碼。
舉個(gè)例子,假設(shè)要在用戶點(diǎn)擊了超鏈接時(shí)彈出提示框,我們用jQuery這樣綁定一個(gè)click事件:
/* HTML:
*
* <a id="test-link" href="#0" rel="external nofollow" >點(diǎn)我試試</a>
*
*/
// 獲取超鏈接的jQuery對(duì)象:
var a = $('#test-link');
a.on('click', function () {
alert('Hello!');
});
on方法用來(lái)綁定一個(gè)事件,我們需要傳入事件名稱和對(duì)應(yīng)的處理函數(shù)。
另一種更簡(jiǎn)化的寫(xiě)法是直接調(diào)用click()方法:
a.click(function () {
alert('Hello!');
});
兩者完全等價(jià)。我們通常用后面的寫(xiě)法。
jQuery能夠綁定的事件主要包括:
鼠標(biāo)事件
click: 鼠標(biāo)單擊時(shí)觸發(fā); dblclick:鼠標(biāo)雙擊時(shí)觸發(fā); mouseenter:鼠標(biāo)進(jìn)入時(shí)觸發(fā); mouseleave:鼠標(biāo)移出時(shí)觸發(fā); mousemove:鼠標(biāo)在DOM內(nèi)部移動(dòng)時(shí)觸發(fā); hover:鼠標(biāo)進(jìn)入和退出時(shí)觸發(fā)兩個(gè)函數(shù),相當(dāng)于mouseenter加上mouseleave。
鍵盤(pán)事件
鍵盤(pán)事件僅作用在當(dāng)前焦點(diǎn)的DOM上,通常是<input>和<textarea>。
keydown:鍵盤(pán)按下時(shí)觸發(fā); keyup:鍵盤(pán)松開(kāi)時(shí)觸發(fā); keypress:按一次鍵后觸發(fā)。
其他事件
focus:當(dāng)DOM獲得焦點(diǎn)時(shí)觸發(fā); blur:當(dāng)DOM失去焦點(diǎn)時(shí)觸發(fā); change:當(dāng)<input>、<select>或<textarea>的內(nèi)容改變時(shí)觸發(fā); submit:當(dāng)<form>提交時(shí)觸發(fā); ready:當(dāng)頁(yè)面被載入并且DOM樹(shù)完成初始化后觸發(fā)。
其中,ready僅作用于document對(duì)象。由于ready事件在DOM完成初始化后觸發(fā),且只觸發(fā)一次,所以非常適合用來(lái)寫(xiě)其他的初始化代碼。假設(shè)我們想給一個(gè)<form>表單綁定submit事件,下面的代碼沒(méi)有預(yù)期的效果:
<html>
<head>
<script>
// 代碼有誤:
$('#testForm).on('submit', function () {
alert('submit!');
});
</script>
</head>
<body>
<form id="testForm">
...
</form>
</body>
因?yàn)镴avaScript在此執(zhí)行的時(shí)候,<form>尚未載入瀏覽器,所以$('#testForm)返回[],并沒(méi)有綁定事件到任何DOM上。
所以我們自己的初始化代碼必須放到document對(duì)象的ready事件中,保證DOM已完成初始化:
<html>
<head>
<script>
$(document).on('ready', function () {
$('#testForm).on('submit', function () {
alert('submit!');
});
});
</script>
</head>
<body>
<form id="testForm">
...
</form>
</body>
這樣寫(xiě)就沒(méi)有問(wèn)題了。因?yàn)橄嚓P(guān)代碼會(huì)在DOM樹(shù)初始化后再執(zhí)行。
由于ready事件使用非常普遍,所以可以這樣簡(jiǎn)化:
$(document).ready(function () {
// on('submit', function)也可以簡(jiǎn)化:
$('#testForm).submit(function () {
alert('submit!');
});
});
甚至還可以再簡(jiǎn)化為:
$(function () {
// init...
});
上面的這種寫(xiě)法最為常見(jiàn)。如果你遇到$(function () {...})的形式,牢記這是document對(duì)象的ready事件處理函數(shù)。
完全可以反復(fù)綁定事件處理函數(shù),它們會(huì)依次執(zhí)行:
$(function () {
console.log('init A...');
});
$(function () {
console.log('init B...');
});
$(function () {
console.log('init C...');
});
事件參數(shù)
有些事件,如mousemove和keypress,我們需要獲取鼠標(biāo)位置和按鍵的值,否則監(jiān)聽(tīng)這些事件就沒(méi)什么意義了。所有事件都會(huì)傳入Event對(duì)象作為參數(shù),可以從Event對(duì)象上獲取到更多的信息:
$(function () {
$('#testMouseMoveDiv').mousemove(function (e) {
$('#testMouseMoveSpan').text('pageX = ' + e.pageX + ', pageY = ' + e.pageY);
});
});
取消綁定
一個(gè)已被綁定的事件可以解除綁定,通過(guò)off('click', function)實(shí)現(xiàn):
function hello() {
alert('hello!');
}
a.click(hello); // 綁定事件
// 10秒鐘后解除綁定:
setTimeout(function () {
a.off('click', hello);
}, 10000);
需要特別注意的是,下面這種寫(xiě)法是無(wú)效的:
// 綁定事件:
a.click(function () {
alert('hello!');
});
// 解除綁定:
a.off('click', function () {
alert('hello!');
});
這是因?yàn)閮蓚€(gè)匿名函數(shù)雖然長(zhǎng)得一模一樣,但是它們是兩個(gè)不同的函數(shù)對(duì)象,off('click', function () {...})無(wú)法移除已綁定的第一個(gè)匿名函數(shù)。
為了實(shí)現(xiàn)移除效果,可以使用off('click')一次性移除已綁定的click事件的所有處理函數(shù)。
同理,無(wú)參數(shù)調(diào)用off()一次性移除已綁定的所有類型的事件處理函數(shù)。
事件觸發(fā)條件
一個(gè)需要注意的問(wèn)題是,事件的觸發(fā)總是由用戶操作引發(fā)的。例如,我們監(jiān)控文本框的內(nèi)容改動(dòng):
var input = $('#test-input');
input.change(function () {
console.log('changed...');
});
當(dāng)用戶在文本框中輸入時(shí),就會(huì)觸發(fā)change事件。但是,如果用JavaScript代碼去改動(dòng)文本框的值,將不會(huì)觸發(fā)change事件:
var input = $('#test-input');
input.val('change it!'); // 無(wú)法觸發(fā)change事件
有些時(shí)候,我們希望用代碼觸發(fā)change事件,可以直接調(diào)用無(wú)參數(shù)的change()方法來(lái)觸發(fā)該事件:
var input = $('#test-input');
input.val('change it!');
input.change(); // 觸發(fā)change事件
input.change()相當(dāng)于input.trigger('change'),它是trigger()方法的簡(jiǎn)寫(xiě)。
為什么我們希望手動(dòng)觸發(fā)一個(gè)事件呢?如果不這么做,很多時(shí)候,我們就得寫(xiě)兩份一模一樣的代碼。
瀏覽器安全限制
在瀏覽器中,有些JavaScript代碼只有在用戶觸發(fā)下才能執(zhí)行,例如,window.open()函數(shù):
// 無(wú)法彈出新窗口,將被瀏覽器屏蔽:
$(function () {
window.open('/');
});
這些“敏感代碼”只能由用戶操作來(lái)觸發(fā):
var button1 = $('#testPopupButton1');
var button2 = $('#testPopupButton2');
function popupTestWindow() {
window.open('/');
}
button1.click(function () {
popupTestWindow();
});
button2.click(function () {
// 不立刻執(zhí)行popupTestWindow(),100毫秒后執(zhí)行:
setTimeout(popupTestWindow, 100);
});
當(dāng)用戶點(diǎn)擊button1時(shí),click事件被觸發(fā),由于popupTestWindow()在click事件處理函數(shù)內(nèi)執(zhí)行,這是瀏覽器允許的,而button2的click事件并未立刻執(zhí)行popupTestWindow(),延遲執(zhí)行的popupTestWindow()將被瀏覽器攔截。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
15款優(yōu)秀的jQuery導(dǎo)航菜單插件分享
這篇文章收集了15款優(yōu)秀的jQuery導(dǎo)航菜單插件分享給大家。jQuery 是一個(gè)非常優(yōu)秀的 JavaScript 框架,使用簡(jiǎn)單靈活,同時(shí)還有許多成熟的插件可供選擇,jQuery 讓網(wǎng)站有更好的可用性和用戶體驗(yàn),給訪問(wèn)者對(duì)網(wǎng)站留下非常好的印象。2011-07-07
JQuery頁(yè)面的表格數(shù)據(jù)的增加與分頁(yè)的實(shí)現(xiàn)
使用JQuery實(shí)現(xiàn)頁(yè)面的表格數(shù)據(jù)的增加與分頁(yè),具體示例如下,喜歡的朋友可以參考下2013-12-12
jQuery學(xué)習(xí)筆記(4)--Jquery中獲取table中某列值的具體思路
由于要獲取某列中的一個(gè)ID值,如果用JS傳值的方式此問(wèn)題就不存在,由于此次用到的都是jquery插件,包括各種彈出框,用JS傳值就得用JS那丑陋的彈出框,所以,你懂得2013-04-04
Jquery利用mouseenter和mouseleave實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)彈出層且可以點(diǎn)擊
這篇文章主要介紹了Jquery利用mouseenter和mouseleave實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)彈出層且可以點(diǎn)擊。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02
jQuery+css+html實(shí)現(xiàn)頁(yè)面遮罩彈出框
面遮罩彈出框已經(jīng)不是一個(gè)陌生的話題了,實(shí)現(xiàn)的方法大同小異多種多樣,今天用jQuery實(shí)現(xiàn)頁(yè)面遮罩彈出框,主要用的技術(shù)有JQuery,css和html,感興趣的朋友可以參考下哈2013-03-03
jQuery根據(jù)name屬性進(jìn)行查找的用法分析
這篇文章主要介紹了jQuery根據(jù)name屬性進(jìn)行查找的用法,結(jié)合實(shí)例形式分析了jQuery各種常見(jiàn)name屬性獲取元素的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-06-06
jQuery中removeAttr()方法用法實(shí)例
這篇文章主要介紹了jQuery中removeAttr()方法用法,實(shí)例分析了removeAttr()方法的功能、定義及從匹配元素中移除相應(yīng)屬性的使用技巧,需要的朋友可以參考下2015-01-01
jQuery實(shí)現(xiàn)的類flash菜單效果代碼
這里要說(shuō)的就是一個(gè)菜單的hover的效果,一般我們通過(guò)CSS的偽類:hover實(shí)現(xiàn)的菜單切換都比較單調(diào),因?yàn)閮H僅是一個(gè)簡(jiǎn)單的圖片的變化,不像很多flash菜單一樣變化非常的平滑,但是這里我們就是要用非flash的技術(shù)實(shí)現(xiàn)一個(gè)平滑的hover效果。2010-05-05

