亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript 編程精解 中文第三版 十五、處理事件

Clect / 507人閱讀

摘要:事件與節(jié)點(diǎn)每個(gè)瀏覽器事件處理器被注冊(cè)在上下文中。事件對(duì)象雖然目前為止我們忽略了它,事件處理器函數(shù)作為對(duì)象傳遞事件對(duì)象。若事件處理器不希望執(zhí)行默認(rèn)行為通常是因?yàn)橐呀?jīng)處理了該事件,會(huì)調(diào)用事件對(duì)象的方法。

來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目

原文:Handling Events

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

自豪地采用谷歌翻譯

部分參考了《JavaScript 編程精解(第 2 版)》

你對(duì)你的大腦擁有控制權(quán),而不是外部事件。認(rèn)識(shí)到這一點(diǎn),你就找到了力量。

馬可·奧勒留,《沉思錄》

有些程序處理用戶的直接輸入,比如鼠標(biāo)和鍵盤動(dòng)作。這種輸入方式不是組織整齊的數(shù)據(jù)結(jié)構(gòu) - 它是一次一個(gè)地,實(shí)時(shí)地出現(xiàn)的,并且期望程序在發(fā)生時(shí)作出響應(yīng)。

事件處理器

想象一下,有一個(gè)接口,若想知道鍵盤上是否有一個(gè)鍵是否被按下,唯一的方法是讀取那個(gè)按鍵的當(dāng)前狀態(tài)。為了能夠響應(yīng)按鍵動(dòng)作,你需要不斷讀取鍵盤狀態(tài),以在按鍵被釋放之前捕捉到按下狀態(tài)。這種方法在執(zhí)行時(shí)間密集計(jì)算時(shí)非常危險(xiǎn),因?yàn)槟憧赡苠e(cuò)過按鍵事件。

一些原始機(jī)器可以像那樣處理輸入。有一種更進(jìn)一步的方法,硬件或操作系統(tǒng)發(fā)現(xiàn)按鍵時(shí)間并將其放入隊(duì)列中。程序可以周期性地檢查隊(duì)列,等待新事件并在發(fā)現(xiàn)事件時(shí)進(jìn)行響應(yīng)。

當(dāng)然,程序必須記得監(jiān)視隊(duì)列,并經(jīng)常做這種事,因?yàn)槿魏螘r(shí)候,按鍵被按下和程序發(fā)現(xiàn)事件之間都會(huì)使得軟件反應(yīng)遲鈍。該方法被稱為輪詢。大多數(shù)程序員更希望避免這種方法。

一個(gè)更好的機(jī)制是,系統(tǒng)在發(fā)生事件時(shí)主動(dòng)通知我們的代碼。瀏覽器實(shí)現(xiàn)了這種特性,支持我們將函數(shù)注冊(cè)為特定事件的處理器。

Click this document to activate the handler.

window綁定指向?yàn)g覽器提供的內(nèi)置對(duì)象。 它代表包含文檔的瀏覽器窗口。 調(diào)用它的addEventListener方法注冊(cè)第二個(gè)參數(shù),以便在第一個(gè)參數(shù)描述的事件發(fā)生時(shí)調(diào)用它。

事件與 DOM 節(jié)點(diǎn)

每個(gè)瀏覽器事件處理器被注冊(cè)在上下文中。在為整個(gè)窗口注冊(cè)處理器之前,我們?cè)?b>window對(duì)象上調(diào)用了addEventListener。 這種方法也可以在 DOM 元素和一些其他類型的對(duì)象上找到。 僅當(dāng)事件發(fā)生在其注冊(cè)對(duì)象的上下文中時(shí),才調(diào)用事件監(jiān)聽器。


No handler here.

示例代碼中將處理器附加到按鈕節(jié)點(diǎn)上。因此,點(diǎn)擊按鈕時(shí)會(huì)觸發(fā)并執(zhí)行處理器,而點(diǎn)擊文檔的其他部分則沒有反應(yīng)。

向節(jié)點(diǎn)提供onclick屬性也有類似效果。這適用于大多數(shù)類型的事件 - 您可以為屬性附加處理器,屬性名稱為前面帶有on的事件名稱。

