DOM-7 【兼容】事件處理函數、冒泡捕獲、阻止冒泡默認事件

事件處理函數

  • 綁定事件 = 綁定事件的處理函數(事件本身是存在的,綁定的是相應的反饋)
  • 事件 + 事件的反饋 = 前端交互 (前端核心)

綁定事件的方式

1. 句柄綁定

  • 默認(只能)是事件冒泡這種事件流
  • 為某一個元素(事件源)指定了一個事件句柄(onclick,事件發生時要進行的操作)
oDiv.onclick = function(){} // 事件句柄 = 處理函數
  • onclick綁定的事件處理函數內寫的其他函數,在非嚴格模式下,指向的是window
  • 【該方式】一個元素、同一事件、只能綁定一個事件處理函數(綁定多個取最后)
    在這里插入圖片描述

2. 內聯事件監聽器

在html上綁定,綁定執行(不建議使用,結構和邏輯應當分離),這種按屬性綁定的方式優先級更低,會被js覆蓋
在這里插入圖片描述在這里插入圖片描述

3. 事件監聽器

1) W3C規范,但IE9以下不支持

  • 注冊事件監聽器/綁定事件監聽器
  • 可以綁定多個事件處理函數,都能執行;如果綁定了多次同一事件處理函數,只會執行一次
  • 注意:事件類型沒有加on
elem.addEventListener(事件類型,事件處理函數,false);//false事件冒泡  true事件捕獲
// 2種都執行
oBtn.addEventListener('click',function(){this.innerHTML = '加載中..'
},false)
oBtn.addEventListener('click',function(){console.log('加載更多事件')
},false)
oBtn.addEventListener('click',test,false);
oBtn.addEventListener('click',test,false);
function test(){console.log(1); // 打印1次
}

2)IE8及以下綁定方法

elem.attachEvent(事件類型,事件處理函數);
  • 注意:事件類型加on
    在這里插入圖片描述
    在這里插入圖片描述

點擊事件 + IIFE

  • 在綁定時,console.log(i)并沒有執行,i沒有保存,綁定的函數在for循環結束后被執行(點擊了),訪問到的是5
var oLi = document.getElementsByTagName('li'),len = oLi.length,item;
for (var i = 0; i < len; i++) {(function (j) {item = oLi[i];item.addEventListener('click', function () {console.log(i);}, false);}(i))
}

3) 事件處理程序的運行環境 / this

  • 誰調用this就指向誰(attachEven是個特例,this指向window)
    在這里插入圖片描述

4) 【兼容】封裝綁定事件處理函數

function addEvent(el, type, fn) {if (el.addEventListener) {el.addEventListener(type, fn, false);} else if (el.attachEvent) {el.attachEvent('on' + type, function () {fn.call(el);})} else {el['on' + type] = fn}
}

5)解除事件處理程序

// 句柄
element.onclick=null/false;// W3C規范事件監聽器 (add時怎么寫remove就得怎么寫)
element.addEventListener('click',test,false);
element.removeEventListener('click',test,false)// IE8及以下事件監聽器
element.detachEvent('onclick',test);
  • 非嚴格模式下可以使用方法4
    在這里插入圖片描述
    在這里插入圖片描述
function removeEvent(elem, type, fn) {if (elem.addEventListener) {elem.removeEventListener(type, fn, false)} else if (elem.attachEvent) {elem.detachEvent('on' + type, fn)} else {elem['on' + type] = null}
}

標簽嵌套

  • 內聯元素寫嵌套關系,dom解析出來依然不是嵌套的
  • a的特殊現象,變成block依然不能嵌套
    在這里插入圖片描述
    在這里插入圖片描述

事件冒泡與捕獲

  • dom結構中/嵌套結構中,從內到外,從下到上,事件從子元素一層一層向上傳遞的現象是事件冒泡
  • 需綁定相同事件,向上傳遞時,父級有相同事件則觸發
  • 關心的是事件,而非事件處理函數
  • 事件捕獲則順序相反,點擊父元素,一直捕獲到事件源,事件監聽器true
  • 注意:dom結構嵌套,視覺上并不一定嵌套
  • 點擊黃色:事件捕獲先于事件冒泡執行
    在這里插入圖片描述
  • 點擊紅色,紅色是事件源,事件源是按綁定順序先后執行的,非冒泡非捕獲
    在這里插入圖片描述
  • focus、blur、change、submit、reset、select這些是沒有捕獲和冒泡事件的
  • IE瀏覽器是沒有事件捕獲的,除了Chrome以外的老版本瀏覽器都沒有捕獲,新版的瀏覽器(火狐、歐朋)有捕獲的,主要和webkit blink內核有關系

