1. 程式人生 > >jQuery——入門(四)JQuery 事件

jQuery——入門(四)JQuery 事件

 
 

                                                   jQuery——入門(四)JQuery 事件

一、事件初探

載入文件完成觸發:

window.onload = function(){}   //js

$(window).load(function(){})   //jquery

$(document).ready(function(){})

事件可以多次執行

程式碼可以簡寫:$(function(){})

二、JQuery中常見的事件

在網頁瀏覽過程中,會觸發各種各樣的事件,這些事件的處理能很大程度的提升使用者使用的體驗,對於常見事件的瞭解是JS程式開發必不可少的一部分。

方法 描述
bind() 向匹配元素附加一個或更多事件處理器
blur() 觸發、或將函式繫結到指定元素的 blur 事件
change()
觸發、或將函式繫結到指定元素的 change 事件
click() 觸發、或將函式繫結到指定元素的 click 事件
dblclick() 觸發、或將函式繫結到指定元素的 double click 事件
delegate() 向匹配元素的當前或未來的子元素附加一個或多個事件處理器
die() 移除所有通過 live() 函式新增的事件處理程式。
error() 觸發、或將函式繫結到指定元素的 error 事件
event.isDefaultPrevented() 返回 event 物件上是否呼叫了 event.preventDefault()。
event.pageX 相對於文件左邊緣的滑鼠位置。
event.pageY 相對於文件上邊緣的滑鼠位置。
event.preventDefault() 阻止事件的預設動作。
event.result 包含由被指定事件觸發的事件處理器返回的最後一個值。
event.target 觸發該事件的 DOM 元素。
event.timeStamp 該屬性返回從 1970 年 1 月 1 日到事件發生時的毫秒數。
event.type 描述事件的型別。
event.which 指示按了哪個鍵或按鈕。
focus() 觸發、或將函式繫結到指定元素的 focus 事件
keydown() 觸發、或將函式繫結到指定元素的 key down 事件
keypress() 觸發、或將函式繫結到指定元素的 key press 事件
keyup() 觸發、或將函式繫結到指定元素的 key up 事件
live() 為當前或未來的匹配元素新增一個或多個事件處理器
load() 觸發、或將函式繫結到指定元素的 load 事件
mousedown() 觸發、或將函式繫結到指定元素的 mouse down 事件
mouseenter() 觸發、或將函式繫結到指定元素的 mouse enter 事件
mouseleave() 觸發、或將函式繫結到指定元素的 mouse leave 事件
mousemove() 觸發、或將函式繫結到指定元素的 mouse move 事件
mouseout() 觸發、或將函式繫結到指定元素的 mouse out 事件
mouseover() 觸發、或將函式繫結到指定元素的 mouse over 事件
mouseup() 觸發、或將函式繫結到指定元素的 mouse up 事件
one() 向匹配元素新增事件處理器。每個元素只能觸發一次該處理器。
ready() 文件就緒事件(當 HTML 文件就緒可用時)
resize() 觸發、或將函式繫結到指定元素的 resize 事件
scroll() 觸發、或將函式繫結到指定元素的 scroll 事件
select() 觸發、或將函式繫結到指定元素的 select 事件
submit() 觸發、或將函式繫結到指定元素的 submit 事件
toggle() 繫結兩個或多個事件處理器函式,當發生輪流的 click 事件時執行。
trigger() 所有匹配元素的指定事件
triggerHandler() 第一個被匹配元素的指定事件
unbind() 從匹配元素移除一個被新增的事件處理器
undelegate() 從匹配元素移除一個被新增的事件處理器,現在或將來
unload() 觸發、或將函式繫結到指定元素的 unload 事件
三、JQuery繫結事件方式

1、事件快捷鍵繫結方式

語法:$(selector).eventType(fn);

案例:$(".box").click(function(){... ...});給box選中的元素增加一個滑鼠單擊事件

問題:不適用於未來元素/新增元素;比較消耗系統資源

程式碼案例:

<body>
	<button>按鈕</button>
	<p>我是一個p標籤內容</p>
	<div class="box"></div>
	<script type="text/javascript">
		$(function(){
			$("button").click(function(){
				$("p").toggle(500);
			});
			var newEle = $("<button></button>");
			newEle.text("新增按鈕");
			newEle.prependTo($(".box"));
		});
	</script>