但是一個(gè)節(jié)點(diǎn)只能有一個(gè)onclick屬性,所以你只能用這種方式為每個(gè)節(jié)點(diǎn)注冊(cè)一個(gè)處理器。 addEventListener方法允許您添加任意數(shù)量的處理器,因此即使元素上已經(jīng)存在另一個(gè)處理器,添加處理器也是安全的。

removeEventListener方法將刪除一個(gè)處理器,使用類似于addEventListener的參數(shù)調(diào)用。


賦予removeEventListener的函數(shù)必須是賦予addEventListener的完全相同的函數(shù)值。 因此,要注銷一個(gè)處理其,您需要為該函數(shù)提供一個(gè)名稱(在本例中為once),以便能夠?qū)⑾嗤暮瘮?shù)值傳遞給這兩個(gè)方法。

事件對(duì)象

雖然目前為止我們忽略了它,事件處理器函數(shù)作為對(duì)象傳遞:事件(Event)對(duì)象。這個(gè)對(duì)象持有事件的額外信息。例如,如果我們想知道哪個(gè)鼠標(biāo)按鍵被按下,我們可以查看事件對(duì)象的which屬性。


存儲(chǔ)在各種類型事件對(duì)象中的信息是有差別的。隨后本章將會(huì)討論許多類型的事件。對(duì)象的type屬性一般持有一個(gè)字符串,表示事件(例如"click""mousedown")。

傳播

對(duì)于大多數(shù)事件類型,在具有子節(jié)點(diǎn)的節(jié)點(diǎn)上注冊(cè)的處理器,也將接收發(fā)生在子節(jié)點(diǎn)中的事件。若點(diǎn)擊一個(gè)段落中的按鈕,段落的事件處理器也會(huì)收到點(diǎn)擊事件。

但若段落和按鈕都有事件處理器,則先執(zhí)行最特殊的事件處理器(按鈕的事件處理器)。也就是說事件向外傳播,從觸發(fā)事件的節(jié)點(diǎn)到其父節(jié)點(diǎn),最后直到文檔根節(jié)點(diǎn)。最后,當(dāng)某個(gè)特定節(jié)點(diǎn)上注冊(cè)的所有事件處理器按其順序全部執(zhí)行完畢后,窗口對(duì)象的事件處理器才有機(jī)會(huì)響應(yīng)事件。

事件處理器任何時(shí)候都可以調(diào)用事件對(duì)象的stopPropagation方法,阻止事件進(jìn)一步傳播。該方法有時(shí)很實(shí)用,例如,你將一個(gè)按鈕放在另一個(gè)可點(diǎn)擊元素中,但你不希望點(diǎn)擊該按鈕會(huì)激活外部元素的點(diǎn)擊行為。

下面的示例代碼將mousedown處理器注冊(cè)到按鈕和其外部的段落節(jié)點(diǎn)上。在按鈕上點(diǎn)擊鼠標(biāo)右鍵,按鈕的處理器會(huì)調(diào)用stopPropagation,調(diào)度段落上的事件處理器執(zhí)行。當(dāng)點(diǎn)擊鼠標(biāo)其他鍵時(shí),兩個(gè)處理器都會(huì)執(zhí)行。

A paragraph with a .

大多數(shù)事件對(duì)象都有target屬性,指的是事件來源節(jié)點(diǎn)。你可以根據(jù)該屬性防止無意中處理了傳播自其他節(jié)點(diǎn)的事件。

我們也可以使用target屬性來創(chuàng)建出特定類型事件的處理網(wǎng)絡(luò)。例如,如果一個(gè)節(jié)點(diǎn)中包含了很長的按鈕列表,比較方便的處理方式是在外部節(jié)點(diǎn)上注冊(cè)一個(gè)點(diǎn)擊事件處理器,并根據(jù)事件的target屬性來區(qū)分用戶按下了哪個(gè)按鈕,而不是為每個(gè)按鈕都注冊(cè)獨(dú)立的事件處理器。




默認(rèn)動(dòng)作

大多數(shù)事件都有與其關(guān)聯(lián)的默認(rèn)動(dòng)作。若點(diǎn)擊鏈接,就會(huì)跳轉(zhuǎn)到鏈接目標(biāo)。若點(diǎn)擊向下的箭頭,瀏覽器會(huì)向下翻頁。若右擊鼠標(biāo),可以得到一個(gè)上下文菜單等。

