≪ Today I learned.
RSS購読
    公開日
    タグ
    JavaScript
    著者
    ダーシノ

    コピーした要素のスタイルや属性を含めて貼り付ける

    GitHubでコミットやIssueのリンクをコピー(Ctrl+C/Command+C)して、テキストエリアに貼り付ける(Ctrl+V/Command+V)と[リンクテキスト](URL)のような形式で貼り付けられる。

    他にもWebページの要素をコピーして、リッチテキストエディタなどに貼り付けるとスタイルも一緒に貼り付けられる。

    これらはClipboardEvent#clipboardDataのデータを読み取ることで実現可能だ。

    const testarea = document.querySelector('#textarea')
    
    testarea.addEventListener('paste', (e) => {
      const transfer = e.clipboardData
      if (transfer === null) { return }
    
      // クリップボードからプレーンテキストとHTMLを取得する
      const plainText = transfer.getData('text/plain')
      const htmlText = transfer.getData('text/html')
    
      // テキストのHTMLをパースする
      const parser = new DOMParser()
      const doc = parser.parseFromString(htmlText, 'text/html')
      const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_ELEMENT)
    
      // パースしたHTMLのNodeをひとつずつチェックする
      let currentNode = walker.firstChild()
      while(currentNode) {
        // リンクだったらテキストの値をhref(URL)に書き換える
        if (isLink(currentNode)) {
            currentNode.textContent = currentNode.getAttribute('href')
        }
        
        currentNode = walker.nextNode()
      }
    
      // 書き換えた内容をtextareaに設定する
      e.target.value = doc.body.textContent || ''
      e.preventDefault()
    })
    
    function isLink(node) {
      return node.tagName.toLowerCase() === 'a' && node.hasAttribute('href')
    }

    デモ

    このリンクテキストをコピーしてください