事件綁定方式:將對html元素或窗口的操作綁定給響應函數的方式。共四種方式
- Html級別綁定
- 符合DOM0 級的事件綁定方式
- 符合DOM2
Html級別綁定
無法設置事件流
<script> function a(){ //好的習慣,把整個網頁上所有的事件綁定程序,聚集在一個函數中 alert("nihao"); } </script> <input type="button" value="html級別綁定方式" onclick="a()" />
符合DOM0 級的事件綁定方式
將響應程序直接賦值給dom元素的事件屬性。這是DOM最早版本的事件綁定方式,被所有瀏覽器兼容
無法設置事件流
1、是用普通函數作為響應程序
document.getElementById("btn1").onclick = sayHellow; 不要帶(), 帶着()表示直接調用·
<h2>DOM0級別的綁定方式</h2> <input type="button" id="btn1" value="DOM0級別的綁定方式" /> <script> window.onload=function(){ document.getElementById("btn1").onclick = sayHellow; //注意不要帶() } function sayHellow(){ alert("hi==") } </script>
2、是用匿名函數作為響應程序
document.getElementById("btn2").onclick = function(){ alert("hi:"+this.id) } 或者 document.getElementById("btn2").onclick = _ => console.log("hi123ID:"+this); //參考我的博客:JavaScript箭頭函數(Lambda表達式)
彈出 : btn1
特點:
- 在響應函數中this代表目標元素(當前的button對象)
- 不符合DOM2標准,無法設定事件流
- 無法直接傳遞參數,但可以通過其他方式傳遞
- 對同一個事件只能綁定一個響應函數,最后綁定的響應函數會執行
- 通過 obj.onxx = null 可以解除綁定。
總結:可以使用匿名函數或普通函數作為響應函數
傳遞參數的方式:
傳遞參數的方法1 ---將參數 作為屬性賦 給事件源
<input type="button" id="btn3" workerNum=987 value="屬性傳遞參數" />
document.getElementById("btn3").onclick = function(){ alert("hi:"+this.getAttribute("workerNum")); }
傳遞參數方法2
使用綁定函數,專門設置一個函數,實現兩重調用(綁定)
<input type="button" id="btn4" workerNum="==屬性參數==" value="動態綁定事件並傳遞參數" /> //綁定函數 bindEvent(document.getElementById("btn4"),"onclick",onclickWorker,"btn=123"); //響應函數 function onclickWorker(wNum){ alert("工號為:"+ wNum); } //執行事件綁定,將參數傳給事件源 function bindEvent(dom, eventType , fun ,args){ dom[eventType] = handleEvent; function handleEvent(){ //閉包 fun.call(this,args); //給響應函數的 this 指針賦值為 dom } }
其實綜合起來就是一句話:document.getElementById("btn4")["onclick"]= _ => onclickWorker("99999”);
傳遞參數方法3
JS中的call、apply、bind方法詳解
符合DOM2級別的事件綁定方式:(不兼容)
綁定后可以設定事件流的順序,順序為綁定順序。
格式:addEventListener("eventType",callback,use-capture);
- eventTye:事件名稱。 click 省略on
- callback:事件處理方法
- use-capture:false-->冒泡階段/ture-->捕獲階段。
ps:大多數情況下,都是將事件處理程序添加到事件流的冒泡階段,這樣可以最大限度地兼容各種瀏覽器
//瀏覽器可以自動傳入一個對象 event對象 /*document.getElementById("outerDiv").addEventListener("click" , function(){ //執行語句 })*/ //匿名函數方式 document.getElementById("outerDiv").addEventListener("click" ,handleEvent ); //綁定函數方式
特點 :
可以使用匿名函數或普通函數
響應函數中this代表目標函數
可以設定事件流
無法傳遞參數,通過其他方式傳遞
對同一個事件可以綁定多個形影函數,響應函數執行順序依據綁定順序
建議使用jquery 的on方法 解決綁定函數兼容方式
1、可以傳遞參數
2、實現了事件委托
3、on方法可以實現事件流控制
4、在一般的瀏覽器都兼容
出處:https://my.oschina.net/u/2991733/blog/800883
=======================================================================================
JavaScript綁定事件的方法[3種]
要想讓 JavaScript 對用戶的操作作出響應,首先要對 DOM 元素綁定"事件處理函數"。所謂事件處理函數,就是處理用戶操作的函數,不同的操作對應不同的名稱。
在JavaScript中,有三種常用的綁定事件的方法:
- 在DOM元素中直接綁定;
- 在JavaScript代碼中綁定;
- 綁定事件監聽函數。
一. 在DOM元素中直接綁定
一. 在DOM元素中直接綁定這里的DOM元素,可以理解為HTML標簽。JavaScript支持在標簽中直接綁定事件,語法為:
onXXX="JavaScript Code"
其中:
- onXXX 為事件名稱。例如,鼠標單擊事件 onclick ,鼠標雙擊事件 ondouble,鼠標移入事件 onmouseover,鼠標移出事件 onmouseout 等。
- JavaScript Code 為處理事件的JavaScript代碼,一般是函數。
例如,單擊一個按鈕,彈出警告框的代碼有如下兩種寫法。
1. 原生函數
實例:
<!DOCTYPE html>
<html lang=
"en"
>
<head>
<meta charset=
"UTF-8"
>
<title>Title</title>
</head>
<body>
<input type=
"button"
value=
"點我"
onclick=
"myClick(this)"
/>
<script>
function
myClick(ths){
ths.style.backgroundColor=
"red"
;
}
</script>
</body>
</html>
|
效果:
二. 在JavaScript代碼中綁定
在JavaScript代碼中(即<script>標簽內)綁定事件可以使JavaScript代碼與HTML標簽分離,文檔結構清晰,便於管理和開發。
在JavaScript代碼中綁定事件的語法為:
elementObject.onXXX=function(){ // 事件處理代碼 }
其中:
- elementObject 為DOM對象,即DOM元素。
- onXXX 為事件名稱。
例如,為 id="demo" 的按鈕綁定一個事件,顯示它的 type 屬性:
1
2
3
4
5
6
|
<input id=
"demo"
type=
"button"
value=
"點擊我,顯示 type 屬性"
/>
<script type=
"text/javascript"
>
document.getElementById(
"demo"
).onclick=
function
(){
alert(
this
.getAttribute(
"type"
));
// this 指當前發生事件的HTML元素,這里是<input>標簽
}
</script>
|
this在第二種綁定方式中的應用:
1
2
3
4
5
6
7
|
<input id=
'i1'
type=
'button'
>
document.getElementById(
'i1'
).onclick=
function
(){
this
// 這里的this代指當前點擊的標簽
}
|
三. 綁定事件監聽函數
綁定事件的另一種方法是用 addEventListener() 或 attachEvent() 來綁定事件監聽函數。
addEventListener()函數語法:
elementObject.addEventListener(eventName,handle,useCapture);
addEventListener()是標准的綁定事件監聽函數的方法,是W3C所支持的,Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持該函數。
參數 | 說明 |
---|---|
elementObject | DOM對象(即DOM元素)。 |
eventName | 事件名稱。注意,這里的事件名稱沒有“ on ”,如鼠標單擊事件 click ,鼠標雙擊事件 doubleclick ,鼠標移入事件 mouseover,鼠標移出事件 mouseout 等。 |
handle | 事件句柄函數,即用來處理事件的函數。 |
useCapture | Boolean類型,是否使用捕獲,一般用false 。true:捕獲模型;false:冒泡模型 |
useCapture: false, true 的實例效果探索
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<!DOCTYPE html>
<html lang=
"en"
>
<head>
<meta charset=
"UTF-8"
>
<title>Title</title>
</head>
<style>
#main{
background-color:red;
width:300px;
height:400px;
}
#content{
background-color:pink;
width:150px;
height:200px;
}
</style>
<body>
<div id=
"main"
>
<div id=
"content"
></div>
</div>
<script>
var
mymain=document.getElementById(
"main"
);
var
mycontent=document.getElementById(
"content"
);
mymain.addEventListener(
"click"
,
function
(){console.log(
"main"
)},
false
);
mycontent.addEventListener(
"click"
,
function
(){console.log(
"content"
)},
false
);
</script>
</body>
</html>
|
false 效果,從內往外出來,所以是content先出來:
true效果,從外往內出來,所以是main先出來:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<!DOCTYPE html>
<html lang=
"en"
>
<head>
<meta charset=
"UTF-8"
>
<title>Title</title>
</head>
<style>
#main{
background-color:red;
width:300px;
height:400px;
}
#content{
background-color:pink;
width:150px;
height:200px;
}
</style>
<body>
<div id=
"main"
>
<div id=
"content"
></div>
</div>
<script>
var
mymain=document.getElementById(
"main"
);
var
mycontent=document.getElementById(
"content"
);
mymain.addEventListener(
"click"
,
function
(){console.log(
"main"
)},
true
);
mycontent.addEventListener(
"click"
,
function
(){console.log(
"content"
)},
true
);
</script>
</body>
</html>
|
效果圖:
出處:https://www.cnblogs.com/momo8238/p/7449437.html
=======================================================================================
JavaScript 事件屬性綁定帶參數的函數
function Handler() {}; Handler.prototype = { /* * 把eventType類型的事件綁定到element元素,並使用handler事件句柄進行處理 * 兼容 IE 及 Firefox 等瀏覽器 * * @param element 在其上注冊事件的對象(Object) * @param eventType 注冊的事件類型(String),不加“on” * @param handler 事件句柄(Function) */ registerEvent: function(element, eventType, handler) { if (element.attachEvent) { //2級DOM的事件處理 element.attachEvent('on' + eventType, handler); } else if (element.addEventListener) { element.addEventListener(eventType, handler, false); } else { //0級DOM的事件處理 element['on' + eventType] = handler; } }, /* * 獲得帶參數的事件句柄的引用 * * @param obj 需要綁定事件處理函數的所有者,null 表示 window 對象 * @param func 需要綁定的事件處理函數名 * @param ... 第三個參數開始為綁定事件處理函數的參數,由 0 到多個構成 */ bind: function(obj, handler) { obj = obj || window; var args = []; for (var i = 2; i < arguments.length; i++) { args.push(arguments[i]); } return function() { handler.apply(obj, args) }; } }可能是使用方式為: function show(txtObj) { alert(txtObj.value); txtObj.focus(); txtObj.select(); } window.onload = function() { var handler = new Handler(); handler.registerEvent($("txt"), "change", handler.bind(null, show, $("txt"))); //采用2級事件模型的方式 //$("txt").onchange = handler.bind(null,show,$("txt"));//JavaScript事件屬性的方式 }
- JavaScript實現父子dom同時綁定兩個點擊事件,一個用捕獲,一個用冒泡時執行順序的方法
- JavaScript call apply使用 JavaScript對象的方法綁定到DOM事件后this指向問題
- js中DOM事件綁定分析
- JS 事件綁定、事件監聽、事件委托詳細介紹
- JavaScript給按鈕綁定點擊事件(onclick)的方法
- js創建一個input數組並綁定click事件的方法
- javascript事件委托的方式綁定詳解
- Javascript 事件流和事件綁定
- JS動態添加元素及綁定事件造成程序重復執行解決
- javaScript 事件綁定、事件冒泡、事件捕獲和事件執行順序整理總結
- js事件on動態綁定數據,綁定多個事件的方法
- JavaScript Dom 綁定事件操作實例詳解
====================================================================================
功能優化
根據上面的提示,我自己進行了優化,用在自己的項目上。
方便使用,接口方法統一,優化后的代碼如下:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="text" id='txt' placeholder="請輸入關鍵詞" /> <input type="button" id="btn1" value="綁定事件函數()" /> <input type="button" id="btn2" value="綁定事件函數(參數)" /> <script> function Handler() {}; Handler.prototype = { /* * 把eventType類型的事件綁定到element元素,並使用handler事件句柄進行處理 * 兼容 IE 及 Firefox 等瀏覽器 * * @param element 在其上注冊事件的對象(Object) * @param eventType 注冊的事件類型(String) * @param fun 事件句柄(Function) */ registerEvent: function(element, eventType, fun) { eventType = (eventType.toLowerCase().startsWith("on")?"":"on")+eventType; var args = [element,fun]; for (var i = 3; i < arguments.length; i++) { args.push(arguments[i]); } handler = this.bindFun.apply(null,args); if (element.attachEvent) { //2級DOM的事件處理 element.attachEvent(eventType, handler); } else if (element.addEventListener) { element.addEventListener(eventType.substring(2), handler, false); } else { //0級DOM的事件處理 element[eventType] = handler; } }, /* * 獲得帶參數的事件句柄的引用 * * @param obj 需要綁定事件處理函數的所有者,null 表示 window 對象 * @param func 需要綁定的事件處理函數名 * @param ... 第三個參數開始為綁定事件處理函數的參數,由 0 到多個構成 */ bindFun: function(obj, handler) { //console.log(this); obj = obj || window; var args = []; for (var i = 2; i < arguments.length; i++) { args.push(arguments[i]); } return function() { handler.apply(obj, args) }; } } //使用方式為: function show(txtObj) { var str="normal"; str=txtObj?.id; for (var i = 1; i < arguments.length; i++) { str+="\r\n"+arguments[i]; } alert(str); //txtObj.focus(); //txtObj.select(); } window.onload = function() { var handler = new Handler(); var dom=document.getElementById("txt"); handler.registerEvent(dom, "onchange", show, dom,0,1,2,3); //采用2級事件模型的方式 //dom.onchange = handler.bindFun(null,show,dom,'1111',"aa"); //JavaScript事件屬性的方式 dom=document.getElementById("btn1"); handler.registerEvent(dom, "click", show, dom); dom=document.getElementById("btn2"); handler.registerEvent(dom, "click", show,dom,1,2,3,4,5); } </script> </body> </html>