對(duì)于大多數(shù)類型的事件,JavaScript 事件處理器會(huì)在默認(rèn)行為發(fā)生之前調(diào)用。若事件處理器不希望執(zhí)行默認(rèn)行為(通常是因?yàn)橐呀?jīng)處理了該事件),會(huì)調(diào)用preventDefault事件對(duì)象的方法。

你可以實(shí)現(xiàn)你自己的鍵盤快捷鍵或交互式菜單。你也可以干擾用戶期望的行為。例如,這里實(shí)現(xiàn)一個(gè)無法跳轉(zhuǎn)的鏈接。

MDN

除非你有非常充足的理由,否則不要這樣做。當(dāng)預(yù)期的行為被打破時(shí),使用你的頁面的人會(huì)感到不快。

在有些瀏覽器中,你完全無法攔截某些事件。比如在 Chrome 中,關(guān)閉鍵盤快捷鍵(CTRL-WCOMMAND-W)無法由 JavaScript 處理。

按鍵事件

當(dāng)按下鍵盤上的按鍵時(shí),瀏覽器會(huì)觸發(fā)"keydown"事件。當(dāng)松開按鍵時(shí),會(huì)觸發(fā)"keyup"事件。

This page turns violet when you hold the V key.

盡管從keydown這個(gè)事件名上看應(yīng)該是物理按鍵按下時(shí)觸發(fā),但當(dāng)持續(xù)按下某個(gè)按鍵時(shí),會(huì)循環(huán)觸發(fā)該事件。有時(shí),你想謹(jǐn)慎對(duì)待它。例如,如果您在按下某個(gè)按鍵時(shí)向 DOM 添加按鈕,并且在釋放按鍵時(shí)再次將其刪除,則可能會(huì)在按住某個(gè)按鍵的時(shí)間過長時(shí),意外添加數(shù)百個(gè)按鈕。

該示例查看了事件對(duì)象的key屬性,來查看事件關(guān)于哪個(gè)鍵。 該屬性包含一個(gè)字符串,對(duì)于大多數(shù)鍵,它對(duì)應(yīng)于按下該鍵時(shí)將鍵入的內(nèi)容。 對(duì)于像Enter這樣的特殊鍵,它包含一個(gè)用于命名鍵的字符串(在本例中為"Enter")。 如果你按住一個(gè)鍵的同時(shí)按住Shift鍵,這也可能影響鍵的名稱 - "v"變?yōu)?b>"V","1"可能變成"!",這是按下Shift-1鍵 在鍵盤上產(chǎn)生的東西。

諸如shift、ctrlaltmeta(Mac 上的command)之類的修飾按鍵會(huì)像普通按鍵一樣產(chǎn)生事件。但在查找組合鍵時(shí),你也可以查看鍵盤和鼠標(biāo)事件的shiftKey、ctrlKeyaltKeymetaKey屬性來判斷這些鍵是否被按下。

Press Ctrl-Space to continue.

按鍵事件發(fā)生的 DOM 節(jié)點(diǎn)取決于按下按鍵時(shí)具有焦點(diǎn)的元素。 大多數(shù)節(jié)點(diǎn)不能擁有焦點(diǎn),除非你給他們一個(gè)tabindex屬性,但像鏈接,按鈕和表單字段可以。 我們將在第 18 章中回顧表單字段。 當(dāng)沒有特別的焦點(diǎn)時(shí),document.body充當(dāng)按鍵事件的目標(biāo)節(jié)點(diǎn)。

當(dāng)用戶鍵入文本時(shí),使用按鍵事件來確定正在鍵入的內(nèi)容是有問題的。 某些平臺(tái),尤其是 Android 手機(jī)上的虛擬鍵盤,不會(huì)觸發(fā)按鍵事件。 但即使你有一個(gè)老式鍵盤,某些類型的文本輸入也不能直接匹配按鍵,例如其腳本不適合鍵盤的人所使用的 IME(“輸入法編輯器”)軟件 ,其中組合多個(gè)熱鍵來創(chuàng)建字符。

