摘要:事件與節(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-W或COMMAND-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、ctrl、alt和meta(Mac 上的command)之類的修飾按鍵會(huì)像普通按鍵一樣產(chǎn)生事件。但在查找組合鍵時(shí),你也可以查看鍵盤和鼠標(biāo)事件的shiftKey、ctrlKey、altKey和metaKey屬性來判斷這些鍵是否被按下。
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í),可以鍵入的元素(例如和標(biāo)簽)觸發(fā)"input"事件。為了獲得輸入的實(shí)際內(nèi)容,最好直接從焦點(diǎn)字段中讀取它。 第 18 章將展示如何實(shí)現(xiàn)。
指針事件目前有兩種廣泛使用的方式,用于指向屏幕上的東西:鼠標(biāo)(包括類似鼠標(biāo)的設(shè)備,如觸摸板和軌跡球)和觸摸屏。 它們產(chǎn)生不同類型的事件。
鼠標(biāo)點(diǎn)擊點(diǎn)擊鼠標(biāo)按鍵會(huì)觸發(fā)一系列事件。"mousedown"事件和"mouseup"事件類似于"keydown"和"keyup"事件,當(dāng)鼠標(biāo)按鈕按下或釋放時(shí)觸發(fā)。當(dāng)事件發(fā)生時(shí),由鼠標(biāo)指針下方的 DOM 節(jié)點(diǎn)觸發(fā)事件。
在mouseup事件后,包含鼠標(biāo)按下與釋放的特定節(jié)點(diǎn)會(huì)觸發(fā)"click"事件。例如,如果我在一個(gè)段落上按下鼠標(biāo),移動(dòng)到另一個(gè)段落上釋放鼠標(biāo),"click"事件會(huì)發(fā)生在包含這兩個(gè)段落的元素上。
若兩次點(diǎn)擊事件觸發(fā)時(shí)機(jī)接近,則在第二次點(diǎn)擊事件之后,也會(huì)觸發(fā)"dbclick"(雙擊,double-click)事件。
為了獲得鼠標(biāo)事件觸發(fā)的精確信息,你可以查看事件中的clientX和clientY屬性,包含了事件相對(duì)于窗口左上角的坐標(biāo)(以像素為單位)。或pageX和pageY,它們相對(duì)于整個(gè)文檔的左上角(當(dāng)窗口被滾動(dòng)時(shí)可能不同)。
下面的代碼實(shí)現(xiàn)了簡單的繪圖程序。每次點(diǎn)擊文檔時(shí),會(huì)在鼠標(biāo)指針下添加一個(gè)點(diǎn)。還有一個(gè)稍微優(yōu)化的繪圖程序,請(qǐng)參見第 19 章。
鼠標(biāo)移動(dòng)
每次鼠標(biāo)移動(dòng)時(shí)都會(huì)觸發(fā)"mousemove"事件。該事件可用于跟蹤鼠標(biāo)位置。當(dāng)實(shí)現(xiàn)某些形式的鼠標(biāo)拖拽功能時(shí),該事件非常有用。
舉一個(gè)例子,下面的程序展示一條欄,并設(shè)置一個(gè)事件處理器,當(dāng)向左拖動(dòng)這個(gè)欄時(shí),會(huì)使其變窄,若向右拖動(dòng)則變寬。
Drag the bar to change its width:
請(qǐng)注意,mousemove處理器注冊(cè)在窗口對(duì)象上。即使鼠標(biāo)在改變窗口尺寸時(shí)在欄外側(cè)移動(dòng),只要按住按鈕,我們?nèi)匀幌胍缕浯笮 ?/p>
釋放鼠標(biāo)按鍵時(shí),我們必須停止調(diào)整欄的大小。 為此,我們可以使用buttons屬性(注意復(fù)數(shù)形式),它告訴我們當(dāng)前按下的按鍵。 當(dāng)它為零時(shí),沒有按下按鍵。 當(dāng)按鍵被按住時(shí),其值是這些按鍵的代碼總和 - 左鍵代碼為 1,右鍵為 2,中鍵為 4。 這樣,您可以通過獲取buttons的剩余值及其代碼,來檢查是否按下了給定按鍵。
請(qǐng)注意,這些代碼的順序與button使用的順序不同,中鍵位于右鍵之前。 如前所述,一致性并不是瀏覽器編程接口的強(qiáng)項(xiàng)。
觸摸事件我們使用的圖形瀏覽器的風(fēng)格,是考慮到鼠標(biāo)界面的情況下而設(shè)計(jì)的,那個(gè)時(shí)候觸摸屏非常罕見。 為了使網(wǎng)絡(luò)在早期的觸摸屏手機(jī)上“工作”,在某種程度上,這些設(shè)備的瀏覽器假裝觸摸事件是鼠標(biāo)事件。 如果你點(diǎn)擊你的屏幕,你會(huì)得到"mousedown","mouseup"和"click"事件。
但是這種錯(cuò)覺不是很健壯。 觸摸屏與鼠標(biāo)的工作方式不同:它沒有多個(gè)按鈕,當(dāng)手指不在屏幕上時(shí)不能跟蹤手指(來模擬"mousemove"),并且允許多個(gè)手指同時(shí)在屏幕上。
鼠標(biāo)事件只涵蓋了簡單情況下的觸摸交互 - 如果您為按鈕添加"click"處理器,觸摸用戶仍然可以使用它。 但是像上一個(gè)示例中的可調(diào)整大小的欄在觸摸屏上不起作用。
觸摸交互觸發(fā)了特定的事件類型。 當(dāng)手指開始觸摸屏幕時(shí),您會(huì)看到"touchstart"事件。 當(dāng)它在觸摸中移動(dòng)時(shí),觸發(fā)"touchmove"事件。 最后,當(dāng)它停止觸摸屏幕時(shí),您會(huì)看到"touchend"事件。
由于許多觸摸屏可以同時(shí)檢測(cè)多個(gè)手指,這些事件沒有與其關(guān)聯(lián)的一組坐標(biāo)。 相反,它們的事件對(duì)象擁有touches屬性,它擁有一個(gè)類數(shù)組對(duì)象,每個(gè)對(duì)象都有自己的clientX,clientY,pageX和pageY屬性。
你可以這樣,在每個(gè)觸摸手指周圍顯示紅色圓圈。
Touch this page
您經(jīng)常希望在觸摸事件處理器中調(diào)用preventDefault,來覆蓋瀏覽器的默認(rèn)行為(可能包括在滑動(dòng)時(shí)滾動(dòng)頁面),并防止觸發(fā)鼠標(biāo)事件,您也可能擁有它的處理器。
滾動(dòng)事件每當(dāng)元素滾動(dòng)時(shí),會(huì)觸發(fā)scroll事件。該事件用處極多,比如知道用戶當(dāng)前查看的元素(禁用用戶視線以外的動(dòng)畫,或向邪惡的指揮部發(fā)送監(jiān)視報(bào)告),或展示一些滾動(dòng)的跡象(通過高亮表格的部分內(nèi)容,或顯示頁碼)。
以下示例在文檔上方繪制一個(gè)進(jìn)度條,并在您向下滾動(dòng)時(shí)更新它來填充:
將元素的position屬性指定為fixed時(shí),其行為和absolute很像,但可以防止在文檔滾動(dòng)時(shí)期跟著文檔一起滾動(dòng)。其效果是讓我們的進(jìn)度條呆在最頂上。 改變其寬度來指示當(dāng)前進(jìn)度。 在設(shè)置寬度時(shí),我們使用%而不是px作為單位,使元素的大小相對(duì)于頁面寬度。
innerHeight全局綁定是窗口高度,我們必須要減去滾動(dòng)條的高度。你點(diǎn)擊文檔底部的時(shí)候是無法繼續(xù)滾動(dòng)的。對(duì)于窗口高度來說,也存在innerWidth。使用pageYOffset(當(dāng)前滾動(dòng)位置)除以最大滾動(dòng)位置,并乘以 100,就可以得到進(jìn)度條長度。
調(diào)用滾動(dòng)事件的preventDefault無法阻止?jié)L動(dòng)。實(shí)際上,事件處理器是在進(jìn)行滾動(dòng)之后才觸發(fā)的。
焦點(diǎn)事件當(dāng)元素獲得焦點(diǎn)時(shí),瀏覽器會(huì)觸發(fā)其上的focus事件。當(dāng)失去焦點(diǎn)時(shí),元素會(huì)獲得blur事件。
與前文討論的事件不同,這兩個(gè)事件不會(huì)傳播。子元素獲得或失去焦點(diǎn)時(shí),不會(huì)激活父元素的處理器。
下面的示例中,文本域在擁有焦點(diǎn)時(shí)會(huì)顯示幫助文本。
Name:
Age:
當(dāng)用戶從瀏覽器標(biāo)簽或窗口移開時(shí),窗口對(duì)象會(huì)收到focus事件,當(dāng)移動(dòng)到標(biāo)簽或窗口上時(shí),則收到blur事件。
加載事件當(dāng)界面結(jié)束裝載時(shí),會(huì)觸發(fā)窗口對(duì)象和文檔body對(duì)象的"load"事件。該事件通常用于在當(dāng)整個(gè)文檔構(gòu)建完成時(shí),進(jìn)行初始化。請(qǐng)記住
將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ā)keydown和keyup事件。按下鼠標(biāo)按鈕時(shí),會(huì)觸發(fā)mousedown、mouseup和click事件。移動(dòng)鼠標(biāo)會(huì)觸發(fā)mousemove事件。觸摸屏交互會(huì)導(dǎo)致"touchstart","touchmove"和"touchend"事件。
我們可以通過scroll事件監(jiān)測(cè)滾動(dòng)行為,可以通過focus和blur事件監(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ì)定位、固定尺寸的 有許多方案可以實(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)卡來選擇一個(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)中插入大量元素,與每個(gè)子元素一一對(duì)應(yīng),按鈕文本從子節(jié)點(diǎn)的data-tabname中獲取。除了顯示一個(gè)初始子節(jié)點(diǎn),其他子節(jié)點(diǎn)都應(yīng)該隱藏(將display樣式設(shè)置成none),并通過點(diǎn)擊按鈕來選擇當(dāng)前顯示的節(jié)點(diǎn)。 當(dāng)它生效時(shí)將其擴(kuò)展,為當(dāng)前選中的選項(xiàng)卡,將按鈕的樣式設(shè)為不同的,以便明確選擇了哪個(gè)選項(xiàng)卡。 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105048.html
選項(xiàng)卡
摘要:相反,當(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...
摘要:來源編程精解中文第三版翻譯項(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 自豪地...
摘要:為了運(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...
摘要:在本例中,使用屬性指定鏈接的目標(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 版)》 ...
摘要:來源編程精解中文第三版翻譯項(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...
閱讀 2267·2021-11-15 11:38
閱讀 1218·2021-09-06 15:02
閱讀 3475·2021-08-27 13:12
閱讀 1460·2019-08-30 14:20
閱讀 2457·2019-08-29 15:08
閱讀 710·2019-08-29 14:08
閱讀 1775·2019-08-29 13:43
閱讀 1571·2019-08-26 12:11