端末&ブラウザによって、クリップボードコピー(navigator.clipboard.writeText)が使えなかったので、
使えないときの対応を行いました。そのメモを残しておきます。誰かの助けになれば幸いです。
対応方針① window.clipboardData.setData
以下の記事を読むと
navigator.clipboardが使えないときは、window.clipboardData.setData('Text', ~~) で代替できると書いてありました。
しかし、window.clipboardDataのclipboardDataが色々とやってみても使えなかったため、断念しました。
(※ 何かwindowオブジェクトの設定がミスってるのかも)
var clipboardText = "clipboard";
if(navigator.clipboard == undefined) {
window.clipboardData.setData('Text', clipboardText);
} else {
navigator.clipboard.writeText(clipboardText);
}
対応方針② document.execCommand
以下の記事を読んで
- Android端末でLIFF内のクリップボードコピー(navigator.clipboard.writeText)に失敗する
- https://gist.github.com/wilsonpage/6f15d9b173584195eaa5dee42215bd81
document.execCommandを使ったところうまくいきました。
ただ、「document.execCommand」は非推奨なので、あまり使いたくなかったですが、今後、navigator.clipboardがすべてのブラウザ&端末で使えるようになると思うので(たぶん)、一旦のように書けます
export const copyTextToClipboard = (text: string): void => {
if (navigator.clipboard) return navigator.clipboard.writeText(text);
const isIos = navigator.userAgent.match(/ipad|iphone/i);
const textarea = document.createElement('textarea');
textarea.value = text;
document.body.appendChild(textarea);
if (isIos) {
const range = document.createRange();
range.selectNodeContents(textarea);
const selection = window.getSelection();
selection?.removeAllRanges();
selection?.addRange(range);
textarea.setSelectionRange(0, 999999);
} else {
textarea.select();
}
const result = document.execCommand('copy');
document.body.removeChild(textarea);
};
「navigator.clipboard」が使えるときは使って、使えないときは、「document.execCommand」を使うようにしました。
最後に一言
何か間違っている点があれば、教えて頂けたら幸いです。
よろしくお願い致します。
また「いいね!」してもらえるとすごい嬉しいです!!