欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

談談我對JavaScript DOM事件的理解

 更新時間:2015年12月18日 11:08:17   作者:微宇宙  
DOM與事件是JavaScript最核心的組成部分之一,他們賦予了頁面無限的想象空間,你根本無法離開他們,否則js將寸步難行。本文給大家分享我對javascript dom事件的了解,對javascript dom事件相關知識感興趣的朋友一起學習吧

什么是事件?

事件(Event)是JavaScript應用跳動的心臟 ,也是把所有東西粘在一起的膠水。當我們與瀏覽器中 Web 頁面進行某些類型的交互時,事件就發(fā)生了。事件可能是用戶在某些內容上的點擊、鼠標經過某個特定元素或按下鍵盤上的某些按鍵。事件還可能是 Web 瀏覽器中發(fā)生的事情,比如說某個 Web 頁面加載完成,或者是用戶滾動窗口或改變窗口大小。

通過使用 JavaScript ,你可以監(jiān)聽特定事件的發(fā)生,并規(guī)定讓某些事件發(fā)生以對這些事件做出響應。

DOM與事件是JavaScript最核心的組成部分之一,他們賦予了頁面無限的想象空間,你根本無法離開他們,否則js將寸步難行。在我們平時的開發(fā)過程中,jQuery的出現(xiàn)使得我們得心應手,然而你必須知道,jQuery之所以把事情簡單化,是得益于JavaScript本身提供的強大的API,你應該去熟悉它們。

首先,此文不討論繁瑣細節(jié),但是考慮到讀者的心靈感受,本著以積極向上的心態(tài),在此還是會列舉示例說明。

​標題為理解DOM事件,那么在此拿一個簡單的點擊事件為例,希望大家看到這個例子后能觸類旁通。
 最初我們給頁面實現(xiàn)點擊,就像下面這樣的簡單操作。

先定義一個塊如<div id="weiyuzhou">微宇宙</div>,之后在<script type="text/javascript"></script>內部實現(xiàn)id為weiyuzhou的點擊事件,如下代碼所示:

var wyz = document.getElementById('weiyuzhou');
wyz.onclick = function () {
  confirm(arguments.length)
} 

確保上面這些步驟都沒問題的話,我們才可以繼續(xù)的往下走,然后我們在IE瀏覽器(低版本)看到彈出0,確切的說,IE8以下(包含IE8)的彈出0,反之彈出1。接著我在firefox瀏覽器看到彈出1。也就是說在IE8以下版本事件的觸發(fā)不存在于函數(shù)的作用域內部,是不是說IE8以下的事件觸發(fā)發(fā)生在全局作用域中,此處留個懸念,但是,可以肯定的是IE8以下事件的方法并沒有這個Event參數(shù),也就是說arguments的長度為0,如下視圖5-02所示:

5-02

于是,我們看firefox瀏覽器窗口彈出1,說明事件存在于函數(shù)內部,再次證明方法的內部數(shù)組arguments長度為1,并且是可枚舉的變量,也可以說可寫,如下視圖5-03所示。

5-03

如果,你還是不明白其中的原理,你不防去看一下《web前端開發(fā)修煉之道》書上第169頁,然后再回過頭來看此處文章摘要,可能會讓你更加深層次的了解書中的內容。

接下來,我們該怎么辦呢,我們肯定不能讓IE和firefox返回的事件輸出不相同,那么如何讓IE和firefox下彈出的內容都一樣。

銜接上一段內容,下面給點擊函數(shù)的內部設置一個參數(shù),參數(shù)名為e,然后在IE和firefox瀏覽器下面同時觸發(fā)點擊事件,我們看到firefox下面顯示e為鼠標事件[object MouseEvent],IE8下報錯,彈出錯誤信息未定義undefined。此時你要問我錯在哪里,咱們回到剛剛的那句話‘此處留個懸念'進行分析,IE8以下的瀏覽器的事件是不是發(fā)生在全局作用域中,從視圖5-02所示看到有一個global全局對象,我們可以對global展開搜索,global的繼承的方法有一個event事件,找到了IE8的專有事件方法window繼承event,于是我們對這個參數(shù)e設置為window.event進行一個調試,目前我們在IE8下面看到返回了一個事件[object event],如圖5-04所示。

