js添加事件處理程序,js中常用事件

本文目錄一覽:

如何在JavaScript中使用自定義事件

在javascript中實現自定義事件的原理是創建一個管理事件的對象.如下代碼是事件的定義:

function EventTarget(){

this.handlers = {};//存儲事件處理程序,由n個鍵值對組成,鍵表示事件名,值是一個由事件處理程序組成的數組

}

EventTarget.prototype = {

constructor:EventTarget,

//添加事件

addHandler:function(type,handler){

if(typeof this.handlers[type] == “undefined”){

this.handlers[type] = [];

}

this.handlers[type].push(handler);

},

//觸發事件

fire:function(event){

if(!event.target){

event.target = this;

}

if(this.handlers[event.type] instanceof Array){

var handlers = this.handlers[event.type];

for(var i=0,len=handlers.length;i len;i++){

//將event傳遞給事件處理程序,event.target代表對象本身,

event.type代表事件名,你可以根據情況為添加event屬性

handlers[i](event);

}

}

},

//移除事件

removeHandler:function(type,handler){

if(this.handlers[type] instanceof Array){

var handlers=this.handlers[type];

for(var i=0,len=handlers.length;i len; i++){

if(handlers[i] == handler){

break;

}

}

handlers.splice(i,1);

}

}

};

首先是定義了一個名為EventTarget的構造函數,為其定義的屬性handlers用於存儲事件處理程序,

然後有三個操作方法添加到EventTarget的原型中,分別是addHandler fire remocveHander.

addHander是向handlers中添加事件處理程序

fire是觸發handlers中的事件處理程序

removeHandler是向handlers中移除事件處理程序

注:事件處理程序通俗的講就是事件被觸發時需要執行的方法.

請說明JavaScript中處理事件的步驟

事件處理程序的方式了:

1. 設置HTML標籤屬性為事件處理程序

文檔元素的事件處理程序屬性,其名字由「on」後面跟著事件名組成,例如:onclick、onmouseover。當然了,這種形式只能為DOM元素註冊事件處理程序。實例:

!DOCTYPE HTML

html

head

meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/

titletest/title

style type=”text/css”

#div1{width: 300px; height: 300px; background: red; overflow:hidden;}

#div2{margin:50px auto; width: 200px; height: 200px; background: green; overflow:hidden;}

#div3{margin:50px auto; width: 100px; height: 100px; background: blue;}

/style

/head

body

div id=”div1″ onClick=”console.log(‘div1’);”div1

div id=”div2″ oNClick=”console.log(‘div2’);”div2

div id=”div3″ onclick=”console.log(‘div3’);” onclick=”console.log(‘div3333’);”div3

/div

/div

/div

script type=”text/javascript”

/script

/body

/html

結果(滑鼠點擊div3區域後):

從結果中可以看出:

①因為HTML裡面不區分大小寫,所以這裡事件處理程序屬性名大寫、小寫、大小混寫均可,屬性值就是相應事件處理程序的JavaScript代碼;

②若給同一元素寫多個onclick事件處理屬性,瀏覽器只執行第一個onclick裡面的代碼,後面的會被忽略;

③這種形式是在事件冒泡過程中註冊事件處理程序的;

2.設置JavaScript對象屬性為事件處理程序

可以通過設置某一事件目標的事件處理程序屬性來為其註冊相應的事件處理程序。事件處理程序屬性名字由「on」後面跟著事件名組成,例如:onclick、onmouseover。實例:

!DOCTYPE HTML

html

head

meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/

titletest/title

style type=”text/css”

#div1{width: 300px; height: 300px; background: red; overflow:hidden;}

#div2{margin:50px auto; width: 200px; height: 200px; background: green; overflow:hidden;}

#div3{margin:50px auto; width: 100px; height: 100px; background: blue;}

/style

/head

body

div id=”div1″div1

div id=”div2″div2

div id=”div3″div3

/div

/div

/div

script type=”text/javascript”

