इमेज चिपकाने का तरीका

मॉडर्न तरीका

Async Clipboard API का इस्तेमाल करना

उपयोगकर्ता के क्लिपबोर्ड से इमेज को प्रोग्राम के हिसाब से पढ़ने के लिए, यानी कि बटन पर क्लिक करने के बाद, Async Clipboard API के read() तरीके का इस्तेमाल किया जा सकता है. अगर क्लिपबोर्ड से पढ़ने की अनुमति अब तक नहीं दी गई है, तो navigator.clipboard.read() को कॉल करने पर, यह अनुमति का अनुरोध करेगा.

const pasteButton = document.querySelector('#paste-button');

pasteButton.addEventListener('click', async () => {
  try {
    const clipboardItems = await navigator.clipboard.read();
    for (const clipboardItem of clipboardItems) {
      const imageTypes = clipboardItem.types.find(type => type.startsWith('image/'))
      for (const imageType of imageTypes) {
        const blob = await clipboardItem.getType(imageType);
        // Do something with the image blob.
      }
    }
  } catch (err) {
    console.error(err.name, err.message);
  }
});

Browser Support

  • Chrome: 76.
  • Edge: 79.
  • Firefox: 127.
  • Safari: 13.1.

Source

क्लासिक तरीका

paste इवेंट के लिए सुनना

इमेज चिपकाने का सामान्य तरीका यह है कि (सिंक्रोनस) Clipboard API का इस्तेमाल किया जाए. इससे आपको Document: paste event में मौजूद clipboardData फ़ील्ड का ऐक्सेस मिलता है. हालांकि, इस तरीके की कुछ सीमाएं हैं. उदाहरण के लिए, यह सिंक्रोनस है. इसलिए, बड़ी मात्रा में डेटा चिपकाने से पेज ब्लॉक हो सकता है.

document.addEventListener('paste', async (e) => {
  e.preventDefault();

  for (const clipboardItem of e.clipboardData.files) {
    if (clipboardItem.type.startsWith('image/')) {
      // Do something with the image file.
    }
  }
});

Browser Support

  • Chrome: 66.
  • Edge: 79.
  • Firefox: 63.
  • Safari: 13.1.

Source

परतदार वृद्धि

जिन ब्राउज़र में Async Clipboard API काम नहीं करता है उनमें प्रोग्राम के हिसाब से, उपयोगकर्ता के क्लिपबोर्ड को ऐक्सेस नहीं किया जा सकता. उदाहरण के लिए, बटन पर क्लिक करने पर. इसलिए, paste इवेंट पर किसी उपयोगकर्ता के क्लिपबोर्ड को ऐक्सेस करने के लिए, Async Clipboard API का इस्तेमाल किया जा सकता है. साथ ही, (सिंक्रोनस) Clipboard API पर वापस जाया जा सकता है.

navigator.clipboard.read से मिलने वाले ClipboardItem ऑब्जेक्ट में types फ़ील्ड होता है, जो एक कलेक्शन होता है. वहीं, event.clipboardData.files से मिलने वाले File ऑब्जेक्ट में type फ़ील्ड होता है, जो एक स्ट्रिंग होती है. क्लिपबोर्ड में मौजूद इमेज के लिए, type या types फ़ील्ड में से किसी एक को शर्त के हिसाब से चुना जा सकता है:

document.addEventListener('paste', async (e) => {
  e.preventDefault();
  const clipboardItems = typeof navigator?.clipboard?.read === 'function' ? await navigator.clipboard.read() : e.clipboardData.files;

  for (const clipboardItem of clipboardItems) {
    let blob;
    if (clipboardItem.type?.startsWith('image/')) {
      // For files from `e.clipboardData.files`.
      blob = clipboardItem
      // Do something with the blob.
    } else {
      // For files from `navigator.clipboard.read()`.
      const imageTypes = clipboardItem.types?.filter(type => type.startsWith('image/'))
      for (const imageType of imageTypes) {
        blob = await clipboardItem.getType(imageType);
        // Do something with the blob.
      }
    }
  }
});

इस बारे में और पढ़ें

  • MDN पर Clipboard API
  • web.dev पर क्लिपबोर्ड का ऐक्सेस अनब्लॉक करना

डेमो

एचटीएमएल

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link
      rel="icon"
      href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🎉</text></svg>"
    />
    <title>How to paste images</title>
  </head>
  <body>
    <h1>How to paste images</h1>
    <p>Hit <kbd>⌘</kbd> + <kbd>v</kbd> (for macOS) or <kbd>ctrl</kbd> + <kbd>v</kbd>
      (for other operating systems) to paste images anywhere in this page.
    </p>
  </body>
</html>

सीएसएस


        :root {
  color-scheme: dark light;
}

html {
  box-sizing: border-box;
}

*,
*:before,
*:after {
  box-sizing: inherit;
}

body {
  margin: 1rem;
  font-family: system-ui, sans-serif;
}

button {
  display: block;
}
        

JS


        document.addEventListener('paste', async (e) => {
  e.preventDefault();
  const clipboardItems = typeof navigator?.clipboard?.read === 'function' ? await navigator.clipboard.read() : e.clipboardData.files;

  for (const clipboardItem of clipboardItems) {
    let blob;
    if (clipboardItem.type?.startsWith('image/')) {
      // For files from `e.clipboardData.files`.
      blob = clipboardItem
      // Do something with the blob.
      appendImage(blob);
    } else {
      // For files from `navigator.clipboard.read()`.
      const imageTypes = clipboardItem.types?.filter(type => type.startsWith('image/'))
      for (const imageType of imageTypes) {
        blob = await clipboardItem.getType(imageType);
        // Do something with the blob.
        appendImage(blob);
      }
    }
  }
});

const appendImage = (blob) => {
  const img = document.createElement('img');
  img.src = URL.createObjectURL(blob);
  document.body.append(img);
};