亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript常見事件處理程序實例總結

2024-05-06 16:47:35
字體:
來源:轉載
供稿:網友

本文實例總結了JavaScript常見事件處理程序。分享給大家供大家參考,具體如下:

事件指的是使用者或者瀏覽器自身執行的某種動作(比如點擊事件)。響應這些事件的函數就叫做事件處理程序(或者叫事件監聽器)。事件處理程序的名字以“on”為前綴,比如 click 事件的事件處理程序就是 onclick。

1 HTML 事件處理程序

如果某個元素支持某個事件,那么它都有一個與相應的事件處理程序同名的 HTML 屬性,我們可以通過這個屬性來指定 JS:

<input type="button" value="點我" onclick="alert('點擊過咯')"/>

因為這里的腳本是嵌入在 HTML 元素的屬性中,所以使用了單引號!

也可以調用在頁面的其他地方定義的腳本:

<input type="button" value="Click me" onclick="showMessage()"><script type="text/javascript">  function showMessage() {    console.log("Hello World!");  }</script>

事件處理程序的代碼在執行時,可以訪問到全局作用域中的任何代碼!

這樣指定的事件處理程序,會創建一個封裝著元素屬性值的函數,它有一個局部變量 event,就是事件對象:

<input type="button" value="點我" onclick="alert(event.type)"/>

通過 event 變量,可以直接訪問事件對象。在這個函數內部,this 值等于事件的目標元素:

<input type="button" value="點我" onclick="alert(this.value)"/>

可以通過這個動態創建的函數,來擴展它的作用域。在這個函數內部,可以訪問 document 以及該元素本身的成員,這個函數是像這樣使用 with 來擴展作用域的:

function(){  with(document){    with(this){      //元素屬性值    }  }}

所以,在事件處理程序中,要訪問自己的屬性就變得很容易啦 O(∩_∩)O~:

<!-- 輸出 “點我” --><input type="button" value="點我" onclick="alert(value)"/>

如果當前元素是一個表單輸入元素,則作用域中還會包含訪問表單元素(父元素)的入口,所以這個函數應該是這樣的:

function(){  with(document){    with(this.form){       with(this){        //元素屬性值       }    }  }}

這樣事件處理程序就無需引用表單元素,就可以直接訪問到表單中的其他字段啦O(∩_∩)O~:

<form method="post">  <input type="text" name="username" value="">  <input type="button" value="Echo Usernmame" onclick="console.log(username.value);"></form>

在 HTML 中直接指定事件處理程序會有這些缺點:

  • 時差問題——假設函數是定義在頁面最底部,如果用戶在頁面還未解析到這個函數時,就點擊了按鈕,就會引發錯誤。所以很多 HTML 事件處理程序都會被封裝在 try-catch 塊中:
<input type="button" value="點我" onclick="try{alert(value);} catch(ex){}"/>
  • 擴展事件處理程序的作用域鏈,在不同的瀏覽器中結果可能會不同。
  • HTML 與 JavaScript 代碼緊密耦合。要修改事件處理程序,就需要修改兩個地方,所以很多開發人員轉而使用 JavaScript 來指定事件處理程序。

2 DOM0 級事件處理程序

它是通過將一個函數賦值給事件處理程序的屬性,來指定事件處理程序的。要使用這種方法,必須先取得一個要操作的對象的引用。

每個元素(包括 window 和 document) 都有自己的事件處理程序屬性,它們通常是小寫,比如 onclick。將屬性的值設置為函數,就指定了事件處理程序。

DOM0 級事件處理程序是元素的方法,它是在元素的作用域內運行的,因此程序中的 this 引用的是當前元素:

<button id="myBtn">點我</button><script type="text/javascript">  var btn = document.getElementById("myBtn");  btn.onclick = function () {    console.log(this.id);//myBtn  }</script>

可以通過 this 訪問元素的任何屬性和方法。DOM0 級事件處理程序會在事件流的冒泡階段被處理。

也可以像這樣刪除這樣指定的事件處理程序:

btn.onclick = null; //刪除指定的事件處理程序

注意: 如果使用的是 HTML 指定的事件處理程序,那么 onclick 屬性的值就是一個包含著在同名 HTML 特性中指定的代碼函數。將相應的屬性設置為 null,也可以刪除以這種方式指定的事件處理程序。

3 DOM2 級事件處理程序

  • addEventListener():指定事件處理程序。
  • removeEventListener():刪除事件處理程序。

所有的 DOM 節點都包含這兩個方法。它們都接受 3 個參數:要處理的事件名、事件處理程序函數、布爾值。最后一個參數如果是 true,表示在捕獲階段調用事件處理程序;如果是 false,表示在冒泡階段調用事件處理程序。

DOM2 級事件處理程序可以很方便地添加多個事件處理程序:

var btn = document.getElementById("myBtn");btn.addEventListener("click", function () {  console.log(this.id);}, false);btn.addEventListener("click", function () {  console.log("Hello world!");}, false);

這些事件處理程序會按照添加它們的順序依序觸發。

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

var handler = function () {  console.log("Hi deniro");};btn.addEventListener("click", handler, false);btn.removeEventListener("click", handler, false);//移除成功

大多數情況下,都是將事件處理程序添加到事件流的冒泡階段,這樣可以最大限度地兼容瀏覽器。所以如果不是特別需要,請不要在事件捕獲階段注冊事件處理程序。

注意: IE9、Firefox、Safari、Chrome 和 Opera 支持 DOM2 級事件處理程序。

4 IE 事件處理程序

IE 實現了與 DOM 類似的方法:attachEvent() 和 detachEvent()。它們接受兩個參數:事件處理程序名稱和事件處理程序函數。因為 IE8 及早期版本只支持事件冒泡,所以使用 attachEvent() 添加的事件處理程序會被添加到冒泡階段。

這樣為按鈕添加一個事件處理程序:

var btn = document.getElementById("myBtn");  btn.attachEvent("onclick", function () {});

IE 的 attachEvent() 與 DOM0 級方法的區別是事件處理程序的作用域不同。 DOM0 級方法中,事件處理程序會在其所屬元素的作用域內運行;而使用 attachEvent() ,事件處理程序會在全局作用域中運行,所以 this 等于 window:

var btn = document.getElementById("myBtn");btn.attachEvent("onclick", function () {  console.log("Clicked");  console.log(this === window);//true;this 為全局作用域});

也可以為一個元素添加多個事件處理程序:

var btn = document.getElementById("myBtn");btn.attachEvent("onclick", function () {  console.log("Clicked");  console.log(this === window);//true;this 為全局作用域});//IE10 中多個事件是按照事件定義的順序執行btn.attachEvent("onclick", function () {  console.log("Hello world!");});

IE8 及之前的版本,是以添加它們的相反順序進行,IE9 修復了這個問題。

可以通過 detachEvent() 來移除添加的事件處理程序,但必須提供相同的參數。所以它也不能移除之前通過匿名函數添加的事件處理程序。只要能夠將對相同函數的引用作為參數,就可以移除添加的事件處理程序咯:

<button id="myBtn">點我</button><script type="text/javascript">  var btn = document.getElementById("myBtn");  var handler = function () {    console.log("Clicked");  }  btn.attachEvent("onclick", handler);  btn.detachEvent("onclick", handler);</script>

注意: IE 和 Opera 支持 IE 事件處理程序。

5 跨瀏覽器的事件處理程序

只要恰當地運用能力檢測,就能寫出跨瀏覽器的事件處理程序。

var EventUtil = {  /**   * 添加事件   * @param element 要操作的元素   * @param type 事件名稱   * @param handler 事件處理函數   */  addHandler: function (element, type, handler) {    if (element.addEventListener) {      element.addEventListener(type, handler, false);    } else if (element.attachEvent) {      element.attachEvent("on" + type, handler);    } else {      element["on" + type] = handler;    }  },  /**   * 移除事件   * @param element 要操作的元素   * @param type 事件名稱   * @param handler 事件處理函數   */  removeHandler: function (element, type, handler) {    if (element.removeEventListener) {      element.removeEventListener(type, handler, false);    } else if (element.detachEvent) {      element.detachEvent("on" + type, handler);    } else {      element["on" + type] = null;    }  }}

這樣使用:

<button id="myBtn">點我</button><script type="text/javascript" src="EventUtil.js"/><script type="text/javascript">  var btn = document.getElementById("myBtn");  var handler = function () {    console.log("Clicked");  }  EventUtil.addHandler(btn, "click", handler);  EventUtil.removeHandler(btn, "click", handler);</script>

還有一點,DOM0 級對每一個事件只支持一個事件處理程序,好在現在只支持 DOM0 級事件處理程序的瀏覽器幾乎已經沒有咯,所以不用擔心啦 O(∩_∩)O~


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线欧美在线| 亚洲欧美精品在线| 国产精品7m视频| 国产一区二区三区免费视频| 在线观看欧美视频| 激情成人在线视频| 精品久久久一区二区| 日韩在线观看视频免费| 中文字幕欧美日韩va免费视频| 曰本色欧美视频在线| 美女啪啪无遮挡免费久久网站| 久久免费精品视频| 亚州国产精品久久久| 亚洲a一级视频| 国产精品99蜜臀久久不卡二区| 性视频1819p久久| 中文字幕精品在线| 97香蕉超级碰碰久久免费软件| 亚洲第一精品福利| 久久久噜噜噜久久久| 国产精品第100页| 国产精品久久久久一区二区| 久久久之久亚州精品露出| 日韩中文字幕网站| 亚洲欧美中文日韩v在线观看| 中文字幕亚洲图片| 青青草国产精品一区二区| 午夜精品一区二区三区在线| 欧美激情va永久在线播放| 97国产精品人人爽人人做| 色先锋久久影院av| 国产精品吊钟奶在线| 96pao国产成视频永久免费| 欧美日韩在线视频首页| 欧美超级乱淫片喷水| 欧美亚洲在线观看| 亚洲人成电影网站| 九九精品在线视频| 欧美精品午夜视频| 欧美寡妇偷汉性猛交| 欧美日韩国产中文精品字幕自在自线| 日日狠狠久久偷偷四色综合免费| 国产欧美日韩亚洲精品| 久久综合国产精品台湾中文娱乐网| 亚洲天堂网在线观看| 亚洲福利视频二区| 色综合久久精品亚洲国产| 中文字幕亚洲综合久久| 国产精品亚洲综合天堂夜夜| 久久999免费视频| 少妇高潮久久久久久潘金莲| 久久精品欧美视频| 亚洲色图美腿丝袜| 欧美成人亚洲成人| 亚洲自拍欧美另类| 国产精品久久久久高潮| 韩剧1988免费观看全集| 视频直播国产精品| 精品国产视频在线| 国产精品美女av| 欧美成人免费全部| 亚洲夜晚福利在线观看| 日本a级片电影一区二区| 国产精品美女av| 97免费视频在线| 亚洲午夜精品久久久久久久久久久久| 国产亚洲人成网站在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲天堂精品在线| 亚洲精品小视频| 宅男66日本亚洲欧美视频| 亚洲国产精品va在线| 国产欧美日韩亚洲精品| 亚洲国产精品成人va在线观看| 国产国产精品人在线视| 久久影视电视剧凤归四时歌| 欧美大胆a视频| 国产精品自拍小视频| 国外成人性视频| 久久激情视频免费观看| 久久全球大尺度高清视频| 欧美韩国理论所午夜片917电影| 91九色国产在线| 日韩中文字幕第一页| 国产精品久久久久久亚洲影视| 亚洲欧美一区二区三区四区| 欧美国产中文字幕| 成人做爰www免费看视频网站| 日韩福利伦理影院免费| 国产91免费观看| 精品久久久久久亚洲精品| 国产91ⅴ在线精品免费观看| 伦伦影院午夜日韩欧美限制| 神马久久久久久| 亚洲精品免费一区二区三区| 国产偷亚洲偷欧美偷精品| 日韩国产欧美精品一区二区三区| 中文字幕9999| 成人午夜在线影院| 欧美成人午夜影院| 精品亚洲国产视频| 精品国产乱码久久久久久天美| 96sao精品视频在线观看| 激情懂色av一区av二区av| 国产裸体写真av一区二区| 国外成人免费在线播放| 一区二区成人av| 亚洲国产精彩中文乱码av在线播放| 一区二区三区视频观看| 777精品视频| 亚洲一区二区久久久久久久| 欧美日韩精品在线播放| 成人观看高清在线观看免费| 国产精品高潮粉嫩av| 69国产精品成人在线播放| 亚洲视屏在线播放| 日韩美女视频免费在线观看| 高清欧美性猛交xxxx| 久久免费少妇高潮久久精品99| 九九九热精品免费视频观看网站| 一区二区三区美女xx视频| 亚洲国产精品热久久| 综合136福利视频在线| 国产一区av在线| 正在播放国产一区| 欧美三级欧美成人高清www| 国产日韩欧美在线看| 国产亚洲精品久久久| 91欧美日韩一区| 亚洲成人黄色在线| 久久久久久久久中文字幕| 久久香蕉国产线看观看av| 国产成人久久精品| 超碰日本道色综合久久综合| 国产精品视频免费在线| 国产精品久久久久久久电影| 日韩中文在线中文网在线观看| 欧美怡春院一区二区三区| 亚洲综合视频1区| 美女av一区二区三区| 欧美一乱一性一交一视频| 国产美女精品视频免费观看| 91精品综合视频| 色哟哟亚洲精品一区二区| 91精品啪在线观看麻豆免费| 日本久久中文字幕| 91免费看国产| 日本道色综合久久影院| 国产精品国内视频| 国产91精品黑色丝袜高跟鞋| 成人av在线天堂| 国产亚洲精品一区二区| 精品视频www| 欧洲精品毛片网站| 亚洲电影免费观看高清| 国产福利精品av综合导导航| 91精品国产综合久久香蕉最新版| 亚洲男人天堂久| 久色乳综合思思在线视频| 日本午夜精品理论片a级appf发布| 国产精品扒开腿做爽爽爽男男| 国产成人自拍视频在线观看| zzijzzij亚洲日本成熟少妇| 中文字幕日韩专区|