var div1 = document.getElementById(‘div1’);

var div2 = document.getElementById(‘div2’);

var div3 = document.getElementById(‘div3’);

div1.onclick = function(){

console.log(‘div1’);

};

div2.onclick = function(){

console.log(‘div2’);

};

div3.onclick = function(){

console.log(‘div3’);

};

div1.onclick = function(){

console.log(‘div11111’);

};

div1.onClick = function(){

console.log(‘DIV11111’);

};

/script

/body

/html

結果(滑鼠點擊div3區域後):

從結果中可以看出:

①因為JavaScript是嚴格區分大小寫的,所以,這種形式下屬性名只能按規定小寫;

②若給同一元素對象寫多個onclick事件處理屬性,後面寫的會覆蓋前面的(ps:這就是在修改一個對象屬性的值,屬性的值是唯一確定的);

③這種形式也是在事件冒泡過程中註冊事件處理程序的;

3.addEventListener()

前兩種方式出現在Web初期,眾多瀏覽器都有實現。而addEventListener()方法是標準事件模型中定義的。任何能成為事件目標的對象——這些對象包括Window對象、Document對象和所有文檔元素等——都定義了一個名叫addEventListener()的方法,使用這個方法可以為事件目標註冊事件處理程序。addEventListener()接受三個參數:第一個參數是要註冊處理程序的事件類型,其值是字元串,但並不包括前綴「on」;第二個參數是指當指定類型的事件發生時應該調用的函數;第三個參數是布爾值,其可以忽略(某些舊的瀏覽器上不能忽略這個參數),默認值為false。這種情況是在事件冒泡過程中註冊事件處理程序。當其為true時,就是在事件捕獲過程中註冊事件處理程序。實例:

!DOCTYPE HTML

html

head

meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/

titletest/title

style type=”text/css”

#div1{width: 300px; height: 300px; background: red; overflow:hidden;}

#div2{margin:50px auto; width: 200px; height: 200px; background: green; overflow:hidden;}

#div3{margin:50px auto; width: 100px; height: 100px; background: blue;}

/style

/head

body

div id=”div1″div1

div id=”div2″div2

div id=”div3″div3

/div

/div

/div

script type=”text/javascript”

var div1 = document.getElementById(‘div1’);

var div2 = document.getElementById(‘div2’);

var div3 = document.getElementById(‘div3’);

div1.addEventListener(‘click’, function(){ console.log(‘div1-bubble’); }, false);

div2.addEventListener(‘click’, function(){ console.log(‘div2-bubble’); }, false);

div3.addEventListener(‘click’, function(){ console.log(‘div3-bubble’); }, false);

div3.addEventListener(‘click’, function(){ console.log(‘div3-bubble222’); }, false);

div1.addEventListener(‘click’, function(){ console.log(‘div1-capturing’); }, true);

div2.addEventListener(‘click’, function(){ console.log(‘div2-capturing’); }, true);

div3.addEventListener(‘click’, function(){ console.log(‘div3-capturing’); }, true);

/script

/body

/html

結果(滑鼠點擊div3區域後):

從結果中可以看出:

①addEventListener()第三個參數的作用正如上面所說;

②通過addEventListener()方法給同一對象註冊多個同類型的事件,並不會發生忽略或覆蓋,而是會按順序依次執行;

相對addEventListener()的是removeEventListener()方法,它同樣有三個參數,前兩個參數自然跟addEventListener()的意義一樣,而第三個參數也只需跟相應的addEventListener()的第三個參數保持一致即可,同樣可以省略,默認值為false。它表示從對象中刪除某個事件處理函數。實例:

div1.addEventListener(‘click’, div1BubbleFun, false);

div1.removeEventListener(‘click’, div1BubbleFun, false);

function div1BubbleFun(){

console.log(‘div1-bubble’);

}

4.attachEvent()

