javascript作為腳本語言, 可以為頁面上的元素綁定事件,用於在指定事件發生時能自動調用相應的事件處理程序處理事件。那怎麼給元素添加事件?以下這篇文章跟大家介紹一下JS綁定事件三種方式,希望對大家有幫助!
為了讓瀏覽器在事件發生時能自動呼叫對應的事件處理程序處理事件,需要對事件來源綁定事件處理程序(綁定事件處理程序也叫註冊事件處理程序)。
綁定事件處理程序有以下3 種方式:
#在HTML 標籤中,使用事件屬性(例onclick)綁定事件處理程序。此方式透過設定標籤的事件屬性值為事件處理程序。這種方法現在不建議使用, html 和 js 耦合, 不利於維護。
在 js 中,使用事件來源的事件屬性(例onclick)綁定事件處理函數。此方式透過設定事件來源物件的事件屬性值為事件處理函數。
在 js 中,使用 addEventListener()
方法綁定事件和事件處理函數(IE9 之前的版本則使用 attach Event() 方法)。
1、使用HTML標籤的事件屬性綁定處理程序
需要注意的是,使用HTML 標籤的事件屬性綁定事件處理程序的方式時,事件屬性中的腳本代碼不能包含函數聲明,但可以是函數呼叫或一系列使用分號分隔的腳本代碼。
【範例 1】使用 HTML 標籤的事件屬性來綁定事件處理程序。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>使用HTML标签的事件属性绑定事件处理程序</title> </head> <body> <input type="button" onclick="var name='PHP中文网';alert(name);" value="事件绑定测试"/> </body> </html>
上述程式碼的 button 為 click 事件的目標對象,其透過標籤的事件屬性 onclick 綁定了兩個腳本程式碼進行事件的處理。上述程式碼在 Chrome 瀏覽器的運作後,當使用者點擊按鈕時,將彈出警告對話框,結果如下圖所示。
當事件處理程序涉及的程式碼在2 條以上時,如果還像範例1 那樣綁定事件處理程序,會使程式的可讀性變得很差。對此,可以將事件處理程序定義為一個函數,然後在事件屬性中呼叫該函數。
【範例 2】HTML 標籤的事件屬性為函數呼叫。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>HTML标签的事件属性为函数调用</title> <script> function printName(){ var name = "PHP中文网"; alert(name); } </script> </head> <body> <input type="button" onClick="printName()" value="事件绑定测试"/> </body> </html>
上述程式碼的執行結果和範例 1 完全相同。從上述兩個範例可以看到,標籤事件屬性將 JS 腳本程式碼和 HTML 標籤混合在一起,違反了 Web 標準的 JS 和 HTML 應分開的原則。所以,使用 HTML 標籤的事件屬性綁定事件處理程序不好,實際應用時應盡量避免使用。
2、使用事件來源的事件屬性綁定處理程序
#使HTML 和JS 分離的其中一種方式是透過使用事件來源的事件屬性綁定事件處理函數,綁定格式如下:
obj.on事件名 = 事件处理函数
格式中的obj 為事件來源物件。綁定的事件程式通常為一個匿名函數的定義語句,或是一個函數名稱。
事件來源的事件屬性綁定處理程序範例:
oBtn.onclick = function(){//oBtn为事件源对象,它的单击事件绑定了一个匿名函数定义 alert('hi') };
【範例 3】使用事件來源的事件屬性綁定事件處理函數。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>使用事件源的事件属性绑定事件处理函数</title> <script> window.onload = function(){//窗口加载事件绑定了一个匿名函数 //定义一个名为fn的函数 function fn(){ alert('hello'); } //获取事件源对象 var oBtn1 = document.getElementById("btn1"); var oBtn2 = document.getElementById("btn2"); //绑定一个匿名函数 oBtn1.onclick = function(){ alert("hi"); } //绑定一个函数名 oBtn2.onclick = fn; }; </script> </head> <body> <input type="button" id="btn1" value="绑定一个匿名函数"> <input type="button" id="btn2" value="绑定一个函数名"> </body> </html>
上述 JS 程式碼中處理了 3 個事件:文件視窗載入事件 load、兩個按鈕的點擊事件 click。這三個事件的處理都是使用事件來源的事件屬性綁定事件處理函數來實現的,其中load 事件和第一個按鈕的click事件綁定的是匿名函數,而第二個按鈕的click事件綁定定的是一個函數名。
需要特別注意的是,不能在oBtn2 綁定的函數名稱後面加“()”,否則綁定的函數變為函數調用,這樣就會在JS 引擎執行到該行程式碼時自動呼叫執行,而在事件觸發時卻不會執行了。
在文件所有元素載入完成後會處理視窗載入事件函數,而按一下每個按鈕時將會觸發點擊事件。點擊第一個和第二個按鈕後,將分別跳出顯示「hi」和「hello」兩個警告對話框。
3、使用addEventListener()綁定處理程序
使用事件來源物件的事件屬性綁定事件處理程序方式雖然簡單,但其存在一個不足之處:一個事件只能綁定一個處理程序,後面綁定的事件處理函數會覆蓋前面綁定的事件處理函數。實際應用中,一個事件來源的一個事件可能會用到多個函數來處理。
当一个事件源需要使用多个函数来处理时,可以通过事件源调用 addEventListener()(针对标准浏览器)来绑定事件处理函数以实现此需求。一个事件源通过方法绑定多个事件函数的实现方式是:对事件源对象调用多次 addEventListener(),其中每次的调用只绑定一个事件处理函数。
addEventListener() 是标准事件模型中的一个方法,对所有标准浏览器都有效。使用 addEvent Liste ner() 绑定事件处理程序的格式如下:
事件源.addEventListener(事件名称,事件处理函数名,是否捕获);
参数“事件名称”是一个不带“on”的事件名;参数“是否捕获”是一个布尔值,默认值为 false,取 false 时实现事件冒泡,取 true 时实现事件捕获。
通过多次调用 addEventListener() 可以为一个事件源对象的同一个事件类型绑定多个事件处理函数。当对象发生事件时,所有该事件绑定的事件处理函数就会按照绑定的顺序依次调用执行。另外,需要注意的是,addEventListener() 绑定的事件处理函数中的 this 指向事件源。
addEventListener() 绑定处理程序示例:
document.addEventListener('click',fn1,false);//click事件绑定fn1函数实现事件冒泡 document.addEventListener('click',fn2,true);//click事件绑定fn2函数实现事件捕获
【例 4】使用 addEventListener() 绑定事件函数。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>使用addEventListener()/attachEvent()绑定事件函数</title> <script> function fn1(){ alert("fn1()"); } function fn2(){ alert("fn2()"); } function bindTest(){ document.addEventListener('click',fn1,false);//首先绑定fn1函数 document.addEventListener('click',fn2,false); } bindTest();//调用函数 </script> </head> <body> </body> </html>
上述代码在浏览器中运行后,当单击文档窗口时,会依次弹出显示“fn1()”和“fn2()”的警告对话框。
【推荐学习:javascript高级教程】
以上是怎麼給元素添加事件? JS綁定事件三種方式解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!