整合營銷服務商

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

          免費咨詢熱線:

          我再也不敢說我會寫前端 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() 為某個按鈕賦予焦點。


          主站蜘蛛池模板: 福利电影一区二区| 亚洲一区在线视频观看| 中文字幕精品无码一区二区| 一区二区三区四区精品视频| 国产成人无码aa精品一区| 国产成人精品无人区一区| 日本一道高清一区二区三区| 精品一区二区无码AV| 在线视频一区二区| 日本不卡一区二区视频a| 国产第一区二区三区在线观看| 国产伦精品一区二区三区女| 人妻AV一区二区三区精品| 久久99精品波多结衣一区| 任你躁国产自任一区二区三区| 日韩一区二区免费视频| 精产国品一区二区三产区| 欧美一区内射最近更新| 亚洲av成人一区二区三区观看在线 | 熟妇人妻系列av无码一区二区| 国产激情一区二区三区在线观看 | 久久99精品波多结衣一区| 久久精品一区二区三区资源网| 韩日午夜在线资源一区二区| 精品一区二区三区视频在线观看| 日本一区二区三区在线观看视频| 国产精品福利一区二区| 无码人妻aⅴ一区二区三区| 免费一本色道久久一区| 亚洲无码一区二区三区| 无码中文人妻在线一区| 国精产品999一区二区三区有限 | 国产在线无码视频一区二区三区| 99久久精品国产免看国产一区| 免费一区二区无码东京热| 国产精品无码一区二区三级| 亚洲视频一区网站| 国产婷婷色一区二区三区深爱网| 精品成人一区二区三区免费视频| 亚洲高清偷拍一区二区三区| 亚洲乱码一区二区三区在线观看 |