取消冒泡

1. e.stopPropagation() (W3C)

在這里插入圖片描述

2. e.cancelBuble = true (IE)

  • attach的怎么取消
    在這里插入圖片描述

3. 【兼容】封裝

function cacelBubble(e) {var e = e || window.event;if (e.stopPropagation) {e.stopPropagation();} else {e.cancelBubble = true;}
}

取消默認事件

1. 阻止右鍵菜單彈出

1)阻止右鍵菜單彈出

在這里插入圖片描述

2)W3C:e.preventDefault()(IE9不兼容)

在這里插入圖片描述

3)e.returnValue = false

在這里插入圖片描述

function preventDefaultEvent(e) {var e = e || window.event;if (e.preventDefault) {e.preventDefault()} else {e.returnValue = false}
}

2. a標簽默認事件

  • 跳轉和刷新頁面
// 1)void(0)相當于return 0
<a href = "javascript:void(0)">百度一下</a>
// 2)
<a href = "javascript:;">百度一下</a>
// 3)錨點方式
<a href = "#">百度一下</a> 
// 4)
a.onclick = function(e){e.preventDefault();
}

舉例

在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251101.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javascript --- XHR(XMLHttpRequet)對象

XHR: // XHR(XMLHttpRequest):為向服務器發送請求和解析服務器響應提供了流暢的接口 // 能夠以異步方式從服務器取得更多信息,意味著用戶點擊后,可以不必刷新頁面也能取得新數據 // 換句話說,可以使用XHR對象獲取新數據,然后再通過DOM將新數據插入到頁面中.XMLHttpRequest對象…

DOM-8 【兼容】冒泡捕獲流、事件與事件源對象、事件委托

事件流 1. 含義 描述從頁面中接收事件的順序 2. 分類 IE提出的 事件冒泡流 Event BubblingNetscape提出的 事件捕獲流 Event Capturing 3. 階段 事件捕獲階段 處于目標階段 事件冒泡階段 事件捕獲先于事件冒泡執行 dom dom0&#xff1a;定義句柄方式&#xff0c;兼…

IIS6.0,Apache低版本,PHP CGI 解析漏洞

IIS6.0解析漏洞 在IIS6.0下存在這樣的文件“名字.asp;名字.jpg” 代表了jpg文件可以以asp腳本類型的文件執行。 根據這個解析漏洞我們可以上傳這種名字類型的圖片&#xff0c;比如 1.asp;xxx.jpg 他會忽略;后邊的內容&#xff0c;所以文件相當于1.asp asp一句話木馬 <%eval …

UVA 3485 Bridge

題目大意 你的任務是修建一座大橋。橋上等距地擺放著若干個塔&#xff0c;塔高為H&#xff0c;寬度忽略不計。相鄰兩座塔之間的距離不能超過D。塔之間的繩索形成全等的對稱拋物線。橋長度為B&#xff0c;繩索總長為L&#xff0c;如下圖所示求建最少的塔時繩索的最下端離地的高度…

javascript --- XMLHttp2級、CORS(跨域資源共享)

FormData: // 為序列化表單以及創建與表單格式相同的數據提供了便利 var data new FromData(); data.append("name", "Nicholas");// 使用FormData標準化數據后,發送到服務器 var xhr createXHR(); xhr.onreadystatechange function () {if ( xhr.read…

ES5-拓展 this指向的總結

每個函數在執行時都有自己的this指向 1. 默認綁定規則&#xff1a; 全局中&#xff0c;this指向window this window函數的獨立調用&#xff0c;this默認指向window &#xff08;不要把獨立調用理解成window調用&#xff09; // 函數在全局中調用&#xff0c;也就是被window調…

Applet

Applets用于為Web應用程序提供交互功能&#xff0c;這些功能無法單獨由HTML提供。它們可以捕獲鼠標輸入&#xff0c;并且還具有按鈕或復選框等控件。響應于用戶動作&#xff0c;小應用程序可以改變提供的圖形內容。這使得小程序非常適合演示&#xff0c;可視化和教學。 一個app…

國內初創企業選擇云計算服務器價格對比

