<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java事件處理,低級事件類型:鍵盤事件+焦點事件,你真的懂嗎?

          共 9351字,需瀏覽 19分鐘

           ·

          2022-06-12 10:58

          低級事件類型

          在本節(jié)中,將詳細討論與具體用戶界面組件無關(guān),但與敲擊鍵盤和活動鼠標(biāo)有關(guān)的事件。下一章將詳細討論有關(guān)由用戶界面組件產(chǎn)生的語義事件。

          鍵盤事件

          當(dāng)用戶按下鍵盤上的一個鍵時,就會產(chǎn)生一個ID為KEY_PRESSED的KeyEvent事件。當(dāng)用戶釋放一個鍵時,將會觸發(fā)ID為KEY_RELEASED的KeyEvent事件??梢允褂脤崿F(xiàn)了KeyListener接口的任意類的KeyPressed和KeyReleased方法處理這些事件。這兩個方法可以捕獲敲擊鍵盤的事件。將這兩個方法組合起來就形成了第三個方法KeyTyped,它可以報告由用戶敲擊鍵盤所產(chǎn)生的字符。

          講述鍵盤事件處理過程的最好方法是舉例說明。但在此之前,先要介紹幾個術(shù)語。Java明確區(qū)分字符和虛擬鍵碼(virtual key code)。虛擬鍵碼用前綴VK_表示,例如,VK_A或VK_SHIFT。虛擬鍵碼與鍵盤上的鍵一一對應(yīng)。例如,VK_A表示被標(biāo)記為A的鍵。虛擬鍵碼沒有單獨的小寫鍵,即鍵盤沒有單獨的小寫鍵。

          注意:虛擬鍵碼涉及“掃描碼”,這是在按下一個物理鍵或釋放一個物理鍵時,鍵盤向計算機發(fā)送的編碼。

          假設(shè)用戶采用按下SHIFT鍵的同時按下A鍵的方式鍵入大寫字母A。為了響應(yīng)這個用戶動作,Java將會產(chǎn)生5個事件,下面是動作和相關(guān)的事件:

          1)按下SHIFT鍵(為VK_SHIFT調(diào)用keyPressed)。

          2)按下A鍵(為VK_A調(diào)用keyPressed)。

          3)鍵入“A”(為“A”調(diào)用keyTyped)。

          4)釋放A鍵(為VK_A調(diào)用keyReleased)。

          5)釋放SHIFT鍵(為VK_SHIFT調(diào)用keyReleased)。

          另一方面,如果用戶只是按下A鍵來鍵入小寫字母“a”,那么只產(chǎn)生3個事件:

          1)按下A鍵(為VK_A調(diào)用keyPressed)。

          2)鍵入“a”(為“a”調(diào)用keyTyped)。

          3)釋放A鍵(為VK_A調(diào)用keyReleased)。

          因此,keyTyped過程報告鍵入的字符(“A”或“a”),而keyPressed和keyReleased方法報告用戶按下的實際鍵。

          為了能夠讓keyPressed和keyReleased方法執(zhí)行,首先需要檢查鍵碼(key code)。


          鍵碼等于下列(有利于記憶的)常量之一。它們都定義在KeyEvent類中。


          為了查明SHIFT、CONTROL、ALT和META鍵的當(dāng)前狀態(tài),當(dāng)然可以跟蹤VK_SHIFT、VK_CONTROL、VK_ALT和VK_META鍵是否被按下,但是這樣做很麻煩。另外,可以使用sShiftDown、isControlDown、isAltDown和isMetaDown方法。(Sun和Macintosh鍵盤有一個專門的META鍵。在Sun鍵盤上,這個按鍵標(biāo)記為菱形。在Macintosh鍵盤上,這個按鍵用一個蘋果或苜蓿葉標(biāo)記。)

          例如,下列代碼檢測用戶是否按下SHIFT+“→”:


          在keyTyped方法中,調(diào)用getKeyChar方法得到鍵入的實際字符。

          注意:并不是所有的敲擊鍵盤都會產(chǎn)生ketTyped調(diào)用。只有那些產(chǎn)生Unicode字符的敲擊才能夠在keyTyped方法中捕獲??梢允褂胟eyPressed方法檢查光標(biāo)鍵和其他命令鍵。

          例8-3給出了處理敲擊鍵盤事件的方式。這個程序(如圖8-7所示)是Etch-A-Sketch?玩具的簡單實現(xiàn)。


          用戶可以利用光標(biāo)鍵,向上、下、左、右移動畫筆。如果向下的同時按下SHIFT鍵,畫筆移動的增量比較大。如果你熟悉vi編輯器,就可以使用小寫字母h、j、k和l鍵代替光標(biāo)鍵來移動畫筆;大寫H、J、K和L將更大增量地移動畫筆。在這里用keyPressed方法捕獲光標(biāo)鍵,用keyTyped方法捕獲字符。

          這里有一個技巧:通常,面板不接受任何鍵盤事件。因此,可以調(diào)用setFocusable方法對默認情形進行覆蓋。本章稍后將討論鍵盤焦點的概念。

          例8-3 Sketch.java






          java.awt.event.KeyEvent?1.1

          ? char getKeyChar( )

          返回用戶鍵入的字符。

          ? int getKeyCode( )

          返回該鍵盤事件的虛擬鍵碼。

          ? boolean isActionKey( )

          如果事件中的鍵是一個“動作”鍵,返回true。下面列出的是動作鍵:HOME、END、PAGE UP、PAGE DOWN、UP、DOWN、LEFT、RIGHT、F1. . .F24、PRINT SCREEN、SCROLL LOCK、CAPS LOCK、NUM LOCK、PAUSE、INSERT、DELETE、ENTER、BACKSPACE、DELETE和TAB。

          ? static String getKeyText(int keyCode)

          返回描述鍵碼的字符串。例如,getKeyText(KeyEvent VK_END)返回字符串"End"。

          ? static String getKeyModifiersText(int modifiers)

          返回描述SHIFT或CTRL+SHIFT這類修飾符鍵的字符串。

          參數(shù):modifiers

          修飾符狀態(tài),由getModifiers報告

          java.awt.event.InputEvent?1.1

          ? int getModifiers( )

          返回一個整型數(shù)值,它用位描述SHIFT、CONTROL、ALL和META修飾符的狀態(tài)。這個方法

          既可以應(yīng)用于鍵盤事件,也可以應(yīng)用于鼠標(biāo)事件。要想檢測某一位是否被設(shè)置,可以測試返回值

          是否對應(yīng)于位掩碼SHIFT_MASK、CTRL_MASK、ALT_MASK、ALT_GRAPH_MASK、

          META_MASK或調(diào)用下列某一個方法。

          ? boolean isShiftDown( )

          ? boolean isControlDown( )

          ? boolean isAltDown( )

          ? boolean isAltGraphDown( )?1.2

          ? boolean isMetaDown( )

          在事件發(fā)生時,如果某個修飾符鍵被按下,方法返回true。

          鼠標(biāo)事件

          如果只希望用戶能夠點擊按鈕或菜單,就不需要顯式地處理鼠標(biāo)事件。鼠標(biāo)操作將由用戶界面中的各種組件內(nèi)部處理,并轉(zhuǎn)換成對應(yīng)的語義事件。然而,如果希望用戶使用鼠標(biāo)畫圖,就需要捕獲鼠標(biāo)移動點擊和拖動事件。

          在本節(jié)中,將展示一個簡單的圖形編輯器應(yīng)用程序,它允許用戶在畫布上(如圖8-8所示)放置、移動和擦除方塊。


          當(dāng)用戶點擊鼠標(biāo)按鈕時,將會調(diào)用三個監(jiān)聽器方法:鼠標(biāo)第一次被按下時調(diào)用mousePressed;鼠標(biāo)被釋放時調(diào)用mouseReleased;最后調(diào)用mouseClicked。如果只對最終的點擊事件感興趣,就可以忽略前兩個方法。用MouseEvent類對象作為參數(shù),調(diào)用getX和getY方法可以獲得鼠標(biāo)被按下時鼠標(biāo)指針?biāo)诘?em style="box-sizing: border-box;font-style: normal;font-weight: 400;margin: 0px;padding: 0px;border-width: 0px;border-style: initial;border-color: initial;">x和y坐標(biāo)。要想?yún)^(qū)分單擊、雙擊和三擊(!),需要使用getClickCount方法。

          有些用戶界面設(shè)計者喜歡讓用戶采用鼠標(biāo)點擊與鍵盤修飾符組合(例如,CONTROL+SHIFT+CLICK)的方式進行操作。我們感覺這并不是一種值得贊許的方式。如果對此持有不同的觀點,可以看看同時檢測鼠標(biāo)按鍵和鍵盤修飾符所帶來的混亂。在最初的API中,有兩個鼠標(biāo)按鈕的掩碼與兩個鍵盤修飾符的掩碼一樣,即

          BUTTON2_MASK == ALT_MASK

          BUTTON3_MASK == META_MASK

          這樣做是為了能夠讓用戶使用僅有一個按鈕的鼠標(biāo)通過按下修飾符鍵來模擬按下其他鼠標(biāo)鍵的操作。然而,在JDK 1.4中,建議使用一種不同的方式。有下列掩碼:

          BUTTON1_DOWN_MASK

          BUTTON2_DOWN_MASK

          BUTTON3_DOWN_MASK

          SHIFT_DOWN_MASK

          CTRL_DOWN_MASK

          ALT_DOWN_MASK

          ALT_GRAPH_DOWN_MASK

          META_DOWN_MASK

          getModifiersEx方法能夠準(zhǔn)確地報告鼠標(biāo)事件的鼠標(biāo)按鈕和鍵盤修飾符。

          需要注意,在Windows環(huán)境下,使用BUTTON3_DOWN_MASK檢測鼠標(biāo)右鍵(非主要的)的狀態(tài)。例如,可以使用下列代碼檢測鼠標(biāo)右鍵是否被按下:

          if ((event.getModifiersEx( )&InputEvent.BUTTON3_DOWN__MASK)! = )

          . . . //code for right click

          在列舉的簡單例子中,提供了mousePressed和mouseClicked方法。當(dāng)鼠標(biāo)點擊在所有小方塊的像素之外時,就會繪制一個新的小方塊。這個操作是在mousePressed方法中實現(xiàn)的,這樣可以讓用戶的操作立即得到響應(yīng),而不必等到釋放鼠標(biāo)按鍵。如果用戶在某個小方塊中雙擊鼠標(biāo),就會將它擦除。由于需要知道點擊次數(shù),所以這個操作是在mouseClick方法中實現(xiàn)。


          當(dāng)鼠標(biāo)在窗口上移動時,窗口將會收到一連串的鼠標(biāo)移動事件。大多數(shù)應(yīng)用程序忽略了這些事件。然而,我們給出的測試程序?qū)⒉东@這些事件,以便在光標(biāo)位于不同的小方塊之上時變成另外一種形狀(十字)。實現(xiàn)這項操作需要使用Cursor類中的getPredefinedCursor方法。表8-2列出了在Windows環(huán)境下,鼠標(biāo)的形狀和方法對應(yīng)的常量。(注意,有若干個光標(biāo)的形狀完全一樣,但在其他平臺上未必如此。)


          提示:可以在jre/lib/images/cursors目錄中找到光標(biāo)圖像。在文件cursors.properties中定義了光標(biāo)“熱點”。熱點是指示光標(biāo)引起動作的點。例如,如果光標(biāo)變成放大鏡形狀,熱點就是該鏡的中心。

          下面是例子程序中MouseMotionListener類的mouseMoved方法:


          注意:可以利用Toolkit類中的createCustomCursor方法自定義光標(biāo)類型:


          createCustomCursor的第一個參數(shù)指向光標(biāo)圖像。第二個參數(shù)給出了光標(biāo)的“熱點”偏移。第三個參數(shù)是一個描述光標(biāo)的字符串。這個字符串可以用于訪問性支持,例如,可以將光標(biāo)形式讀給視力受損或沒有在屏幕前面的人。

          如果用戶在移動鼠標(biāo)的同時按下鼠標(biāo),就會調(diào)用mouseMoved而不是調(diào)用mouseDragged。在測試應(yīng)用程序中,用戶可以用光標(biāo)拖動小方塊。在程序中,僅僅用拖動的矩形更新當(dāng)前光標(biāo)位置。

          然后,重新繪制畫布,以顯示新的鼠標(biāo)位置。


          注意:只有鼠標(biāo)在一個組件內(nèi)部停留才會調(diào)用mouseMoved方法。然而,即使鼠標(biāo)拖動到組件外面,mouseDragged方法也會被調(diào)用。

          還有兩個鼠標(biāo)事件方法:mouseEntered和mouseExited。這兩個方法是在鼠標(biāo)進入或移出組件時被調(diào)用。

          最后,解釋一下如何監(jiān)聽鼠標(biāo)事件。鼠標(biāo)點擊由mouseClick過程報告,它是MouseListener接口的一部分。由于大部分應(yīng)用程序僅對鼠標(biāo)點擊感興趣,而對鼠標(biāo)移動并不太感興趣,但鼠標(biāo)移動事件發(fā)生的頻率又很高,因此將鼠標(biāo)移動事件與拖動事件定義在一個稱為MouseMotionListener的獨立接口中。

          在例8-4的程序中,對兩種鼠標(biāo)事件類型都感興趣。這里定義了兩個內(nèi)部類:MouseHandler和MouseMotionHandler。MouseHandler類擴展于MouseAdapter類,這是因為它只定義了5個MouseListener方法中的兩個方法。MouseMotionHandler實現(xiàn)了MouseMotionListener接口,并定義了這個接口中的兩個方法。

          例8-4是這個程序的清單。

          例8-4 MouseTest.java







          java.awt.event.MouseEvent?1.1

          ? int getX( )

          ? int getY( )

          ? point getPoint( )

          返回事件發(fā)生時,事件源組件左上角的坐標(biāo)x(水平)和y(豎直),或點信息。

          ? void translatePoint(int x, int y)

          通過水平移動x單位,垂直移動y單位來轉(zhuǎn)換事件坐標(biāo)。

          ? int getClickCount( )

          返回與事件關(guān)聯(lián)的鼠標(biāo)連擊次數(shù)。(“連擊”所指定的時間間隔與具體系統(tǒng)有關(guān)。)

          java awt.event.InputEvent?1.1

          ? int getModifiersEx( )?1.4

          返回事件擴展的或“按下”(down)的修飾符。使用下面的掩碼值檢測返回值:

          BUTTON1_DOWN_MASK

          BUTTON2_DOWN_MASK

          BUTTON3_DOWN_MASK

          SHIFT_DOWN_MASK

          CTRL_DOWN_MASK

          ALT_DOWN_MASK

          ALT_GRAPH_DOWN_MASK

          META_DOWN_MASK

          ? static String getModifiersExText(int modifiers)?1.4

          返回用給定標(biāo)志集描述的擴展或“按下”(down)的修飾符字符串,例如“Shift+Button1”。

          java.awt.Toolkit?1.0

          ? public Cursor createCustomCursor(Image image, Point hotSpot, String name)?1.2

          創(chuàng)建一個新的定制光標(biāo)對象。

          參數(shù):image

          光標(biāo)活動時顯示的圖像

          hotSpot

          光標(biāo)熱點(箭頭的頂點或十字中心)

          name

          光標(biāo)的描述,用來支持特殊的訪問環(huán)境

          java.awt.Component?1.0

          ? public void setCursor(Cursor cursor)?1.1

          用光標(biāo)圖像設(shè)置給定光標(biāo)。

          焦點事件

          用鼠標(biāo)可以指向屏幕上的任何一個對象。但是在使用鍵盤輸入時,敲擊鍵盤必須定位于一個特定的屏幕對象。窗口管理器(window manager,例如,Windows或X Windows)直接將所有的擊鍵定位于活動窗口(active window)。通常,活動窗口用高亮度顯示的標(biāo)題欄進行區(qū)分。在任何時刻,只有一個窗口可以是活動的。

          現(xiàn)在假設(shè)活動窗口在一個Java程序控制之下。當(dāng)Java窗口接收到敲擊鍵盤的操作,并定位于某個特定的組件時,這個組件就具有了焦點(focus)。正像活動窗口可以采用某種方式進行辨別一樣,大多數(shù)的Swing組件在具有焦點的時候,也可以擁有一個明顯的提示。文本域會顯示閃爍的光標(biāo);按鈕上的標(biāo)簽周圍有一個矩形等等。當(dāng)文本域具有焦點的時候,可以將文本輸入到文本域中;當(dāng)按鈕有焦點的時候,可以通過敲擊空格鍵來“點擊”這個按鈕。

          在一個窗口中,最多只有一個組件擁有焦點。如果用戶點擊另一個組件,那么剛才擁有焦點的組件就會失去(lose)焦點,而被點擊的組件就會獲得焦點。用戶還可以使用TAB鍵在各個組件上輪流切換焦點。這樣可以遍歷到所有能夠接收輸入焦點的組件。在默認情況下,Swing組件按照放置在容器中的位置,從上到下,從左到右的順序遍歷。也可以改變焦點遍歷的順序,有關(guān)這個主題更加詳細的內(nèi)容請參閱下一章。

          幸運的是,大多數(shù)應(yīng)用程序程序員不必過分地為焦點處理而擔(dān)憂。在JDK 1.4之前,對組件焦點事件的捕獲主要用于核查錯誤與校驗數(shù)據(jù)。假設(shè)在一個文本域中包含信用卡號。當(dāng)用戶編輯完畢這個域,并將焦點移至另外一個域上時,就應(yīng)該捕獲失去焦點事件。如果信用卡號的格式不正確,就立即顯示一個錯誤消息,并將焦點返回到信用卡域上。然而,JDK 1.4有一個更加健壯、更加簡易的數(shù)據(jù)校驗機制。有關(guān)這部分內(nèi)容將在第9章中討論。

          有些組件,例如,標(biāo)簽和面板,在默認情況下無法得到焦點,這是因為它們主要用于裝飾或分組。如果希望編寫一個程序,能夠根據(jù)用戶的擊鍵操作在面板上繪制圖形,就要對默認處理進行覆蓋。在JDK 1.4中,可以通過簡單地調(diào)用下面這個方法達到目的。

          panel.setFocusable(true);

          注意:在舊版本的JDK中,要想達到同樣的效果,必須覆蓋組件的isFocusTraversable方法。

          然而,在舊版本的焦點實現(xiàn)中,獲得焦點與遍歷焦點在概念上是分開的。這種分離導(dǎo)致行為上的混淆,現(xiàn)在已經(jīng)被廢除。isFocusTraversable方法已經(jīng)不再提倡使用了。

          在本節(jié)的剩余部分,將討論焦點事件的詳細內(nèi)容,這些內(nèi)容完全可以等到需要精心設(shè)計焦點控制時再閱讀。

          在JDK 1.4中,可以很容易地發(fā)現(xiàn):

          ? 焦點擁有者,也就是擁有焦點的那個組件。

          ? 焦點窗口,也就是包含焦點擁有者的窗口。

          ? 活動窗口,也就是包含焦點擁有者的框架或?qū)υ捒颉?/p>

          焦點窗口通常與活動窗口是一樣的。只有在焦點擁有者包含在沒有框架修飾的頂層窗口(例如,彈出式菜單)中時才有所差別。

          為了得到這些信息,首先要獲得鍵盤焦點管理器:

          KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager( );

          然后,調(diào)用:

          Component owner = manager.getFocusOwner( );

          Window focused = manager.getFocusedWindow( );

          Window active = manager.getActiveWindow( ); //a frame or dialog

          為了能夠得到焦點變化的通知,需要將焦點監(jiān)聽器安裝到組件或窗口中。一個組件焦點監(jiān)聽器必須實現(xiàn)FocusListener接口及兩個方法focusGained和focusLost。當(dāng)組件獲得或失去焦點時將會觸發(fā)這兩個方法。這兩個方法都有一個FocusEvent類的參數(shù)。在這個類中有幾個很有用的方法。getComponent方法負責(zé)報告獲得或失去焦點的組件;isTemporary方法將在焦點發(fā)生臨時性地改變時返回true。臨時性的焦點改變是指組件臨時性地失去控制,但又可以自動地找回焦點。例如,當(dāng)用戶選擇不同的活動窗口時就會發(fā)生這種情況。只要用戶再次選擇當(dāng)前的窗口,同一個組件就會重新獲得焦點。

          JDK 1.4引入了窗口焦點事件的傳遞,為此,需要將WindowFocusListener添加到窗口,并實現(xiàn)windowGainedFocus和windowLostFocus方法。

          在JDK 1.4中,當(dāng)焦點轉(zhuǎn)移的時候,可以找到“對等物”組件或窗口。對等物是指在組件或窗口失去焦點時獲得焦點的組件或窗口。相反地,當(dāng)組件或窗口獲得焦點時,對等物是剛剛失去焦點的那個組件或窗口。FocusEvent類中的getOppositeComponent方法將報告對等組件,WindowEvent類中的getOppositeWindow方法將報告對等的窗口。

          可以通過調(diào)用Component類中的requestFocus方法,利用程序?qū)⒔裹c從一個組件移到另一個組件上。然而,如果組件沒有包含在當(dāng)前的焦點窗口中,其行為將與平臺有關(guān)。為了能夠讓程序員開發(fā)與平臺無關(guān)的代碼,JDK 1.4在Component類中增加了一個方法requestFocusInWindow。這個方法只有在組件包含在焦點窗口內(nèi)時才會成功。

          注意:不應(yīng)該在requestFocus或requestFocusInWindow返回true時就認定組件擁有焦點,而應(yīng)該等待FOCUS_GAINED事件的發(fā)送。

          注意:有些程序員覺得FOCUS_LOST事件有些混亂,并試圖在focusLost處理器中通過請求獲得焦點來阻止其他組件。然而,在這個時候,焦點已經(jīng)失去了。如果必須在一個特定的組件中捕獲焦點,就需要在KeyboardFocusManager中安裝“禁止改變監(jiān)聽器”,并禁用focusOwner屬性。有關(guān)禁用屬性的詳細介紹請參閱卷II第8章。

          java.awt.Component?1.0

          ? void requestFocus( )

          請求組件獲得焦點。

          ? boolean requestFocusInWindow( )?1.4

          請求組件獲得焦點。如果該組件沒有包含在焦點窗口內(nèi),返回true,或者請求由于其他原因請求沒有實現(xiàn),返回flase。

          ? void setFocusable(boolean b)?1.4

          ? boolean isFocusable( )?1.4

          設(shè)置或獲取該組件的“focusable”狀態(tài)。如果b為true,則該組件可以獲得焦點。

          ? boolean isFocusOwner( )?1.4

          如果該組件當(dāng)前擁有焦點,返回true。

          java.awt.KeyboardFocusManager?1.4

          ? static KeyboardFocusManager getCurrentKeyboardFocusManager( )

          獲得當(dāng)前焦點管理器。

          ? Component getFocusOwner( )

          得到擁有焦點的組件,如果焦點管理器沒有管理擁有焦點的組件,返回null。

          ? Window getFocusedWindow( )

          得到包含擁有焦點組件的窗口,如果焦點管理器沒有管理擁有焦點的組件,返回null。

          ? Window getActiveWindow( )

          得到對話框或包含焦點窗口的框架,如果焦點管理器沒有管理焦點窗口,返回null。

          java.awt.Window( )?1.0

          ? boolean isFocused( )?1.4

          如果該窗口是當(dāng)前的焦點窗口,返回true。

          ? boolean isActive( )?1.4

          如果該框架或?qū)υ捒蚴钱?dāng)前的活動窗口,返回true?;顒涌蚣芎蛯υ捒虻臉?biāo)題欄通常由窗口管理器標(biāo)識出來。

          java.awt.event.FocusEvent?1.1

          ? Component getOppositeComponent( )?1.4

          返回在focusGained處理器中失去焦點的組件,或者在focusLost處理器中獲得焦點的組件。

          java.awt.event.WindowEvent?1.4

          ? Window getOppositeWindow( )?1.4

          返回在windowGainedFocus處理器中丟失焦點的窗口,在windowLostFocus處理器中獲得焦點的窗口,在windowActivated處理器中變?yōu)椴换顒拥拇翱冢蛘咴趙indowDeactivated處理器中被激活的窗口。

          java.awt.event.WindowFocusListener?1.4

          ? void windowGainedFocus(WindowEvent event)

          當(dāng)事件源窗口獲得焦點時調(diào)用這個方法。

          ? void windowLostFocus(WindowEvent event)

          當(dāng)事件源窗口失去焦點時調(diào)用這個方法。

          覺得文章不錯的話,可以轉(zhuǎn)發(fā)關(guān)注一下小編,小編每天都會持續(xù)更新的!

          本文就是愿天堂沒有BUG給大家分享的內(nèi)容,大家有收獲的話可以分享下,想學(xué)習(xí)更多的話可以到微信公眾號里找我,我等你哦。


          瀏覽 69
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色婷婷五月天丁香 | 国产人妻人伦精品一区二区网站 | 国产做受 高潮游戏视频 | 日韩人妻久久亚洲 | 狠狠干欧美 |