但是,IE8以及其之前版本的瀏覽器並不支持addEventListener()和removeEventListener()。相應的,IE定義了類似的方法attachEvent()和detachEvent()。因為IE8以及其之前版本瀏覽器也不支持事件捕獲,所以attachEvent()並不能註冊捕獲過程中的事件處理函數,因此attachEvent()和detachEvent()要求只有兩個參數:事件類型和事件處理函數。而且,它們的第一個參數使用了帶「on」前綴的事件處理程序屬性名。實例:

var div1 = document.getElementById(‘div1’);

div1.attachEvent(‘onclick’, div1BubbleFun);

function div1BubbleFun(){

console.log(‘div1-bubble’);

}

相應的,從對象上刪除事件處理程序函數使用detachEvent()。例如:

div1.detachEvent(‘onclick’, div1BubbleFun);

到此為止,我們已經說了瀏覽器中事件傳播機制以及各種註冊事件處理程序的方法。下面我們就再說說事件處理程序調用時的一些問題吧!

二.事件處理程序的調用

1.事件處理程序的參數:正如前面所說,通常事件對象作為參數傳遞給事件處理函數,但IE8以及其之前版本的瀏覽器中全局變數event才是事件對象。所以,我們在寫相關代碼時應該注意兼容性問題。實例(給頁面上id為div1的元素添加點擊事件,當點擊該元素時在控制台輸出事件類型和被點擊元素本身):

!DOCTYPE HTML

html

head

meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/

titletest/title

style type=”text/css”

#div1{width: 300px; height: 300px; background: red; overflow: hidden;}

/style

/head

body

div id=”div1″div1/div

script type=”text/javascript”

var div1 = document.getElementById(‘div1’);

if(div1.addEventListener){

div1.addEventListener(‘click’, div1Fun, false);

}else if(div1.attachEvent){

div1.attachEvent(‘onclick’, div1Fun);

}

function div1Fun(event){

event = event || window.event;

var target = event.target || event.srcElement;

console.log(event.type);

console.log(target);

}

/script

/body

/html

2.事件處理程序的運行環境:關於事件處理程序的運行環境,也就是在事件處理程序中調用上下文(this值)的指向問題,可以看下面四個實例。

實例一:

!DOCTYPE HTML

html

head

meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/

titletest/title

style type=”text/css”

#div1{width: 300px; height: 300px; background: red; overflow: hidden;}

/style

/head

body

div id=”div1″ onclick=”console.log(‘html:’); console.log(this);”div1/div

script type=”text/javascript”

/script

/body

/html

結果一:

從結果可以看出:

①第一種方法事件處理程序中this指向這個元素本身;

實例二:

!DOCTYPE HTML

html

head

meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/

titletest/title

style type=”text/css”

#div1{width: 300px; height: 300px; background: red; overflow: hidden;}

/style

/head

body

div id=”div1″ onclick=”console.log(‘html:’); console.log(this);”div1/div

script type=”text/javascript”

var div1 = document.getElementById(‘div1’);

div1.onclick = function(){

console.log(‘div1.onclick:’);

console.log(this);

};

/script

/body

/html

結果二:

從結果可以看出:

①第二種方法事件處理程序中this也指向這個元素本身;

②存在第二種方法時,它會覆蓋第一種方法註冊的事件處理程序;

實例三:

!DOCTYPE HTML

html

head

meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/

titletest/title

style type=”text/css”

#div1{width: 300px; height: 300px; background: red; overflow: hidden;}

/style

/head

body

div id=”div1″ onclick=”console.log(‘html:’); console.log(this);”div1/div

script type=”text/javascript”

var div1 = document.getElementById(‘div1’);

div1.onclick = function(){

console.log(‘div1.onclick:’);

console.log(this);

};

div1.addEventListener(‘click’, function(){

console.log(‘div1.addEventListener:’);

console.log(this);

}, false);

/script

/body

/html

結果三:

從結果可以看出:

①第三種方法事件處理程序中this也指向這個元素本身;