假設我們是一家初創企業&#xff0c;現在要選擇第一臺服務器。業務還未確定&#xff0c;只知道是互聯網業務 要求&#xff1a; 至少2核&#xff0c;否則多線程的軟件都跑不了至少4G內存&#xff0c;這樣可以運行數據庫或者elasticsearch這種比較吃內存的東西。或者說&#xff0…

javascript --- 幾個其他的跨域技術(圖像Ping、JSONP、Comet)

在CORS(Cross-Origin Resource Sharing,跨域資源共享)出現以前,要實現跨域Ajax通信是很難的. 可以利用DOM中能夠執行跨域請求的功能,來實現跨域通信: 瀏覽器到服務器的單向通信: 此項技術稱為圖像Ping,利用的是img.src的跨域事件 img.src只能通過偵聽load和error事件來確定瀏覽…

ES5-拓展 箭頭函數的this、this的優先級

讓內部函數的this指向和父函數的this&#xff0c;可以顯示改變this指向&#xff0c;也可以使用箭頭函數 箭頭代替了function關鍵字 箭頭函數內部沒有this指向&#xff0c;箭頭函數的this是穩定引用父作用域的。因為它的存在就是要穩定this指向。 適用于普通函數的所有綁定規則…

java 實現壓縮單個文件

先來實現一個簡單的單文件壓縮&#xff0c;主要是為了解一下壓縮需要使用到的流。。 效果&#xff1a; 說明&#xff1a;壓縮實現使用ZipOutputStream 代碼&#xff1a; package com.gx.compress;import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im…

jekins構建觸發器詳解

jenkins版本&#xff1a;2.89.2 1、觸發遠程構建 (例如,使用腳本)&#xff1a;通過一個網址的訪問來觸發構建&#xff0c;這樣就不需要登錄jenkins系統也能觸發構建了。 示例地址&#xff1a; http://localhost:8848/job/FlashRegistration/build??token口令&cause書寫構…

http --- 前端的緩存

前端的緩存分為: http緩存 和 瀏覽器緩存 http緩存: // 當客戶端向服務器請求資源時,會先抵達瀏覽器緩存,如果瀏覽器有"要請求資源"的副本 // 就會從瀏覽器緩存中提取而不是從原始服務器中提取這個資源// 常見的http緩存,只能緩存get請求響應的資源,對于其他類型的響…

ES5-拓展 隱式數據類型轉換

Boolean轉換原則&#xff1a;非假即真 6種虛值 原始值轉換為原始值 對象轉換為原始值 Date()和new Date() new Date可以不寫括號(new方式返回的一定是對象)&#xff0c;返回Date對象Date()返回函數執行&#xff0c;返回時間字符串 引用值轉原始值 先找valueOf方法(一般…

Swagger的簡單入門【轉載】

一、Swagger簡介 上一篇文章中我們介紹了Spring Boot對Restful的支持&#xff0c;這篇文章我們繼續討論這個話題&#xff0c;不過&#xff0c;我們這里不再討論Restful API如何實現&#xff0c;而是討論Restful API文檔的維護問題。 在日常的工作中&#xff0c;我們往往需要給前…

visual studio code搭建本地服務器(node.js+express)

一、安裝node.js&#xff08;常規軟件安裝流程&#xff0c;比較簡單&#xff0c;不用贅述&#xff09; 二、安裝express框架 1. 打開Windows命令提示符&#xff0c;輸入&#xff1a; npm install express -g&#xff0c;等待&#xff0c;安裝好如下所示&#xff1a; npm instal…

es6 --- 手寫一個promise

一個promise實例: var getJSON function(url) {var promise new Promise(function(resolve, reject) {// XHR對象發現ajax請求var client new XMLHttpReqeust();client.open("GET", url);client.onreadystatechange handler;client.responseType "json&qu…

最大流模版 EK

EK算法基于增廣路的思想,易于理解,但由于低效并不被經常使用 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <queue> using namespace std; const int MAXN10005,MAXM100005…

Restrictions查詢用法

Restrictions查詢用法 HQL運算符 QBC運算符 含義 Restrictions.eq() 等于equal <> Restrictions.ne() 不等于not equal > Restrictions.gt() 大于greater than > Restrictions.ge() 大于等于greater than or equal < Restrictions.lt() 小…

chrome調試

技術拓展直播課8 按chrome的官方文檔 長按刷新 清除緩存&#xff08;不一定好使&#xff09; Ctrl f 查找類 console控制臺見b站 bilibili source面板直接打斷點 效果和debugger一樣 單步調試 進入到函數的下一步 網速 no throttling 是否需要過濾 domcontentloaded d…