要注意什么時(shí)候輸入了內(nèi)容,每當(dāng)用戶更改其內(nèi)容時(shí),可以鍵入的元素(例如

undefined傳遞給clearTimeout或在一個(gè)已結(jié)束的定時(shí)器上調(diào)用clearTimeout是沒有效果的。因此,我們不需要關(guān)心何時(shí)調(diào)用該方法,只需要每個(gè)事件中都這樣做即可。

如果我們想要保證每次響應(yīng)之間至少間隔一段時(shí)間,但不希望每次事件發(fā)生時(shí)都重置定時(shí)器,而是在一連串事件連續(xù)發(fā)生時(shí)能夠定時(shí)觸發(fā)響應(yīng),那么我們可以使用一個(gè)略有區(qū)別的方法來解決問題。例如,我們想要響應(yīng)"mousemove"事件來顯示當(dāng)前鼠標(biāo)坐標(biāo),但頻率只有 250ms。

本章小結(jié)

事件處理器可以檢測(cè)并響應(yīng)發(fā)生在我們的 Web 頁面上的事件。addEventListener方法用于注冊(cè)處理器。

每個(gè)事件都有標(biāo)識(shí)事件的類型(keydown、focus等)。大多數(shù)方法都會(huì)在特定 DOM 元素上調(diào)用,接著向其父節(jié)點(diǎn)傳播,允許每個(gè)父元素的處理器都能處理這些事件。

JavaScript 調(diào)用事件處理器時(shí),會(huì)傳遞一個(gè)包含事件額外信息的事件對(duì)象。該對(duì)象也有方法支持停止進(jìn)一步傳播(stopPropagation),也支持阻止瀏覽器執(zhí)行事件的默認(rèn)處理器(preventDefault)。

按下鍵盤按鍵時(shí)會(huì)觸發(fā)keydownkeyup事件。按下鼠標(biāo)按鈕時(shí),會(huì)觸發(fā)mousedownmouseupclick事件。移動(dòng)鼠標(biāo)會(huì)觸發(fā)mousemove事件。觸摸屏交互會(huì)導(dǎo)致"touchstart","touchmove""touchend"事件。

我們可以通過scroll事件監(jiān)測(cè)滾動(dòng)行為,可以通過focusblur事件監(jiān)控焦點(diǎn)改變。當(dāng)文檔完成加載后,會(huì)觸發(fā)窗口的load事件。

習(xí)題 氣球

編寫一個(gè)顯示氣球的頁面(使用氣球 emoji,ud83cudf88)。 當(dāng)你按下上箭頭時(shí),它應(yīng)該變大(膨脹)10%,而當(dāng)你按下下箭頭時(shí),它應(yīng)該縮小(放氣)10%。

您可以通過在其父元素上設(shè)置font-size CSS 屬性(style.fontSize)來控制文本大?。╡moji 是文本)。 請(qǐng)記住在該值中包含一個(gè)單位,例如像素(10px)。

箭頭鍵的鍵名是"ArrowUp""ArrowDown"。確保按鍵只更改氣球,而不滾動(dòng)頁面。

