最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

image - Javascript Clipboard API write() does not work in Safari - Stack Overflow

programmeradmin3浏览0评论

I'm using javascript Clipboard API to copy an image to the clipboard. It works in Chrome and Edge but not in Safari in spite of official documentation of Safari says that it's supported.

Check the documentation: /

In this example (not my real code), write() throws an error:

document.getElementById("copy").addEventListener("click", async function() {
    const response = await fetch('.png');
    const blob = await response.blob();

    navigator.clipboard.write([new ClipboardItem({ "image/png": blob })])
      .then(function () { console.log('copied'); })
      .catch(function (error) { console.log(error); });
});

The given error is:

NotAllowedError: The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.

I'm using javascript Clipboard API to copy an image to the clipboard. It works in Chrome and Edge but not in Safari in spite of official documentation of Safari says that it's supported.

Check the documentation: https://webkit.org/blog/10855/

In this example (not my real code), write() throws an error:

document.getElementById("copy").addEventListener("click", async function() {
    const response = await fetch('https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png');
    const blob = await response.blob();

    navigator.clipboard.write([new ClipboardItem({ "image/png": blob })])
      .then(function () { console.log('copied'); })
      .catch(function (error) { console.log(error); });
});

The given error is:

NotAllowedError: The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.

Share Improve this question asked Feb 22, 2021 at 9:22 Felipe RuizFelipe Ruiz 1311 gold badge1 silver badge3 bronze badges
Add a comment  | 

3 Answers 3

Reset to default 15

It's because of your await call before calling clipboard.write. Apple doesn't allow this. You have to pass your promise directly into ClipboardItem like this:

document.getElementById("copy").addEventListener("click", async function() {
    const makeImagePromise = async () => {
        const response = await fetch('https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png');
        return await response.blob();
    }

    navigator.clipboard.write([new ClipboardItem({ "image/png": makeImagePromise() })])
      .then(function () { console.log('copied'); })
      .catch(function (error) { console.log(error); });
});

Use clipboard.write function. Apple has implement this for few Weeks in Safari and iOS.

setTimeout(async () => {
   await navigator.clipboard.writeText("Your text").then(function () {
      console.log("Copy to clipboard successfully.");
   }, function () {
      console.log("Copy to clipboard unsuccessfully.");
   });
});

I just wanted to say thank you to David Zorchtya

Here is an example of just doing plain text.

async function fetchData(){
    let res = await fetch('https://jsonplaceholder.typicode.com/todos/1');
    let data = await res.json();
    jsonplaceholder = JSON.stringify(data);
    return new Blob([jsonplaceholder], { type: 'text/plain' });
}

async function copyToClipboard() {

    const clipboardItem = new ClipboardItem({ 'text/plain': fetchData() });

    navigator.clipboard.write([clipboardItem])
    .then(function () { alert('copied'); })
    .catch(function (error) { alert(error); });
}
发布评论

评论列表(0)

  1. 暂无评论