js 自动复制粘贴navigator.clipboard

2,489 阅读1分钟

问题描述

想实现百度网盘淘宝那种带着黏贴进去会自动获取内容,然后进行后续业务操作。

实践

  • 通过监听事件粘贴事件(不能满足需求)
window.addEventListener("paste", function (e){
    if ( !(e.clipboardData && e.clipboardData.items) ) {
        return;
    }
});
  • 通过 navigator.clipboard 实现(兼容不好)

实现代码

jsx

import React from 'react';
import './index.css';
import { useState, useRef } from 'react';
import { useEffect } from 'react';

function ClipBoard(prop) {
  const [textArr, setTextArr] = useState([])
  const ref = useRef(false)
  function bindCopy(text) {
    console.log(text);
    const theClipboard = navigator.clipboard;
    if (theClipboard) {
      theClipboard.writeText(text).then((e) => {
        console.log(`复制${text}成功`);
      }, (err) => {
        console.log(err);
      })
    }
  }

  useEffect(()=>{
    if (ref.current) {
      ref.current.onclick = function bindWinClick() {
        const theClipboard = navigator.clipboard;
        if (theClipboard) {
          theClipboard.readText().then((e) => {
            console.log(`粘贴${e}成功`);
            setTextArr(pre => {
              return [...pre, e]
            })
          }, (err) => {
            console.log(err);
          })
        }
      }
    }
  })


  return (
    <div className="clip-board_wrapper">
      <div className='clip-board_oriage-wrapper'>
        {
          new Array(10).fill(parseInt(111)).map((item, index) => {
            return (
              <div className='clip-board_item-wrapper' key={index}>
                <div>{item}</div>
                <div onClick={() => bindCopy(item)}>复制</div>
              </div>
            )
          })
        }
      </div>
      <div className='clip-board_oriage-wrapper' ref={ref} >
        {
          textArr.map((item, index) => {
            return (
              <div className='clip-board_item-wrapper' key={index}>
                <div>{item}</div>
              </div>
            )
          })
        }
      </div>

    </div>
  );
}

export default ClipBoard;


css

.clip-board_wrapper {
  width: 500px;
  height: 600px;
  border: 1px solid red;
  display: flex;
  flex-direction: column;
}

.clip-board_oriage-wrapper {
  border: 1px solid khaki;
  display: flex;
  flex-wrap: wrap;
}
.clip-board_item-wrapper {
  padding: 20px;
  height: 30px;
  display: flex;
  border: 1px solid aqua;
  justify-content: flex-start;
  align-items: center;
}

.clip-board_oriage-wrapper {
  height: 300px;
  border: 1px solid seagreen;

}

app.jsx

function App() {
  return (
    <div className="App">
      <ClipBoard 
      >
      </ClipBoard>

    </div>
  );
}

实现效果图

其他帖子

developer.mozilla.org/zh-CN/docs/…