</body>

2、JQuery在快捷事件處理方式之外提供了四種繫結事件的方式

(1)、bind(遺留專案中比較多出現的繫結方式 | 不支援未來元素)

(2)、live(遺忘 | 支援未來元素,但是新版本已經刪除)

(3)、delegate(處理遺留專案時選擇的相容模式繫結專案 | 支援未來元素)

(4)、on官方及專案組規範 | 不支援 / 支援未來元素)

同時對應了四種解除事件監聽的四種方式:

unbinddie 、undelegate 、off

3、繫結事件

語法:bind(type、[data]、function)

type為事件型別,包括 blur、focus、load、resize、scroll、unload、click、dblclick、mousedown、mouseup、mousemove、mouseout、mouseenter、mouseleave、change、select、submit、keyup等。

data為方法傳遞的引數,可以忽略

function是用來繫結的處理函式

例如:為id為box的div元素繫結單擊事件

$("#box").bind("click",function(){alert(“box被點選”);})

(1)、繫結單個事件

bind(“事件名”,function(){})

注:當頁面元素載入時,bind查詢到對應的DOM節點,一個一個繫結對應的事件

當頁面元素是後續動態新增進去的,bind繫結事件在新元素上是沒有效果的

不適用於未來元素 / 新增元素

on(“事件名”,function(){})

注:官方推薦的事件繫結的方式,也是專案中用的最多的方式

不適用於未來元素 / 新增元素

(2)、繫結多個事件

一個jquery物件可以繫結多個事件,對應一個函式 jquery物件.bind(“事件名1 事件名2 ...”,function(){})

還可以繫結多個事件各個事件各對應一個方法

jquery物件.bind({“事件名1”:function(){},"事件名2":function(){},...})

on({“事件名1”:function(){},"事件名2":function(){},...}) 適用於未來元素 / 新增元素

程式碼案例:

<body>
	<button>hello</button>
	<script>
		$(function(){
//			$("button").click(function(){
//				alert("hello world");
//			});
//			$("button").click(function(){
//			alert("hello world2");
//				});
			$("button").bind("click mouseover",function(){
				alert("hello world");
			});

			$("button").bind({
				"mouseover":function(){alert("hello world");},
				"mouseout":function(){alert("你好世界");}
			});
		});
	</script>
</body>

(3)、一次性繫結事件 —— on 官方推薦

on(“事件名”,function(){})

程式碼案例:

<body>
	<button>點選</button>
	<div></div>
</body>
	<script type="text/javascript">
		$(function(){
			var i=0;
//			$("button").on("click",function(){
//				i++;
//				$("div").html(i);
//			});
//jquery物件.one("事件名",function(){})   一次性事件
			$("button").one("click",function(){
				i++;
				$("div").html(i);
			});
		});
	</script>

(4)、live && die

live方法:可以對動態新增的元素新增繫結事件,解決了bind()不能給動態新增元素繫結事件的問題

注意:新版本中已經刪除了live()繫結事件,通常使用delegate(...)、on(...)進行替代

適用於未來元素 / 新增元素 ,測試時請使用jquery1.9以下版本

例如:$("button").live("click",function(){

$("p").toggle(500);

})

die方法:解除指定元素上的所有事件

注意:die方法不再建議使用,舊版本替換可以使用$(selector).off()函式進行解除

(5)、解除繫結 / 事件移除 —— unbind、off

unbind("事件名") 可以解除多個事件

off("事件名") 官方推薦的解除事件繫結的方式,專案中用的最多的解除方式

注:解除繫結事件 jquery物件.unbind(引數) 引數是可選的,如果裡面沒有引數的時候 解除jquery物件上所有的事件繫結
如果有引數, 代表可以指定去解除單個或多個事件

程式碼案例:

<body>
	<button>按鈕</button>
	<script type="text/javascript">
		$(function(){
			$("button").bind("click mouseover mouseout",function(){
				alert("hello world");
			});
//			$("button").unbind("click mouseover");  //只有在滑鼠離開按鈕時出現hello world,滑鼠點選和滑鼠放上去均無效
//			$("button").unbind();    //解除所有事件
			$("button").off("click mouseover"); //和$("button").unbind("click mouseover")實現效果一樣
		});
	</script>
