jQuery 4 事件和動畫
一.事件
具體事件 | 描述 |
滑鼠事件 | |
click() | 觸發、或将函數綁定到指定元素的 單擊 事件 |
dblclick() | 觸發、或将函數綁定到指定元素的 輕按兩下 事件 |
focus() | 觸發、或将函數綁定到指定元素的 獲得焦點 事件 |
blur() | 觸發、或将函數綁定到指定元素的 失去焦點 事件 |
mousedown() | 觸發、或将函數綁定到指定元素的 按下滑鼠按鈕 事件 |
mouseup() | 觸發、或将函數綁定到指定元素的 松開滑鼠按鈕 事件 |
mousemove() | 觸發、或将函數綁定到指定元素的 指針移動 事件 |
mouseenter() | 觸發、或将函數綁定到指定元素的 指針進入元素 事件 |
mouseleave() | 觸發、或将函數綁定到指定元素的 指針離開元素 事件,常常與mouseenter()共同使用 |
mouseover() | 觸發、或将函數綁定到指定元素的 指針位于上方 事件 |
mouseout() | 觸發、或将函數綁定到指定元素的 指針移開 事件,常常與mouseover()共同使用 |
mouseenter,mouseleave與mouseover,moseout的差別: mouseenter,mouseleave:隻有在滑鼠指針進入/離開被選元素時,才會觸發 mouseover,moseout:滑鼠指針位于之上/移開被選元素及其包含元素,都會觸發 | |
鍵盤事件 | |
keydown() | 觸發、或将函數綁定到指定元素的 按下鍵盤按鈕 事件 |
keyup() | 觸發、或将函數綁定到指定元素的 松開鍵盤按鈕 事件 |
keypress() | 觸發、或将函數綁定到指定元素的 按下鍵盤按鈕 事件 |
與 keypress 事件相關的事件順序: 1.keydown -鍵按下的過程 2.keypress - 鍵被按下 3.keyup -鍵被松開 keypress 事件與 keydown事件類似。當按鈕被按下時發生該事件。然而,keypress事件不會 觸發所有的鍵(比如 ALT、CTRL、SHIFT、ESC)。請使用keydown()方法來檢查這些鍵。 | |
表單事件 | |
focus() | 觸發、或将函數綁定到指定元素的 獲得焦點 事件 |
blur() | 觸發、或将函數綁定到指定元素的 失去焦點 事件 |
change() | 觸發、或将函數綁定到指定元素的 change 事件 元素的值發生改變時,會發生 change 事件(僅适用于表單字段)。 該事件僅适用于text,以及textarea和select元素。 |
select() | 觸發、或将函數綁定到指定元素的 select 事件 當 textarea 或text類型的input元素中的文本被選擇(标記)時,會發生select事件 |
submit() | 觸發、或将函數綁定到指定元素的 submit 事件。 當送出表單時,會發生 submit 事件。該事件隻适用于<form>元素。 <form>···<input type="submit" value="送出"></form> $("form").submit(function(){···}); |
出錯事件 | |
error() | 觸發、或将函數綁定到指定元素的 error 事件. 當元素遇到錯誤(沒有正确載入)時,發生 error 事件。 |
文檔/視窗事件 | |
ready() | 文檔就緒事件(當 HTML 文檔就緒可用時) |
load() | 觸發、或将函數綁定到指定元素的 load 事件。 指定的元素已加載時,會發生 load 事件 |
unload() | 觸發、或将函數綁定到指定元素的 unload 事件 當發生以下情況下,會觸發 unload 事件: ·點選某個離開頁面的連結 ·在位址欄中鍵入了新的 URL ·使用前進或後退按鈕 ·關閉浏覽器視窗 ·重新加載頁面 |
resize() | 觸發、或将函數綁定到指定元素的 resize 事件。 當調整浏覽器視窗大小時,發生 resize 事件。 |
scroll() | 觸發、或将函數綁定到指定元素的 scroll 事件。 當使用者滾動指定的元素時,會發生 scroll 事件。 |
操作事件 | 描述 |
event事件 | |
event.preventDefault() | 阻止事件的預設動作。 |
event.isDefaultPrevented() | 傳回 event 對象上是否調用了event.preventDefault()。 |
event.pageX | 相對于文檔左邊緣的滑鼠位置。 |
event.pageY | 相對于文檔上邊緣的滑鼠位置。 |
event.result | 包含由被指定事件觸發的事件處理器傳回的最後一個值。 |
event.timeStamp | 該屬性傳回從 1970 年1月1 日到事件發生時的毫秒數。 |
event.target | 觸發該事件的 DOM 元素。 |
event.type | 描述事件的類型。 |
event.which | 訓示按了哪個鍵或按鈕。 |
其他事件 | |
bind() | 向比對元素附加一個或更多事件處理器 |
unbind() | 從比對元素移除一個被添加的事件處理器 |
delegate() | 向比對元素的目前或未來的子元素附加一個或多個事件處理器 $(selector).delegate(childSelector,event,data,function) |
undelegate() | 删除由 delegate() 方法添加的一個或多個事件處理程式。 |
one() | 向比對元素添加事件處理器。每個元素隻能觸發一次該處理器。 $("p").one("click",function(){}); |
hover() | 模拟光标懸停事件,光标移動到元素上,觸發第1個函數,光标移出元素時,觸發第2個函數 |
toggle() | 綁定兩個或多個事件處理器函數,當發生輪流的 click 事件時執行。 |
trigger() | 觸發()内的事件,比如:$("button").trigger("click");模拟點選了button按鈕,可簡寫為$("button").click(); |
triggerHandler() | 觸發被選元素的指定事件類型。但不會執行浏覽器預設動作,也不會産生事件冒泡。且隻影響第一個比對元素 |
live() | 為目前或未來的比對元素添加一個或多個事件處理器 |
die() | 移除所有通過 live() 函數添加的事件處理程式。 |
1.了解事件
JavaScript和HTML之間的互動是通過使用者和浏覽器操作頁面時引發的事件來處理的。當文檔或者他的某些元素發生變化時,浏覽器會自動生成一個事件。例如:當浏覽器裝載完一個文檔,或使用者點選某個按鈕,都會生成事件。
2.加載DOM
當浏覽器頁面加載完畢,浏覽器會通過JavaScript為DOM元素加載事件。正常JavaScript代碼中,通常使用window.onload方法。在jQuery中使用$(document).ready()方法。
二者差別:
window.onload | $(document).ready() | |
執行時機 | 必須網頁所有内容都加載完畢(包括圖檔)才能執行 | 網頁DOM結夠繪制完畢就執行,可能DOM内容(圖檔,文字等)還沒加載完畢 |
編寫個數 | 隻能有一個 window.onload = function(){}; | 可以有多個 $(document).ready(function(){···}); $(document).ready(function(){···}); |
簡寫 | 沒有簡寫 | $().ready( function(){···} ); 或$( function(){···} ); |
3.jQuery 名稱沖突
jQuery 使用 $符号作為jQuery的簡介方式。
某些其他 JavaScript 庫中的函數(比如 Prototype)同樣使用$符号。
jQuery 使用名為 noConflict()的方法來解決該問題。
var jq=jQuery.noConflict(); //幫助您使用自己的名稱(比如 jq)來代替 $ 符号。
4.單獨檔案中的函數
如果您的網站包含許多頁面,并且您希望您的 jQuery 函數易于維護,那麼請把您的 jQuery 函數放到獨立的.js檔案中。
當我們在教程中示範 jQuery 時,會将函數直接添加到 <head> 部分中。不過,把它們放到一個單獨的檔案中會更好,就像這樣(通過src屬性來引用檔案):
執行個體
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="my_jquery_functions.js"></script>
</head>
5.jQuery 是為處理 HTML事件而特别設計的,遵循以下原則,使代碼恰當且更易維護
·把所有 jQuery 代碼置于事件處理函數中
·把所有事件處理函數置于文檔就緒事件處理器中
·把 jQuery 代碼置于單獨的.js檔案中
·如果存在名稱沖突,則重命名 jQuery 庫
6.綁定事件
①格式:bind( "type" , [data ,] fn);
參數:
type為事件類型,包括上面的具體事件click、dblclick、focus、blur、mousedown、mouseup、mousemove、mouseenter、mouseleave、mouseover、mouseout、keydown、keyup、keypress、change、select、submit、error、load、unload、resize、scroll。
data為可選參數,作為event.data屬性值傳遞給事件對象的額外資料對象
fn為用于綁定的處理函數
②使用:
//綁定一個事件
$("button").bind("click",function(){
$("p").slideToggle();
});
//改變綁定對象
$("button").bind("mouseenter",function(){ //綁定事件mouseenter
$("p").show();
});
$("button").bind("mouseleave",function(){ //修改為綁定事件mouseleave
$("p").hide();
});
//綁定多個事件,格式:$(selector).bind("event1 event2" , function{···});
$("button").bind( "click mouseover" , function(){
$("p").slideToggle();
});
//綁定多個事件,格式:$(selector).bind("event" , function{···}).bind("event" , function{···})
$("button").bind( "click" , function(){
$("p").slideToggle();
}) .bind("mouseover" , function(){
$("body").css("background-color","red");
}) .bind("mouseout" , function(){
$("body").css("background-color","#FFFFFF");
});
//綁定多個事件,格式:$(selector).bind({event:function, event:function, ···})
$("button").bind({
click:function(){$("p").slideToggle();},
mouseover:function(){$("body").css("background-color","red");},
mouseout:function(){$("body").css("background-color","#FFFFFF");}
});
//添加事件命名空間
$("div").bind("click.plugin" , function(){});
$("div").bind("mouseover.plugin" , function(){});
$("button").click(function(){
$("div").unbind(".plugin"); //"plugin"命名空間被删除,在其中的click mouseover也被删除
$("div").unbind("click").unbind("mouseover"); //與上面效果相同
});
③簡寫:
$("button").bind("click",function(){});
可以簡寫為:$("button").click(function(){});
7.合成事件
jQuery有兩個合成事件,hover()和toggle()。
①hover()
模拟光标懸停事件,光标移動到元素上,觸發第1個函數,光标移出元素時,觸發第2個函數
格式:hover(enterfn , leavefn);
使用:
$("button").hover(function(){
$("p").show();
},function(){
$("p").hide();
});
②toggle() ['tɑɡl]開關,切換
模拟滑鼠連續單擊事件,第1次單擊,觸發fn1;···第n次單擊,觸發fnN;第n+1次單擊,觸發fn1;···
格式:toggle(fn1 , fn2 , fn3 ···);
使用:
$("button").toggle(function(){
$("p").show();
},function(){
$("p").hide();
});
8.事件冒泡
①什麼是冒泡
當存在嵌套元素,且這些元素被綁定了同一事件時,當内部元素被觸發時,外部元素也被觸發。這時會按照從内到外的順序響應事件,成為冒泡。
例如:
<body>
<div>
外層div元素
<span>内層span元素</span>
外層div元素
</div>
</body>
$("body").click(function(){alert("body元素被點選")});
$("div").click(function(){alert("div元素被點選")});
$("span").click(function(){alert("span元素被點選")});
當點選span元素時,div和body的事件也會觸發,click事件按照以下順序“冒泡”:
1<span>
2<div>
3<body>
②冒泡引發的問題
比如上文,我們不想當點選span時,div和body的事件被觸發。jQuery中提供了stopPropagation()方法來停止冒泡事件。
解決方法:
$("span").click(function(event){ //event事件對象
alert("span元素被點選")
event.stopPropagation(); //停止冒泡事件
});
$("div").click(function(event){ //event事件對象
alert("div元素被點選")
event.stopPropagation(); //停止冒泡事件
});
9.移除事件
格式:$(selector).unbind(event,function)
event | 可選。規定删除元素的一個或多個事件,由空格分隔多個事件值。 |
function | 可選。規定從元素的指定事件取消綁定的函數名。 |
例如:
<div id="text"></div>
<button id="btn1">bind</button>
<button id="btn2">unbind</button>
$("#btn1").bind("click",fn1 = function(){
$("#text").append("<p>我的綁定函數1</p>");
}).bind("click",fn2 = function(){
$("#text").append("<p>我的綁定函數2</p>");
}).bind("click",fn3 = function(){
$("#text").append("<p>我的綁定函數3</p>");
});
$("#btn2").click(function(){ $("#btn1").unbind() }); //删除所有事件
$("#btn2").click(function(){ $("#btn1").unbind("click") }); //删除所有click事件
$("#btn2").click(function(){ $("#btn1").unbind("click",fn1) }); //删除click且函數名fn1的事件
二.動畫
方法 | 描述 |
顯示和隐藏(上下滑動且漸變透明度) 适用于通過 jQuery 隐藏的元素,或display:none的元素(但不适用于visibility:hidden的元素) | |
hide() hide([speed,] [callback]); | 隐藏被選的元素 speed可選(毫秒,”slow”,”normal”,”fast”),不選為0 callback可選,show函數執行完之後,要執行的函數。 |
show() hide([speed,] [callback]); | 顯示被選的元素 speed可選(毫秒,”slow”,”normal”,”fast”),不選為0 callback可選,show函數執行完之後,要執行的函數。 |
toggle() toggle([speed,][callback,][switch]) | 對被選元素進行隐藏和顯示的切換 speed可選(毫秒,”slow”,”normal”,”fast”),不選為0 callback可選,show函數執行完之後,要執行的函數。 switch可選,選擇時true隻能顯示,false隻能隐藏。且選擇時speed,callback不能選 |
顯示和隐藏(上下滑動) 适用于通過 jQuery 隐藏的元素,或display:none的元素(但不适用于visibility:hidden的元素) | |
slideDown() slideDown([speed,] [callback]); | 通過調整高度來滑動顯示被選元素 speed可選(毫秒,”slow”,”normal”,”fast”),不選為normal callback可選,show函數執行完之後,要執行的函數。 |
slideUp() slideUp([speed,] [callback]); | 通過調整高度來滑動隐藏被選元素 speed可選(毫秒,”slow”,”normal”,”fast”),不選為normal callback可選,show函數執行完之後,要執行的函數。 |
slideToggle() slideToggle([speed,] [callback]); | 對被選元素進行滑動隐藏和滑動顯示的切換 speed可選(毫秒,”slow”,”normal”,”fast”),不選為normal callback可選,show函數執行完之後,要執行的函數。 |
顯示和隐藏(漸變透明度) 适用于通過 jQuery 隐藏的元素,或display:none的元素(但不适用于visibility:hidden的元素) | |
fadeIn() fadeIn([speed,] [callback]); | 逐漸改變被選元素的不透明度,淡入從隐藏到可見 speed可選(毫秒,”slow”,”normal”,”fast”),不選為normal callback可選,show函數執行完之後,要執行的函數。 |
fadeOut() fadeOut([speed,] [callback]); | 逐漸改變被選元素的不透明度,淡出從可見到隐藏 speed可選(毫秒,”slow”,”normal”,”fast”),不選為normal callback可選,show函數執行完之後,要執行的函數。 |
fadeTo() fadeTo([speed,]opacity[,callback]) | 把被選元素逐漸改變至給定的不透明度 speed可選(毫秒,”slow”,”normal”,”fast”),不選為normal opacity必選,透明度,0.00 - 1.00之間 callback可選,show函數執行完之後,要執行的函數。 |
自定義動畫 | |
animate() | 對被選元素應用“自定義”的動畫 |
stop() | 停止在被選元素上運作動畫 |
queue() | 顯示被選元素的排隊函數 |
dequeue() | 運作被選元素的下一個排隊函數 |
clearQueue() | 對被選元素移除所有排隊的函數(仍未運作的) |
delay() | 對被選元素的所有排隊函數(仍未運作)設定延遲 |
1.animate()
該方法通過CSS樣式将元素從一個狀态改變為另一個狀态。CSS屬性值是逐漸改變的,這樣就可以建立動畫效果。
文法:
$(selector).animate({params},speed,callback);
·必需的 params 參數定義形成動畫的CSS屬性。
·可選的 speed 參數規定效果的時長。(毫秒"slow" "normal" "fast")不選normal
·可選的 callback 參數是動畫完成後所執行的函數名稱。
①可以用 animate() 方法來操作所有 CSS 屬性嗎?
是的,幾乎可以!如:
backgroundPosition,outlineWidth,letterSpacing,wordSpacing,lineHeight,textIndent,
borderWidth,borderBottomWidth,borderLeftWidth,borderRightWidth,borderTopWidth,borderSpacing,
margin,marginBottom,marginLeft,marginRight,marginTop,
padding,paddingBottom,paddingLeft,paddingRight,paddingTop,
height,width,maxHeight,maxWidth,minHeight,minWidth,font,fontSize,
bottom,left,right,top,
注1:當使用animate()時,必須使用Camel标記法書寫所有的屬性名,比如,必須使用paddingLeft而不是padding-left,使用marginRight而不是margin-right,等等。
注2:隻有數字值可建立動畫(比如"margin:30px")。字元串值無法建立動畫(比如"background-color:red")。
注3:也可以定義相對值(該值相對于元素的目前值)。需要在值的前面加上+=或-=。
當使用相對值時,可以多次點選,值多次增加。
注4:使用bottom,left,right,top屬性時,要把元素position設定為relative或absolute。
例如:
$(“button”).click(function(){
$("div").animate({ left:'250px'}, “slow”);
$("div").animate({ marginLeft:'+=50px'}, “slow”);
$("div").animate({ height:'+=150px' }, “slow”);
});
②同時執行多個動畫,以逗号隔開
$(“button”).click(function(){
$("div").animate({ left:'250px', marginLeft:'+=50px', height:'+=150px'}, “slow”);
});
③按順序執行多個動畫
$(“button”).click(function(){
$("div").animate({ left:'250px'}, “slow”);
$("div").animate({ width:'+=50px'}, “slow”);
$("div").animate({ height:'+=50px' }, “slow”);
});
或
$(“button”).click(function(){
$("div").animate({ left:'250px'}, “slow”)
.animate({ width:'+=50px'}, “slow”)
.animate({ height:'+=50px' }, “slow”);
});
④動畫回調函數,在動畫完成之後實作這個函數。
$(“button”).click(function(){
$("div").animate({ left:'250px'}, “slow”)
.animate({ width:'+=50px'}, “slow”)
.animate({ height:'+=50px' }, “slow”);
$("div").css( {‘left’:'0px', ‘width’:’10px’,’height’:’100px’});
});
//不能達到效果,會立刻執行.css操作,之後再動畫。
$(“button”).click(function(){
$("div").animate({ left:'250px'}, “slow”)
.animate({ width:'+=50px'}, “slow”)
.animate({ height:'+=50px' }, “slow”,function(){
$("div").css( {‘left’:'0px', ‘width’:’10px’,’height’:’100px’});
});
});
//能達到效果,動畫完成之後執行.css操作。
2.stop()
當動畫沒運作完畢,再次出發動畫時,會将第一次的動畫運作完畢,在運作第二次的動畫。但我們有時需要停止未運作完畢的動畫。需要使用stop()。
格式:stop(stopAll,goToEnd)
stopAll | 可選。規定是否停止被選元素的所有加入隊列的動畫。 |
goToEnd | 可選。規定是否允許完成目前的動畫。 該參數隻能在設定了 stopAll 參數時使用。 |
stop()或stop(false)或stop(false,fasle) | 立即停止目前正在進行的動畫,并運作之後的動畫 |
stop(true)或stop(true,false) | 立即停止被選元素的所有加入隊列的動畫 |
stop(true,true) | 立即停止被選元素的所有加入隊列的動畫,并直接到達目前動畫的末狀态 |
stop(false,true) | 到達目前動畫的末狀态,并運作之後的動畫 |
//例如:
$("#start").click(function(){
$("#box").animate({height:300,width:300},2000);
.animate({height:50,width:50},2000);
});
$("#stop").click(function(){
$("#box").stop();
});
//或:
$("#start").click(function(){
$("#box").stop(true)
.animate({height:300,width:300},2000)
.animate({height:50,width:50},2000);
});
3.判斷元素是否處于動畫狀态
隻有元素不是動畫狀态,點選運作動畫才有效,否者,點選無效。
if(!($(元素).is(":animate")){
//如果目前沒有進行動畫,則添加新動畫
}