কম্পিউটার টিউটোরিয়াল

জাভাস্ক্রিপ্ট দিয়ে টেক্সট ক্লিপবোর্ডে কপি কীভাবে করবেন?

Clipboard API: আধুনিক ও নিরাপদ পদ্ধতি

পুরানো `document.execCommand('copy')` ডিপ্রিকেটেড। আধুনিক ব্রাউজারগুলো **Clipboard API** (`navigator.clipboard`) সাপোর্ট করে যা Promise-বেসড, নিরাপদ এবং আরও শক্তিশালী।

বেসিক উদাহরণ (আধুনিক পদ্ধতি)

<!DOCTYPE html>
<html lang="bn">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>টেক্সট কপি টু ক্লিপবোর্ড</title>
  <style>
    * { box-sizing: border-box; }
    body { font-family: 'Segoe UI', sans-serif; padding: 20px; max-width: 500px; margin: 0 auto; }
    .input-group { display: flex; gap: 10px; margin-bottom: 20px; }
    input { flex: 1; padding: 12px; font-size: 16px; border: 1px solid #ddd; border-radius: 6px; }
    button { padding: 12px 24px; background: #4f46e5; color: white; border: none; border-radius: 6px; font-size: 16px; font-weight: 600; cursor: pointer; transition: background 0.2s; }
    button:hover { background: #4338ca; }
    button:disabled { opacity: 0.6; cursor: not-allowed; }
    .toast { position: fixed; bottom: 20px; right: 20px; background: #1e293b; color: white; padding: 14px 20px; border-radius: 8px; box-shadow: 0 10px 25px rgba(0,0,0,0.2); display: none; animation: slideIn 0.3s ease; }
    .toast.show { display: block; }
    @keyframes slideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }
  </style>
</head>
<body>
  <h1>টেক্সট ক্লিপবোর্ডে কপি করুন</h1>
  <div class="input-group">
    <input type="text" id="textInput" value="হ্যালো ওয়ার্ল্ড! এটি একটি টেস্ট।" placeholder="লিখুন বা পেস্ট করুন...">
    <button id="copyBtn">কপি করুন</button>
  </div>
  <div class="toast" id="toast">কপি হয়েছে!</div>
  
  <script>
    const copyBtn = document.getElementById('copyBtn');
    const textInput = document.getElementById('textInput');
    const toast = document.getElementById('toast');
    
    copyBtn.addEventListener('click', async () => {
      const text = textInput.value.trim();
      if (!text) return showToast('কপি করার জন্য কিছু নেই!');
      
      try {
        // আধুনিক Clipboard API
        await navigator.clipboard.writeText(text);
        showToast('✅ টেক্সট ক্লিপবোর্ডে কপি হয়েছে!');
        textInput.select(); // ভিজ্যুয়াল ফিডব্যাক
      } catch (err) {
        console.error('Copy failed:', err);
        showToast('❌ কপি ব্যর্থ: ' + err.message);
        fallbackCopy(text); // ফলব্যাক
      }
    });
    
    function showToast(msg) {
      toast.textContent = msg;
      toast.classList.add('show');
      setTimeout(() => toast.classList.remove('show'), 2500);
    }
    
    // ফলব্যাক: পুরানো পদ্ধতি (execCommand) - পুরানো ব্রাউজার/HTTP সাইটের জন্য
    function fallbackCopy(text) {
      const textarea = document.createElement('textarea');
      textarea.value = text;
      textarea.style.position = 'fixed'; // স্ক্রল জাম্প এড়াতে
      textarea.style.opacity = '0';
      document.body.appendChild(textarea);
      textarea.select();
      try {
        document.execCommand('copy');
        showToast('✅ কপি হয়েছে (ফলব্যাক)');
      } catch (e) {
        showToast('❌ কপি সম্ভব নয়');
      }
      document.body.removeChild(textarea);
    }
    
    // কীবোর্ড শর্টকাট: Ctrl/Cmd + C তে ইনপুট সিলেক্ট থাকলে অটো কপি (ঐচ্ছিক)
    textInput.addEventListener('keydown', (e) => {
      if ((e.ctrlKey || e.metaKey) && e.key === 'c' && !textInput.value.trim()) {
        // ইনপুট খালি থাকলে কিছুই করবেন না
      }
    });
  </script>
</body>
</html>

Clipboard API-এর মূল মেথড

মেথডবিবরণ
navigator.clipboard.writeText(text)টেক্সট ক্লিপবোর্ডে লিখে (Promise রিটার্ন)۔
navigator.clipboard.readText()ক্লিপবোর্ড থেকে টেক্সট পড়ে (Promise, পারমিশন দরকার)۔
navigator.clipboard.write(data)বিভিন্ন ফরম্যাট (HTML, ইমেজ, ফাইল) লিখে।
navigator.clipboard.read()বহু-ফরম্যাট ডেটা পড়ে।

ব্রাউজার সাপোর্ট ও সীমাবদ্ধতা

  • HTTPS আবশ্যক: Clipboard API শুধু সিকিউর কনটেক্সটে (HTTPS, localhost) কাজ করে। HTTP-এ কাজ করে না।
  • ব্রাউজার: Chrome 66+, Firefox 63+, Safari 13.1+, Edge 79+।
  • পারমিশন: `readText()`/`read()`-এ ব্যবহারকারীর অনুমতি চায় (پرমপ্ট আসে)। `writeText()`-এ সাধারণত পারমিশন লাগে না (user activation দরকার)۔
  • User Activation: ক্লিক, কীপ্রেস ইত্যাদি ইউজার ইন্টারঅ্যাকশনের পরেই `writeText()` কাজ করে।

পুরানো পদ্ধতি (execCommand) — এখন বাঁচালে রাখা উচিত নয়

// পুরানো পদ্ধতি (ডিপ্রিকেটেড)
input.select();
input.setSelectionRange(0, 99999); // মোবাইল সাপোর্ট
document.execCommand('copy'); // বুলিয়ান রিটার্ন

এই পদ্ধতিটি আর রিকমেন্ড করা হয় না, কিন্তু কিছু পুরানো এন্টারপ্রাইজ এনভায়রনমেন্টে ফলব্যাক হিসেবে রাখা যেতে পারে।

অ্যাডভান্সড: রিচ টেক্সট (HTML) কপি

async function copyHtml(html) {
  try {
    const blob = new Blob([html], { type: 'text/html' });
    const data = [new ClipboardItem({ 'text/html': blob })];
    await navigator.clipboard.write(data);
    console.log('HTML কপি হয়েছে');
  } catch (err) {
    console.error(err);
  }
}

সারামারি

  • নতুন প্রজেক্টে **Clipboard API (`navigator.clipboard.writeText`)** ব্যবহার করুন।
  • HTTPS নিশ্চিত করুন।
  • User activation (ক্লিক/কীপ্রেস) এর মধ্যে কল করুন।
  • ত্রুটি হ্যান্ডলিং এবং ফলব্যাক রাখুন।
  • UX-এ টোস্ট/নোটিফিকেশন এবং ইনপুট সিলেক্ট ভিজ্যুয়াল ফিডব্যাক দিন।
  1. জাভাস্ক্রিপ্ট দিয়ে কারেন্ট URL কীভাবে পাবেন?

  2. জাভাস্ক্রিপ্ট ব্যবহার করে ক্যানভাসে ড্র করার পদ্ধতি

  3. জাভাস্ক্রিপ্টে অবজেক্টের শ্যালো কপি (shallow copy) কীভাবে করবেন

  4. জাভাস্ক্রিপ্ট দিয়ে টেক্সট টগল করা