5-04

 

想必你一定發(fā)現(xiàn)了IE8和firefox瀏覽器下對話框的事件返回值各不不同,IE8的對話框[object MouseEvent],firefox的對話框[object event],那我們怎么讓IE8和firefox下的返回值都相同呢?

看到這里,你的心里是不是有點小沮喪,挖坑挖了這么久了,怎么還沒有看到水流出來,別急,正題才剛剛開始,咱們不閑聊,繼續(xù)圍繞正題展開分析,通過剛剛的返回值,我們繼續(xù)使用斷點的方法尋找能夠實現(xiàn)IE和firefox的返回值的共同點。

經由以上分析,我們查找發(fā)現(xiàn)firefox下的event有我們需要的方法名可以被調用,當然,我們查找發(fā)現(xiàn)IE8下面的srcElement也有我們所需的方法名可以被調用,于是乎,呵呵!看到這里你的內心是不是有點小激動,一步步排除,最后發(fā)現(xiàn)也沒有什么難的?;氐秸},現(xiàn)在我們聲明一個變量var e_child = e.srcElement || e.target; 然后我們在IE8和firefox瀏覽器上看到對話框信息都為[object HTMLDivElement],如圖5-05所示。

5-05

 

現(xiàn)在我們解決了不同瀏覽器的返回值不同的問題,也就是說解決了兼容的問題,這只是冰上一角。

下面我們要解決實現(xiàn)窗口的容器觸發(fā)事件,主要是基于上面的結構進行的一次分析。

當你有了上面基礎的話,下面的內容相對于上面而言比較簡單一點。

還是以上一個頁面的塊為例,現(xiàn)在我繼續(xù)往塊<div id="weiyuzhou">微宇宙</div>增加一個子容器,這個子容器為行內元素<span id='coz'>koringz</span>,取id名為coz,然后給這個元素也加一個點擊事件代碼同上函數(shù),為了能區(qū)別開文本內容之間的差異。

當我分別在IE8和firefox下點擊容器的內容,出現(xiàn)了怪異的情況,在firefox瀏覽器的窗口上點擊時,點擊中文文本內容彈出來對話框‘微宇宙',我再點擊koringz時,發(fā)現(xiàn)彈出了二次對話框,彈出內容都為'koringz',那是因為我點擊子容器的時候觸發(fā)了上一層的點擊行為,如何解決點擊koringz彈出二次對話框的問題,了解一點js的程序員都知道這是冒泡事件。

那么在firefox能夠清除冒泡事件的是event下的stopPropagation,于是我們給第二次點擊事件函數(shù)代碼塊之后面加一行代碼e.stopPropagation();之后再點擊koringz發(fā)現(xiàn)彈出一次'koringz'。如圖5-06所示

 5-06

 

接下來在IE8下面測試一下,發(fā)現(xiàn)在IE8瀏覽器點擊也彈出二次,解決IE8的停止冒泡事件為cacelBubble,且我們只需要給cacelBubble設置為true即可。

因為IE8下global包含的event屬性cacelBubble不是一個方法,而是一個輸出布爾值的對象,所以這個和firefox有所不同,只是firefox把此事件封裝成方法而已。好了,現(xiàn)在我們給第二次點擊的事件代碼塊之后再加一行代碼e.cancelBubble = true;然后在IE8瀏覽器下測試,之后再點擊koringz發(fā)現(xiàn)也彈出一次。如圖5-07所示

5-07

 

注意上面的停止冒泡的事件的代碼可以根據瀏覽器的不同分開來寫,如何分開寫,我們查看IE8瀏覽器下面的document發(fā)現(xiàn)存在對象all,而在firefox卻沒有沒有這個all屬性,這也就是說document.all是IE8版本下面獨有的一個屬性。通過它我們可以區(qū)分瀏覽器的冒泡事件。