實(shí)現(xiàn)了之后,添加一個(gè)功能,如果你將氣球吹過一定的尺寸,它就會(huì)爆炸。 在這種情況下,爆炸意味著將其替換為“爆炸 emoji,ud83dudca5”,并且移除事件處理器(以便您不能使爆炸變大變?。?/p>

💥

鼠標(biāo)軌跡

在 JavaScript 早期,有許多主頁都會(huì)在頁面上使用大量的動(dòng)畫,人們想出了許多該語言的創(chuàng)造性用法。

其中一種是“鼠標(biāo)蹤跡”,也就是一系列的元素,隨著你在頁面上移動(dòng)鼠標(biāo),它會(huì)跟著你的鼠標(biāo)指針。

在本習(xí)題中實(shí)現(xiàn)鼠標(biāo)軌跡的功能。使用絕對(duì)定位、固定尺寸的

元素,背景為黑色(請(qǐng)參考鼠標(biāo)點(diǎn)擊一節(jié)中的示例)。創(chuàng)建一系列此類元素,當(dāng)鼠標(biāo)移動(dòng)時(shí),伴隨鼠標(biāo)指針顯示它們。

有許多方案可以實(shí)現(xiàn)我們所需的功能。你可以根據(jù)你的需要實(shí)現(xiàn)簡單的或復(fù)雜的方法。簡單的解決方案是保存固定鼠標(biāo)的軌跡元素并循環(huán)使用它們,每次mousemove事件觸發(fā)時(shí)將下一個(gè)元素移動(dòng)到鼠標(biāo)當(dāng)前位置。



選項(xiàng)卡

選項(xiàng)卡面板廣泛用于用戶界面。它支持用戶通過選擇元素上方的很多突出的選項(xiàng)卡來選擇一個(gè)面板。

本習(xí)題中,你必須實(shí)現(xiàn)一個(gè)簡單的選項(xiàng)卡界面。編寫asTabs函數(shù),接受一個(gè) DOM 節(jié)點(diǎn)并創(chuàng)建選項(xiàng)卡界面來展現(xiàn)該節(jié)點(diǎn)的子元素。該函數(shù)應(yīng)該在頂層節(jié)點(diǎn)中插入大量

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105048.html

相關(guān)文章

  • JavaScript 編程精解 中文三版 十九、項(xiàng)目:像素藝術(shù)編輯器

    摘要:相反,當(dāng)響應(yīng)指針事件時(shí),它會(huì)調(diào)用創(chuàng)建它的代碼提供的回調(diào)函數(shù),該函數(shù)將處理應(yīng)用的特定部分?;卣{(diào)函數(shù)可能會(huì)返回另一個(gè)回調(diào)函數(shù),以便在按下按鈕并且將指針移動(dòng)到另一個(gè)像素時(shí)得到通知。它們?yōu)榻M件構(gòu)造器的數(shù)組而提供。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Project: A Pixel Art Editor 譯者:飛龍 協(xié)議:CC BY-NC-SA 4...

    Meils 評(píng)論0 收藏0
  • JavaScript 編程精解 中文三版 零、前言

    摘要:來源編程精解中文第三版翻譯項(xiàng)目原文譯者飛龍協(xié)議自豪地采用谷歌翻譯部分參考了編程精解第版,這是一本關(guān)于指導(dǎo)電腦的書。在可控的范圍內(nèi)編寫程序是編程過程中首要解決的問題。我們可以用中文來描述這些指令將數(shù)字存儲(chǔ)在內(nèi)存地址中的位置。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地...

    sanyang 評(píng)論0 收藏0
  • JavaScript 編程精解 中文三版 二、程序結(jié)構(gòu)

    摘要:為了運(yùn)行包裹的程序,可以將這些值應(yīng)用于它們。在瀏覽器中,輸出出現(xiàn)在控制臺(tái)中。在英文版頁面上運(yùn)行示例或自己的代碼時(shí),會(huì)在示例之后顯示輸出,而不是在瀏覽器的控制臺(tái)中顯示。這被稱為條件執(zhí)行。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Program Structure 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《J...

    ThinkSNS 評(píng)論0 收藏0
  • JavaScript 編程精解 中文三版 十三、瀏覽器中的 JavaScript

    摘要:在本例中,使用屬性指定鏈接的目標(biāo),其中表示超文本鏈接。您應(yīng)該認(rèn)為和元數(shù)據(jù)隱式出現(xiàn)在示例中,即使它們沒有實(shí)際顯示在文本中。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:JavaScript and the Browser 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《JavaScript 編程精解(第 2 版)》 ...

    zhiwei 評(píng)論0 收藏0
  • JavaScript 編程精解 中文三版 一、值,類型和運(yùn)算符

    摘要:來源編程精解中文第三版翻譯項(xiàng)目原文譯者飛龍協(xié)議自豪地采用谷歌翻譯部分參考了編程精解第版在機(jī)器的表面之下,程序在運(yùn)轉(zhuǎn)。本章將會(huì)介紹程序當(dāng)中的基本元素,包括簡單的值類型以及值運(yùn)算符。示例中的乘法運(yùn)算符優(yōu)先級(jí)高于加法。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Values, Types, and Operators 譯者:飛龍 協(xié)議:CC BY-NC...

    wh469012917 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<