②第三種方法並不會覆蓋第一種或第二種方法註冊的事件處理程序;

實例四:

!DOCTYPE HTML

html

head

meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/

titletest/title

style type=”text/css”

#div1{width: 300px; height: 300px; background: red; overflow: hidden;}

/style

/head

body

div id=”div1″ onclick=”console.log(‘html:’); console.log(this);”div1/div

script type=”text/javascript”

var div1 = document.getElementById(‘div1’);

div1.onclick = function(){

console.log(‘div1.onclick:’);

console.log(this);

};

div1.attachEvent(‘onclick’, function(){

console.log(‘div1.attachEvent:’);

console.log(this === window);

});

/script

/body

/html

結果四:

從結果可以看出:

①第四種方法事件處理程序中this指向全局對象Window;

②第四種方法也不會覆蓋第一種或第二種方法註冊的事件處理程序;

3.事件處理程序的調用順序:多個事件處理程序調用規則如下:

①通過HTML屬性註冊的處理程序和通過設置對象屬性的處理程序一直優先調用;

②使用addEventListener()註冊的處理程序按照它們的註冊順序依次調用;

③使用attachEvent()註冊的處理程序可能按照任何順序調用,所以代碼不應該依賴於調用順序;

js添加事件和移除事件:addEventListener()與removeEventListener()

addEventListener()與removeEventListener()用於處理指定和刪除事件處理程序操作。

它們都接受3個參數:如 addEventListener(“事件名” , “事件處理函數” , “布爾值”); (註:事件名不含”on”,如「click」) 現在的版本可以省略第三個參數,默認值為false

通過addEventListener()添加的事件處理程序只能使用removeEventListener()來移除;移除時傳入的參數與添加處理程序時使用的參數相同。這也意味著通過addEventListener()添加的匿名函數無法移除

這個例子中,使用addEventListener()添加一個事件處理程序。雖然調用removeEventListener(0是看似使用了相同的參數,但實際上,第二個參數與傳入addEventListener()中的那一個完全不同的函數。而傳入removeEventListener()中的事件處理程序函數必須與傳addEventListener()中的相同

重寫後的這個例子在addEventListener()和removeEventListener()中用的是相同的函數。

1:相同事件綁定和解除,需要使用共用函數;綁定和解除事件時 事件沒有”on” 即onclick寫成click

2:共用函數不能帶參數;

布爾值參數是true,表示在捕獲階段調用事件處理程序;就是最不具體的節點先接收事件,最具體的節點最後接收事件

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/287280.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-23 13:07
下一篇 2024-12-23 13:07

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • Python 常用資料庫有哪些?

    在Python編程中,資料庫是不可或缺的一部分。隨著互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的資料庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • Python購物車程序

    Python購物車程序是一款基於Python編程語言開發的程序,可以實現購物車的相關功能,包括商品的添加、購買、刪除、統計等。 一、添加商品 添加商品是購物車程序的基礎功能之一,用…

    編程 2025-04-29
  • 爬蟲是一種程序

    爬蟲是一種程序,用於自動獲取互聯網上的信息。本文將從如下多個方面對爬蟲的意義、運行方式、應用場景和技術要點等進行詳細的闡述。 一、爬蟲的意義 1、獲取信息:爬蟲可以自動獲取互聯網上…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟體。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29
  • Python一元二次方程求解程序

    本文將詳細闡述Python一元二次方程求解程序的相關知識,為讀者提供全面的程序設計思路和操作方法。 一、方程求解 首先,我們需要了解一元二次方程的求解方法。一元二次方程可以寫作: …

    編程 2025-04-29
  • 如何使用GPU加速運行Python程序——以CSDN為中心

    GPU的強大性能是眾所周知的。而隨著深度學習和機器學習的發展,越來越多的Python開發者將GPU應用於深度學習模型的訓練過程中,提高了模型訓練效率。在本文中,我們將介紹如何使用G…

    編程 2025-04-29

發表回復

登錄後才能評論