到目前為止,我們解決了窗口的冒泡事件,接下來,我們要解決一個事件因被多人定義而覆蓋原函數(shù)的問題。也可能是說某公司之前的工作人員添加了此事件,后來新員工接手項目后添加修改此事件而覆蓋了原事件的執(zhí)行所產生的問題。也就是說給當前id多次添加此類事件都不會覆蓋此事件的原函數(shù)執(zhí)行。

在firefox下的window包含有addEventListener(type, listener, useCapture)的方法,隨后我們在<script type="text/javascript"></script>內部定義此監(jiān)聽事件domElement.addEventListener('click',function(e){confirm(e+'e')},false);,接著在firefox瀏覽器點擊內容彈出二次,最后一次彈出為[object MouseEvent]e,后面多了一個e,這是我有意加上用以區(qū)別的。如圖5-08所示。

5-08

 

接下來在IE8下測試發(fā)現(xiàn)addEventListener錯誤,但是看到window下有此類方法(嘗試了一下,原來此類方法在IE9以上版本是可以被支持),IE8同時還有一個attachEvent(event, pdisp),那么我們設置監(jiān)聽事件wyz.attachEvent('onclick',function(e){confirm(e + 'e')}),注:event為'onclick',緊接著在IE8下點擊發(fā)現(xiàn)可彈出二次,最后一次eIE。此時on('click',pdisp)和attachEvent(event,pdisp)可以共同使用。

綜上所述,我們解決了DOM事件的兼容性,DOM事件的冒泡,以及DOM事件的重用。

相關文章

  • 正則中的回溯定義與用法分析【JS與java實現(xiàn)】

    正則中的回溯定義與用法分析【JS與java實現(xiàn)】

    這篇文章主要介紹了正則中的回溯定義與用法,結合實例形式分析了回溯的概念、功能并提供了JS與java實現(xiàn)方法,需要的朋友可以參考下
    2016-12-12
  • javascript操作cookie

    javascript操作cookie

    本文主要介紹了js對cookie的操作:js設置cookie;js獲取cookie;給cookie設置終止日期;刪除cookie 等,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • JavaScript動態(tài)操作表格實例(添加,刪除行,列及單元格)

    JavaScript動態(tài)操作表格實例(添加,刪除行,列及單元格)

    這篇文章主要是對JavaScript動態(tài)操作表格實例(添加,刪除行,列及單元格)進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11
  • 在JavaScript中call()與apply()區(qū)別

    在JavaScript中call()與apply()區(qū)別

    這篇文章主要介紹了在JavaScript中call()與apply()區(qū)別 的相關資料,需要的朋友可以參考下
    2016-01-01
  • js中document.referrer實現(xiàn)移動端返回上一頁

    js中document.referrer實現(xiàn)移動端返回上一頁

    本文主要介紹了document.referrer實現(xiàn)移動端返回上一頁的方法,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 獲取表單控件原始(初始)值的方法

    獲取表單控件原始(初始)值的方法

    獲取表單控件原始值在某些時候還是比較實用的,具體的獲取方法如下,感興趣的朋友可以參考下,希望對大家有所幫助
    2013-08-08
  • 前端axios下載excel文件(二進制)的處理方法

    前端axios下載excel文件(二進制)的處理方法

    新接了項目,遇到這樣的需求,通過后端接口下載excel文件,后端沒有文件地址,返回二進制流文件。接下來通過實例代碼給大家分享前端axios下載excel文件(二進制)的處理方法,一起看看吧
    2018-07-07
  • js實現(xiàn)旋轉大風車

    js實現(xiàn)旋轉大風車

    這篇文章主要為大家詳細介紹了js實現(xiàn)旋轉大風車,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 微信小程序實現(xiàn)短信登錄的實戰(zhàn)

    微信小程序實現(xiàn)短信登錄的實戰(zhàn)

    項目要求增加短信登錄及人臉識別登錄功能,本文就來實現(xiàn)一下 短信登錄功能,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • javascript實現(xiàn)生成并下載txt文件方式

    javascript實現(xiàn)生成并下載txt文件方式

    這篇文章主要介紹了javascript實現(xiàn)生成并下載txt文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論