</body>

4、事件合成

JQuery有兩個合成事件:hover()方法和toggle()方法

hover(enter,leave)

jquery物件.hover(函式1,函式2) 滑鼠放上去時 呼叫函式1 滑鼠離開時 呼叫函式2

用於模擬游標懸停事件.當游標移動到元素上時,會觸發指定的第一個函式,當游標移出這個元素時,觸發指定的第二個函式.

toggle(fn1,fn2,…fnN)

模擬游標連續點選事件.第一次單擊元素觸發fn1,第二次點選時觸發fn2,依次類推.隨後的單擊都會重複對這幾個函式的輪番呼叫.
jquery9版本已經刪除了此種應用

程式碼案例:

<body>
	<div>hello world</div>
</body>
	<script type="text/javascript">
		$(function(){
			$("div").hover(function(){
				$(this).css("background-color","red");  //滑鼠放上去顯示紅色背景
			},function(){
				$(this).css("background-color",""); //滑鼠離開時沒有背景
			});
			$("div").toggle(function(){  //點選三次hello world時依次顯示紅色、藍色、綠色
				$(this).css("background-color","red");
			},
			function(){
				$(this).css("background-color","blue");
			},
			function(){
				$(this).css("background-color","green");
			});
		})
	</script>

5、 事件冒泡 && 預設行為

(1)、阻止事件冒泡的方法:

在繫結的事件中加入event引數,並在函式中增加event.stopPropagation()呼叫就可以阻止事件冒泡,也可以使用return false阻止冒泡

案例程式碼:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#parent{width:400px;height:400px;background:red}
			#child{width:200px;height:200px;background:yellow}
		</style>
		<script src="js/jquery-1.8.3.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="parent">
			<div id="child"></div>
		</div>
	</body>
	<script type="text/javascript">
		$(function(){
			$("#parent").click(function(e){
				alert("hello,parent被點選");
			});
			$("#child").click(function(ev){
				alert("hi,child被點選");
				ev.stopPropagation();  //阻止冒泡 ,點選child時,只會顯示“hi,child被點選”
			})
		});
	</script>
</html>

(2)、阻止事件預設行為

event中還有一個方法:event.preventDefault();作用是阻止預設行為,如表單提交!

程式碼案例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>阻止預設行為</title>
		<script src="js/jquery-1.8.3.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<a href="#">我是超連結</a>
		<div>我是超連結</div>
	</body>
	<script type="text/javascript">
		$(function(){ //第一種
//			$("a").click(function(e){
//				e.preventDefault();
//			});
			$("a").on("click",function(e){  //第二種
				e.preventDefault();
			});
		});
	</script>
</html>
6、 模擬操作 —— trigger()

(1)、模擬操作可以使用trigger()方法來完成

例如:$("#box").click(function(){

$("#btn").trigger("click"); //模擬操作觸發的#btn的click事件

})

程式碼案例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="js/jquery-1.8.3.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<button>點選我,有驚喜</button>
		<input type="text" />
		<div>hello,需要點選我模擬</div>
		<script type="text/javascript">
			$(function(){
				$("button").click(function(){
					alert("果然有驚喜"); //2.點選button,再次彈出“果然有驚喜”
				});
				$("button").trigger("click"); //1.開始彈出“果然有驚喜”
				$("div").click(function(){
					$("button").trigger("click"); //3.點選div時,彈出“果然有驚喜”
				})
				$("input").focus(function(){  //4.input邊框變為紅色
					$(this).css("border","1px solid red");
				});
				$("input").trigger("focus");
				$("input").triggerHandler("focus");//triggerHandler()不會觸發預設行為,而只執行事件程式碼.
			});
		</script>
	</body>
</html>

(2)、模擬操作 —— 傳遞資料

trigger(type,[data])方法有兩個引數,第一個引數是要觸發的事件型別,第二個引數是傳遞給事件處理函式的附加資料,以陣列的形式傳遞

#(“#btn”).bind("click",function(event,mes,mes2){

alert(mes+","+mes2);

})

$("#btn").trigger("click",["hello","world!"]);

注意:在事件繫結時的event引數是不可以省略的,但在呼叫時可以不指定