整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          我再也不敢說我會寫前端 Button組件「實踐」


          者:彭道寬

          https://juejin.im/post/5e8d4300f265da47f85de3db

          一篇文章Stimulus:連接HTML和JavaScript的橋梁,實現簡單的controller,并學習了Stimulus是如何連接HTML與JavaScript的。現在我們使用Stimulus來實現復制文本到粘貼板的按鈕。

          比如說,我們現在有一個需求,就是幫助用戶生成密碼,在密碼旁邊放置一個按鈕,點擊按鈕后密碼就被拷貝到粘貼板上了,這樣就方便用戶使用這個密碼了。

          打開public/index.html,修改body內容,填充一個簡單的按鈕,如下:

          <div>
              PIN: <input type="text" value="1234" readonly>
              <button>Copy to Clipboard</button>
          </div>



          下一步,創建src/controllers/clipboard_controller.js,然后添加一個copy()方法:

          import { Controller } from "@hotwired/stimulus"
          
          export default class extends Controller {
              copy() {
              }
          }

          然后,給div添加data-controller=“clipboard”。只要是給元素添加了data-controller屬性,Stimulus就會連接一個controller實例。

          <div data-controller="clipboard">

          我們還需要一個對輸入框的引用,這樣我們就可以在調用粘貼板API之前獲取輸入框的內容。給文本框添加data-clipboard-target=“source“:

          PIN: <input data-clipboard-target="source" type="text" value="1234" readonly>

          在controller中定義一個target,然后就可以通過this.sourceTarget訪問文本框了。

          import { Controller } from "@hotwired/stimulus"
          
          export default class extends Controller {
              static targets = [ "source" ]
              
              copy() {
              }
          }


          解釋一下這個targets:

          當Stimulus加載你的controller類時,它會查看靜態數組targets的字符串元素,對于每一個字符串,Stimulus會在controller中添加3個屬性。在這里,對于“source”,會添加如下屬性:

          this.sourceTarget 在controller的域內的第一個source

          this.sourceTargets 在controller的域內所有的source組成的一個數組

          this.hasSourceTarget 在controller的域內是否有source


          我們希望點擊按鈕時調用controller中的copy()方法,所以我們需要添加data-action=“clipboard#copy“

          <button data-action="clipboard#copy">Copy to Clipboard</button>

          你可以已經注意到在上面的動作描述符中省略了click->。那是因為Stimulus給button設置了click作為它默認的事件。


          某些其他元素也有默認事件。下面是個全部列表:

          元素

          默認事件

          a

          click

          button

          click

          details

          toggle

          form

          submit

          input

          input

          input type=“submit”

          click

          select

          change

          textarea

          input

          最終,在copy()方法中,我們獲取輸入框的內容,調用粘貼板API

          copy() {
              navigator.clipboard.writeText(this.sourceTarget.value)
          }


          刷新頁面,點擊按鈕,然后快捷鍵粘貼到Greet按鈕前到輸入框,可以看到1234。



          到目前為止,在頁面上同一時間只有一個controller實例。在頁面上同時有一個controller的多個實例也是很正常的。


          我們的controller是可以復用的,只要你需要在頁面上添加復制內容的按鈕,無論是哪個頁面,只要把對應的屬性值寫好,我們的controller都是生效的。


          還是上面的例子,再添加另外一個復制按鈕:

          <div data-controller="clipboard">
              PIN: <input data-clipboard-target="source" type="text" value="3737" readonly>
              <button data-action="clipboard#copy" class="clipboard-button">Copy to Clipboard</button>
          </div>


          刷新頁面,驗證一下兩個復制按鈕是否都生效。

          我們再添加一個可以復制的元素,不用button,我們用a標簽,

          <div data-controller="clipboard">
              PIN: <input data-clipboard-target="source" type="text" value="6666" readonly>
              <a href="#" data-action="clipboard#copy" class="clipboard-button">Copy to Clipboard</a>
          </div>



          Stimulus允許我們使用任何元素,只要它設置了合適的data-action屬性,就可以觸發復制。

          這個例子里,要注意一點,點擊鏈接會使瀏覽器追蹤a標簽內的href屬性跳轉,可以取消這種默認行為,只需要在action中調用 event.preventDefault()就可以了。

          copy(event) {
              event.preventDefault()    
              navigator.clipboard.writeText(this.sourceTarget.value)
          }


          還有另外一個方法,拷貝粘貼板上

          copy(event) {
              event.preventDefault()    
              this.sourceTarget.select()
              document.execCommand("copy")
          }


          在本文中,我們看了一個在現實中把瀏覽器API包裝在Stimulus的controller中的例子。還有一個controller的多個實例如何同時出現在頁面上,我們還探索了actions和targets如何保持HTML和JavaScript的松散耦合。


          下一篇文章,我們將優化一下這個復制粘貼板的功能,讓它運行起來更加健壯。

          Stimulus:瀏覽器不支持復制或者弱網條件下,怎么辦?

          utton 對象

          Button 對象代表 HTML 文檔中的一個按鈕。

          該元素沒有默認的行為,但是必須有一個 onclick 事件句柄以便使用。

          在 HTML 文檔中 <input type="button"> 標簽每出現一次,一個 Button 對象 就會被創建。

          您可以通過遍歷表單的 elements[] 數組來訪問某個按鈕,或者通過使用 document.getElementById()。


          Button 對象的屬性

          accessKey 設置或返回訪問按鈕的快捷鍵。

          alt 設置或返回當瀏覽器無法顯示按鈕時供顯示的替代文本。

          disabled 設置或返回是否禁用按鈕。

          form 返回對包含該按鈕的表單對象的引用。

          id 設置或返回按鈕的 id。

          name 設置或返回按鈕的名稱。

          tabIndex 設置或返回按鈕的 tab 鍵控制次序。

          type 返回按鈕的表單元素類型。

          value 設置或返回在按鈕上顯示的文本。


          標準屬性

          className 設置或返回元素的 class 屬性。

          dir 設置或返回文本的方向。

          lang 設置或返回元素的語言代碼。

          title 設置或返回元素的 title 屬性。

          Button 對象的方法

          blur() 把焦點從元素上移開。

          click() 在某個按鈕上模擬一次鼠標單擊。

          focus() 為某個按鈕賦予焦點。


          主站蜘蛛池模板: www一区二区三区| 国精产品999一区二区三区有限| 无码人妻一区二区三区av| 一区二区日韩国产精品| 久久久无码一区二区三区| 亚洲av片一区二区三区| 亚洲电影一区二区三区| 国产视频福利一区| 奇米精品视频一区二区三区| 一区二区三区免费精品视频| 精品一区二区三区在线播放视频 | 日韩精品在线一区二区| 国产精品无码一区二区在线观| 国产一区麻豆剧传媒果冻精品 | 在线观看国产一区二三区| 久久无码人妻精品一区二区三区| 亚洲av乱码一区二区三区按摩 | 少妇激情av一区二区| 搜日本一区二区三区免费高清视频| 色窝窝无码一区二区三区成人网站 | 亚洲AV午夜福利精品一区二区| 精品女同一区二区三区在线| AA区一区二区三无码精片| 无码一区二区三区在线观看| 亚洲一区二区三区免费| 日本一区二区三区在线网 | 色狠狠色噜噜Av天堂一区| 欧洲精品码一区二区三区免费看 | 一夲道无码人妻精品一区二区| 精品视频一区二区三区在线播放| 日本精品无码一区二区三区久久久| 无码人妻精品一区二区三区久久 | 国产一区二区三区免费观在线| 国产精品久久久久一区二区| 亚洲av乱码一区二区三区按摩| 无码人妻精品一区二区三区蜜桃| 免费无码一区二区三区| 精品人伦一区二区三区潘金莲| 久久久精品人妻一区亚美研究所 | 亚洲一区二区三区高清在线观看 | 国产精品福利一区二区久久|