मैं जावास्क्रिप्ट में क्लिपबोर्ड पर कैसे कॉपी करूं?


3316

क्लिपबोर्ड पर टेक्स्ट कॉपी करने का सबसे अच्छा तरीका क्या है? (बहु ब्राउज़र)

मैंने कोशिश की है:

function copyToClipboard(text) {
    if (window.clipboardData) { // Internet Explorer
        window.clipboardData.setData("Text", text);
    } else {  
        unsafeWindow.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");  
        const clipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);  
        clipboardHelper.copyString(text);
    }
}

लेकिन इंटरनेट एक्सप्लोरर में यह एक सिंटैक्स त्रुटि देता है। फ़ायरफ़ॉक्स में, यह कहता है unsafeWindow is not defined

फ्लैश के बिना एक अच्छी चाल: ट्रेलो उपयोगकर्ता के क्लिपबोर्ड तक कैसे पहुंचता है?


बस जिज्ञासु, वह क्या है जिसे आप उस क्लिपबोर्ड पर कॉपी करना चाहते हैं जिसे उपयोगकर्ता स्वयं नहीं कर सकता है?
स्किनलिफ़

233
कुछ खास नहीं। वे इसे स्वयं कर सकते हैं लेकिन मैं पाठ के सही हिस्से के चयन के बारे में चिंता किए बिना एक बटन क्लिक करने की संभावना भी प्रस्तुत करना चाहता हूं।
सैंटियागो कोररेडोइरा


यह IE में और साथ ही FF में ब्राउज़र को अपरिभाषित अपवाद दे रहा है
Jagadeesh

1
यदि हम उपयोगकर्ता के क्लिपबोर्ड में पाठ डाल सकते हैं, तो हम उसके क्लिपबोर्ड को बर्बाद कर सकते हैं।
फ्रैंक फेंग

जवाबों:


2240

अवलोकन

क्लिपबोर्ड पर प्रतिलिपि बनाने के लिए तीन प्राथमिक ब्राउज़र API हैं:

  1. Async क्लिपबोर्ड API [navigator.clipboard.writeText]
    • Chrome 66 (मार्च 2018) में उपलब्ध टेक्स्ट-केंद्रित भाग
    • एक्सेस अतुल्यकालिक है और जावास्क्रिप्ट प्रोमिस का उपयोग करता है , इसलिए लिखा जा सकता है ताकि सुरक्षा उपयोगकर्ता संकेत (यदि प्रदर्शित हो) पेज में जावास्क्रिप्ट को बाधित न करें।
    • पाठ को एक चर से सीधे क्लिपबोर्ड पर कॉपी किया जा सकता है।
    • केवल HTTPS से अधिक पृष्ठों पर समर्थित।
    • Chrome में सक्रिय टैब के 66 पृष्ठ बिना अनुमति के क्लिपबोर्ड पर लिख सकते हैं।
  2. document.execCommand('copy')
    • अधिकांश ब्राउज़र इसे ~ अप्रैल 2015 तक समर्थन करते हैं (नीचे ब्राउज़र समर्थन देखें)।
    • एक्सेस सिंक्रोनस है, यानी पृष्ठ में जावास्क्रिप्ट को तब तक बंद किया जाता है जब तक कि प्रदर्शन और उपयोगकर्ता किसी भी सुरक्षा संकेतों के साथ बातचीत नहीं करते।
    • डोम से पाठ पढ़ा जाता है और क्लिपबोर्ड पर रखा जाता है।
    • परीक्षण के दौरान ~ अप्रैल 2015 में केवल इंटरनेट एक्सप्लोरर को क्लिपबोर्ड पर लिखने के दौरान अनुमतियों को प्रदर्शित करने के रूप में नोट किया गया था।
  3. कॉपी ईवेंट को ओवरराइड करना
    • कॉपी इवेंट को ओवरराइड करने पर क्लिपबोर्ड एपीआई प्रलेखन देखें ।
    • आपको किसी भी कॉपी ईवेंट से क्लिपबोर्ड पर दिखाई देने वाले बदलाव को संशोधित करने की अनुमति देता है, इसमें सादे पाठ के अलावा अन्य डेटा के अन्य प्रारूप शामिल हो सकते हैं।
    • यहाँ कवर नहीं है क्योंकि यह सीधे सवाल का जवाब नहीं देता है।

सामान्य विकास नोट

जब आप कंसोल में कोड का परीक्षण कर रहे हों, तो क्लिपबोर्ड से संबंधित कार्य करने की अपेक्षा न करें। आम तौर पर पृष्ठ को सक्रिय करने की आवश्यकता होती है (Async क्लिपबोर्ड API) या document.execCommand('copy')अधिक विस्तार के लिए नीचे दिए गए क्लिपबोर्ड को देखने की अनुमति देने के लिए उपयोगकर्ता इंटरैक्शन (उदाहरण के लिए उपयोगकर्ता क्लिक) की आवश्यकता होती है।

महत्वपूर्ण (यहां 2020/02/20 नोट)

ध्यान दें कि चूंकि यह पोस्ट मूल रूप से क्रॉस-मूल IFRAME और अन्य IFRAME "सैंडबॉक्सिंग " में अनुमतियों का पदावनति लिखी गई थी, जो एम्बेडेड डेमो "रन कोड स्निपेट" बटन और "कोडपेन.आईओ उदाहरण" को कुछ ब्राउज़रों में काम करने से रोकती है (क्रोम और Microsoft एज सहित) )।

अपना खुद का वेब पेज बनाने के लिए, उस पेज को एचटीटीपीएस कनेक्शन पर परीक्षण करें और उसके खिलाफ विकसित करें।

यहाँ एक परीक्षण / डेमो पृष्ठ है जो काम करने वाले कोड को प्रदर्शित करता है: https://deanmarktaylor.github.io/clipboard-Eest/

Async + फ़ॉलबैक

नए Async क्लिपबोर्ड एपीआई के लिए ब्राउज़र समर्थन के स्तर के कारण आप संभवतः document.execCommand('copy')अच्छा ब्राउज़र कवरेज प्राप्त करने के लिए विधि में वापसी करना चाहेंगे ।

यहां एक सरल उदाहरण है (इस साइट में एम्बेडेड काम नहीं कर सकता है, ऊपर "महत्वपूर्ण" नोट पढ़ें):

function fallbackCopyTextToClipboard(text) {
  var textArea = document.createElement("textarea");
  textArea.value = text;
  
  // Avoid scrolling to bottom
  textArea.style.top = "0";
  textArea.style.left = "0";
  textArea.style.position = "fixed";

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Fallback: Copying text command was ' + msg);
  } catch (err) {
    console.error('Fallback: Oops, unable to copy', err);
  }

  document.body.removeChild(textArea);
}
function copyTextToClipboard(text) {
  if (!navigator.clipboard) {
    fallbackCopyTextToClipboard(text);
    return;
  }
  navigator.clipboard.writeText(text).then(function() {
    console.log('Async: Copying to clipboard was successful!');
  }, function(err) {
    console.error('Async: Could not copy text: ', err);
  });
}

var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');

copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});


copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});
<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:

  </textarea>
</div>

(codepen.io उदाहरण काम नहीं कर सकता है, "महत्वपूर्ण" नोट ऊपर पढ़ें) ध्यान दें कि यह स्निपेट स्टैक ओवरफ्लो के एम्बेडेड पूर्वावलोकन में अच्छी तरह से काम नहीं कर रहा है आप इसे यहाँ आज़मा सकते हैं: https://codepen.io/DeanMarkTaylor/pen/RMRaJX?editors = 1011

Async क्लिपबोर्ड API

ध्यान दें कि Chrome 66 में अनुमतियों एपीआई के माध्यम से क्लिपबोर्ड तक पहुंच के लिए "अनुमति का अनुरोध" करने और परीक्षण करने की क्षमता है।

var text = "Example text to appear on clipboard";
navigator.clipboard.writeText(text).then(function() {
  console.log('Async: Copying to clipboard was successful!');
}, function(err) {
  console.error('Async: Could not copy text: ', err);
});

document.execCommand ( 'प्रतिलिपि')

इस पोस्ट की शेष राशि document.execCommand('copy')एपीआई की बारीकियों और विस्तार में जाती है।

ब्राउज़र का समर्थन

जावास्क्रिप्ट document.execCommand('copy')समर्थन बड़ा हो गया है, ब्राउज़र अपडेट के लिए नीचे दिए गए लिंक देखें:

सरल उदाहरण

(इस साइट में एम्बेड किए गए कार्य नहीं हो सकते हैं, ऊपर "महत्वपूर्ण" नोट पढ़ें)

var copyTextareaBtn = document.querySelector('.js-textareacopybtn');

copyTextareaBtn.addEventListener('click', function(event) {
  var copyTextarea = document.querySelector('.js-copytextarea');
  copyTextarea.focus();
  copyTextarea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }
});
<p>
  <button class="js-textareacopybtn" style="vertical-align:top;">Copy Textarea</button>
  <textarea class="js-copytextarea">Hello I'm some text</textarea>
</p>

जटिल उदाहरण: इनपुट प्रदर्शित किए बिना क्लिपबोर्ड पर कॉपी करें

यदि स्क्रीन पर कोई तत्व textareaया inputतत्व दिखाई दे रहा है, तो उपरोक्त सरल उदाहरण बहुत अच्छा काम करता है ।

कुछ मामलों में आप एक input/ textareaतत्व प्रदर्शित किए बिना पाठ को क्लिपबोर्ड पर कॉपी करना चाह सकते हैं । यह इसके चारों ओर काम करने के तरीके का एक उदाहरण है (मूल रूप से तत्व सम्मिलित करें, क्लिपबोर्ड पर कॉपी करें, तत्व निकालें):

Google Chrome 44, फ़ायरफ़ॉक्स 42.0a1 और इंटरनेट एक्सप्लोरर 11.0.8600.17814 के साथ परीक्षण किया गया।

(इस साइट में एम्बेड किए गए कार्य नहीं हो सकते हैं, ऊपर "महत्वपूर्ण" नोट पढ़ें)

function copyTextToClipboard(text) {
  var textArea = document.createElement("textarea");

  //
  // *** This styling is an extra step which is likely not required. ***
  //
  // Why is it here? To ensure:
  // 1. the element is able to have focus and selection.
  // 2. if element was to flash render it has minimal visual impact.
  // 3. less flakyness with selection and copying which **might** occur if
  //    the textarea element is not visible.
  //
  // The likelihood is the element won't even render, not even a
  // flash, so some of these are just precautions. However in
  // Internet Explorer the element is visible whilst the popup
  // box asking the user for permission for the web page to
  // copy to the clipboard.
  //

  // Place in top-left corner of screen regardless of scroll position.
  textArea.style.position = 'fixed';
  textArea.style.top = 0;
  textArea.style.left = 0;

  // Ensure it has a small width and height. Setting to 1px / 1em
  // doesn't work as this gives a negative w/h on some browsers.
  textArea.style.width = '2em';
  textArea.style.height = '2em';

  // We don't need padding, reducing the size if it does flash render.
  textArea.style.padding = 0;

  // Clean up any borders.
  textArea.style.border = 'none';
  textArea.style.outline = 'none';
  textArea.style.boxShadow = 'none';

  // Avoid flash of white box if rendered for any reason.
  textArea.style.background = 'transparent';


  textArea.value = text;

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copying text command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }

  document.body.removeChild(textArea);
}


var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
  copyJaneBtn = document.querySelector('.js-copy-jane-btn');

copyBobBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Bob');
});


copyJaneBtn.addEventListener('click', function(event) {
  copyTextToClipboard('Jane');
});
<div style="display:inline-block; vertical-align:top;">
  <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
  <button class="js-copy-jane-btn">Set clipboard to JANE</button>
</div>
<div style="display:inline-block;">
  <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:

  </textarea>
</div>

अतिरिक्त नोट्स

केवल तभी काम करता है जब उपयोगकर्ता कोई कार्रवाई करता है

सभी document.execCommand('copy')कॉल उपयोगकर्ता कार्रवाई के प्रत्यक्ष परिणाम के रूप में होनी चाहिए, उदाहरण के लिए ईवेंट हैंडलर पर क्लिक करें। यह उपयोगकर्ता के क्लिपबोर्ड के साथ खिलवाड़ रोकने के लिए एक उपाय है जब वे इसकी उम्मीद नहीं करते हैं।

अधिक जानकारी के लिए यहां Google डेवलपर्स पोस्ट देखें ।

क्लिपबोर्ड एपीआई

नोट पूरा क्लिपबोर्ड एपीआई मसौदा विनिर्देश यहां पाया जा सकता है: https://w3c.github.io/clipboard-apis/

क्या यह समर्थित है?

  • document.queryCommandSupported('copy')trueयदि कमांड "ब्राउज़र द्वारा समर्थित है" वापस लौटना चाहिए ।
  • और अगर अब सफल हुआ तो document.queryCommandEnabled('copy')वापसी करेंगे। यह सुनिश्चित करने के लिए कि उपयोगकर्ता द्वारा शुरू किए गए थ्रेड से कमांड को बुलाया गया है और अन्य आवश्यकताओं को पूरा किया गया है।truedocument.execCommand('copy')

हालांकि ब्राउज़र संगतता मुद्दों, ~ अप्रैल से ~ अक्टूबर 2015 तक गूगल क्रोम केवल लौटे का एक उदाहरण के रूप में trueसे document.queryCommandSupported('copy')अगर आदेश जो उपयोगकर्ता द्वारा आरंभ धागे से बुलाया गया था।

नोट संगतता विवरण नीचे।

ब्राउज़र संगतता विवरण

एक यूजर क्लिक के परिणामस्वरूप / ब्लॉक document.execCommand('copy')में लिपटे एक साधारण कॉल के दौरान, आपको सबसे अनुकूलता का उपयोग करने के लिए मिलेगा, जिसमें कुछ प्रोविडेंस हैं:trycatch

किसी भी कॉल document.execCommand, document.queryCommandSupportedया document.queryCommandEnabledको try/ catchब्लॉक में लपेटा जाना चाहिए ।

अलग-अलग ब्राउज़र कार्यान्वयन और ब्राउज़र संस्करण विभिन्न प्रकार के अपवादों को फेंकते हैं जब लौटने के बजाय कहा जाता है false

विभिन्न ब्राउज़र कार्यान्वयन अभी भी प्रवाह में हैं और क्लिपबोर्ड एपीआई अभी भी मसौदे में है, इसलिए अपने परीक्षण करना याद रखें।


41
कैसे एक चर डेटा से सीधे कॉपी करने के लिए .ie var str = "word";:?
jscripter

10
@BubuDaba <textarea>JS के साथ छिपी हुई डमी बनाएं , इसे अपग्रेड करें document.body, वैरिएबल पर इसकी वैल्यू सेट करें, और इसे स्पीड में उपयोग करें copyTextarea, फिर कंटेंट कॉपी होने के बाद इसे सही से हटा दें।
सीनोप्सिस

3
क्या सफारी या किसी भी संकेतक के लिए कुछ भी है जो इसे सफारी में लागू किया जाएगा?
www139

3
एकमात्र संस्करण मुझे मिला जो सभी ब्राउज़रों में काम करता है। मैंने पाया कि Boostrap Modal में इसका उपयोग करते समय मुझे टेक्स्ट क्षेत्र को मोडल के साथ जोड़ना था। अगर मैं आपके समाधान के लिए कर सकता हूं तो मुझे +1000 देना होगा !!! धन्यवाद!
पैट्रिक

3
@AyaSalama प्रमुख बिंदु यह है कि "कॉपी" कार्रवाई तब तक नहीं हो सकती जब तक कि वह उस ब्राउज़र के लिए प्रकट न हो जाए जो उपयोगकर्ता कार्रवाई कर रहा है। यदि तत्व "प्रदर्शन: कोई नहीं" के साथ स्टाइल किया जाता है, तो उपयोगकर्ता कार्रवाई करने में सक्षम नहीं होगा क्योंकि वे इसे देख नहीं पाएंगे, और न ही इसके साथ बातचीत कर पाएंगे।
डीन टेलर

1256

क्लिपबोर्ड पर स्वचालित कॉपी करना खतरनाक हो सकता है, इसलिए अधिकांश ब्राउज़र (IE को छोड़कर) इसे बहुत मुश्किल बनाते हैं। व्यक्तिगत रूप से, मैं निम्नलिखित सरल चाल का उपयोग करता हूं:

function copyToClipboard(text) {
  window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
}

उपयोगकर्ता को प्रॉम्प्ट बॉक्स के साथ प्रस्तुत किया जाता है, जहां कॉपी किए जाने वाले टेक्स्ट को पहले से ही चुना जाता है। अब यह Ctrl+ Cऔर Enter(बॉक्स को बंद करने के लिए) दबाने के लिए पर्याप्त है - और वॉयला!

अब क्लिपबोर्ड कॉपी ऑपरेशन सुरक्षित है, क्योंकि उपयोगकर्ता इसे मैन्युअल रूप से करता है (लेकिन बहुत सरल तरीके से)। बेशक, सभी ब्राउज़रों में काम करता है।

<button id="demo" onclick="copyToClipboard(document.getElementById('demo').innerHTML)">This is what I want to copy</button>

<script>
  function copyToClipboard(text) {
    window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
  }
</script>


91
चतुर, लेकिन यह केवल सिंगल लाइन का समर्थन करता है।
अराम कोचरन

61
यह "प्रांप्ट" फ़ंक्शन को कस्टम मोडल में बदलने के लिए तुच्छ है, चाल का मांस एक संपादन योग्य सामग्री फ़ील्ड का उपयोग करना है और पाठ को पूर्व-चयन करना है, और यह उपयोगकर्ता द्वारा ले जाने वाले ब्राउज़र UI को तोड़कर नहीं करता है। कार्रवाई खुद। A ++
जॉन जेड

110
अभी भी क्लिपबोर्ड पर कॉपी करने के लिए जावास्क्रिप्ट का उपयोग नहीं कर रहा है ^ _ ^
RozzA

23
यदि आपका पाठ 2000 वर्णों से अधिक है, तो इसे छोटा कर दिया जाएगा, लेकिन छोटे पाठ नमूनों के लिए यह बढ़िया काम करता है
RasTheDestroyer

445
अजीब बात है कि यह 457 तक बढ़ जाता है, जबकि यह सवाल का जवाब नहीं देता है: जावास्क्रिप्ट में क्लिपबोर्ड पर कॉपी करें !
स्टीवन्वह

298

निम्न दृष्टिकोण क्रोम, फ़ायरफ़ॉक्स, इंटरनेट एक्सप्लोरर और एज में काम करता है, और सफारी के हाल के संस्करणों में (प्रतिलिपि समर्थन संस्करण 10 में जोड़ा गया था जो अक्टूबर 2016 को जारी किया गया था)।

  • एक textarea बनाएं और उस सामग्री को उस पाठ पर सेट करें जिसे आप क्लिपबोर्ड पर कॉपी करना चाहते हैं।
  • DOM पर textarea को अप्लाई करें।
  • Textarea में पाठ का चयन करें।
  • कॉल डॉक्यूमेंट ।execCommand ("कॉपी")
  • टेक्सारिया को डोम से हटा दें।

नोट: आप टेक्स्टारिया को नहीं देख पाएंगे, क्योंकि यह जावास्क्रिप्ट कोड के समान सिंक्रोनस इनवॉइस के भीतर जोड़ा और निकाला जाता है।

अगर आप इसे स्वयं लागू कर रहे हैं तो कुछ चीजें देखने के लिए:

  • सुरक्षा कारणों से, इसे केवल ईवेंट हैंडलर से क्लिक किया जा सकता है, जैसे क्लिक (विंडोज़ खोलने के साथ)।
  • पहली बार क्लिपबोर्ड अपडेट होने पर इंटरनेट एक्सप्लोरर एक अनुमति संवाद दिखाएगा।
  • जब Internetarea फ़ोकस होता है, तो Internet Explorer और Edge स्क्रॉल करेंगे।
  • execCommand () कुछ मामलों में फेंक सकते हैं।
  • जब तक आप एक textarea का उपयोग नहीं करते तब तक नई सुर्खियाँ और टैब निगले जा सकते हैं। (अधिकांश लेख एक div का उपयोग करने की सलाह देते हैं)
  • इंटरनेट एक्सप्लोरर डायलॉग दिखाए जाने के दौरान टेक्स्टारिया दिखाई देगा, आपको या तो इसे छिपाने की जरूरत है, या इंटरनेट एक्सप्लोरर विशिष्ट क्लिपबोर्ड डेटा एपीआई का उपयोग करने की आवश्यकता है।
  • Internet Explorer सिस्टम में व्यवस्थापक क्लिपबोर्ड API को अक्षम कर सकते हैं।

नीचे दिए गए फ़ंक्शन को निम्नलिखित सभी मुद्दों को यथासंभव सफाई से संभालना चाहिए। कृपया कोई टिप्पणी छोड़ें यदि आपको कोई समस्या मिलती है या इसमें सुधार के लिए कोई सुझाव है।

// Copies a string to the clipboard. Must be called from within an
// event handler such as click. May return false if it failed, but
// this is not always possible. Browser support for Chrome 43+,
// Firefox 42+, Safari 10+, Edge and Internet Explorer 10+.
// Internet Explorer: The clipboard feature may be disabled by
// an administrator. By default a prompt is shown the first
// time the clipboard is used (per session).
function copyToClipboard(text) {
    if (window.clipboardData && window.clipboardData.setData) {
        // Internet Explorer-specific code path to prevent textarea being shown while dialog is visible.
        return clipboardData.setData("Text", text);

    }
    else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
        var textarea = document.createElement("textarea");
        textarea.textContent = text;
        textarea.style.position = "fixed";  // Prevent scrolling to bottom of page in Microsoft Edge.
        document.body.appendChild(textarea);
        textarea.select();
        try {
            return document.execCommand("copy");  // Security exception may be thrown by some browsers.
        }
        catch (ex) {
            console.warn("Copy to clipboard failed.", ex);
            return false;
        }
        finally {
            document.body.removeChild(textarea);
        }
    }
}

https://jsfiddle.net/fx6a6n6x/


9
अच्छा जवाब: क्रॉस ब्राउजर सपोर्ट, एरर हैंडलिंग + क्लीन अप। आज के नए समर्थन के लिए के रूप में क्वेरीकॉम्पस्यूटेड, क्लिपबोर्ड पर कॉपी करना अब जावास्क्रिप्ट में संभव है और यह अजीब उत्तर होना चाहिए, बजाय awkward 'window.prompt ("कॉपी टू क्लिपबोर्ड: Ctrl + C, एंटर", टेक्स्ट)' वर्कअराउंड। window.clipboardData IE9 में समर्थित है, इसलिए आपको ब्राउज़र समर्थन सूची में IE9 जोड़ना चाहिए और मुझे लगता है कि शायद IE8 और पिछले भी, लेकिन सत्यापित करने की आवश्यकता है।
user627283

हाँ। IE 8/9 ठीक होना चाहिए। हमारा ऐप उनका समर्थन नहीं करता है। इसलिए मैंने परीक्षण नहीं किया है। IE जनवरी में समर्थन बंद कर देता है, इसलिए मैं बहुत उपद्रव नहीं कर रहा हूं। उम्मीद है कि सफारी का समर्थन जल्द ही मिल जाएगा। मुझे यकीन है कि यह उनके रडार पर है।
ग्रेग लोव

4
@SantiagoCorredoira: 2016 में, यह स्वीकृत उत्तर के योग्य है। कृपया बीजीटी (बड़ी हरी टिक) पर फिर से विचार करें।
लॉरेंस Dol

3
@Noitidart I का परीक्षण किया गया और यह पूरी तरह से फ़ायरफ़ॉक्स 54, क्रोम 60 और एज ब्राउज़र के लिए काम करता है, यहां तक ​​कि जब फोकस html डॉक्यूमेंट में नहीं होता है, तो आपके द्वारा की जा रही त्रुटि शायद FF 55 के संस्करण के लिए विशिष्ट है
टॉसीन जॉन

2
@ नोइटीडार्ट यह अभी भी पूरी तरह से यहां काम करता है, देव उपकरणों पर ध्यान केंद्रित करने से इसे रोका नहीं गया। और वैसे, डेवलपर टूल पर एक सामान्य वेब ऐप उपयोगकर्ता क्या कर रहा होगा
Tosin John

97

यहाँ मेरा उस पर ले रहा है ...

function copy(text) {
    var input = document.createElement('input');
    input.setAttribute('value', text);
    document.body.appendChild(input);
    input.select();
    var result = document.execCommand('copy');
    document.body.removeChild(input);
    return result;
 }

@korayem: ध्यान दें कि html inputफ़ील्ड का उपयोग लाइन ब्रेक का सम्मान नहीं \nकरेगा और किसी भी टेक्स्ट को एक लाइन में समतल करेगा।

जैसा कि टिप्पणियों में @ मिक्सकैन द्वारा उल्लेख किया गया है, का उपयोग करके textareaसमस्या को इस प्रकार ठीक किया जाएगा:

function copy(text) {
    var input = document.createElement('textarea');
    input.innerHTML = text;
    document.body.appendChild(input);
    input.select();
    var result = document.execCommand('copy');
    document.body.removeChild(input);
    return result;
}

@ मिक्सकैन के साथ स्ट्रिंग की नकल कैसे करें \n?
sof-03

2
@ sof-03 इनपुट के बजाय \r\n
टेक्सारिया का

1
Win10x64 पर Microsoft एज 42.17134.1.0 में काम नहीं कर रहा है
होन्सा स्टुन्ना

3
मैंने आपका जवाब कॉपी कर लिया है। यह क्रोम में काम करता है और मुझे इसकी आवश्यकता है।
user875234

यह सबसे सरल समाधान है जो फ़ायरफ़ॉक्स v68.0.2 (64-बिट) के साथ काम करता है।
आर्य

88

यदि आप वास्तव में सरल समाधान चाहते हैं (एकीकृत करने के लिए 5 मिनट से कम समय लेता है) और बॉक्स के बाहर अच्छा लगता है, तो क्लैपी कुछ अधिक जटिल समाधानों के लिए एक अच्छा विकल्प है।

इसे गिटहब के सह-संस्थापक ने लिखा था। उदाहरण फ्लैश एम्बेड कोड नीचे:

<object
   classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
   width="110"
   height="14"
   id="clippy">
  <param name="movie" value="/flash/clippy.swf"/>
  <param name="allowScriptAccess" value="always"/>
  <param name="quality" value="high"/>
  <param name="scale" value="noscale"/>
  <param NAME="FlashVars" value="text=#{text}"/>
  <param name="bgcolor" value="#{bgcolor}"/>
  <embed
     src="/flash/clippy.swf"
     width="110"
     height="14"
     name="clippy"
     quality="high"
     allowScriptAccess="always"
     type="application/x-shockwave-flash"
     pluginspage="http://www.macromedia.com/go/getflashplayer"
     FlashVars="text=#{text}"
     bgcolor="#{bgcolor}"/>
</object>

याद रखें #{text}कि आपके द्वारा कॉपी किए गए पाठ के #{bgcolor}साथ , और एक रंग के साथ प्रतिस्थापित करना ।


12
किसी भी इच्छुक के लिए, रेपो के लिए URL की प्रतिलिपि बनाते समय GitHub पर उपयोग की जा रही Clippy की जांच करें।
राडेक

66
FYI करें, GitHub पर Clippy का उपयोग ZeroClipboard द्वारा प्रतिस्थापित किया गया है।
जेम्स एम। ग्रीन

218
ओपी जावास्क्रिप्ट में एक समाधान चाहता था। फ्लैश नहीं।
एमटी।

21
@MT, "javascript" द्वारा कुछ लोगों का मतलब "ब्राउज़र क्लाइंट में" है, इसलिए जबकि JS-only एक आवश्यकता हो सकती है, इस उत्तर पर मौका देने वाले कई लोग वास्तव में JS-or-other-व्यापक रूप से समर्थित हैं- ग्राहक तकनीक। फ्लैश सभी प्लेटफार्मों को हिट नहीं करता है, लेकिन क्लिपबोर्ड समर्थन जैसी एक पॉलिश सुविधा के लिए, यह जोड़ने योग्य है अगर यह पॉपअप डायलॉग पर UX में सुधार करता है (जो यह निश्चित रूप से करता है)।
डेव डॉपसन

13
अब फ्लैश पर निर्भर होने का मतलब है कि वे चीजें जो कुछ प्रतिशत साइट आगंतुकों के लिए काम नहीं करती हैं, जो वेब विकास करने वाले लगभग सभी के लिए अस्वीकार्य है।
21

86

वेबपेज से क्लिपबोर्ड को पढ़ना और संशोधित करना सुरक्षा और गोपनीयता की चिंताओं को बढ़ाता है। हालाँकि, Internet Explorer में, यह करना संभव है। मुझे यह उदाहरण स्निपेट में मिला :

    <script type="text/javascript">
        function select_all(obj) {
            var text_val=eval(obj);
            text_val.focus();
            text_val.select();
            r = text_val.createTextRange();
            if (!r.execCommand) return; // feature detection
            r.execCommand('copy');
        }
    </script>
    <input value="http://www.sajithmr.com"
     onclick="select_all(this)" name="url" type="text" />


7
एक साधारण कॉपी ऑपरेशन के लिए फ्लैश का उपयोग करना ओवरकिल की तरह लगता है, खुशी है कि ऐसा करने के लिए एक साफ जेएस तरीका था। और जब से हम कॉर्पोरेट एनव में हैं। IE ठीक है। धन्यवाद बंदी!
एडी

5
plz समझाता है कि क्या execCommand(\\’copy\\’);होता है, अगर IE के लिए क्लिपबोर्ड पर कॉपी नहीं किया जाता है? @ मर्बोर्न
रोज़ा

20
उपयोग न करें if(!document.all)लेकिन if(!r.execCommand)ऐसा न करें कि कोई और इसे लागू करे! Document.all इसके लिए बिल्कुल गैर-प्रासंगिक है।
m93a

1
यार, यह वही है जिसे मैं सरल और स्वच्छ कोड के बारे में प्यार करता हूं, यह लगभग हमेशा मामूली रखरखाव के साथ काम करता है। यह मेरे लिए किया, यह खूबसूरती से काम करता है।
सैमुअल रमजान

1
नवीनतम क्रोम, फ़ायरफ़ॉक्स, या एमएस एज में काम नहीं करता है :(
जोनाथन मारज़ुलो

69

मैंने हाल ही में इस समस्या पर एक तकनीकी ब्लॉग पोस्ट लिखी है (मैं ल्यूसिडरैट पर काम करता हूं और हमने हाल ही में हमारे कंप्यूटरबोर्ड पर एक ओवरहाल किया था)।

क्लिपबोर्ड पर सादे पाठ की प्रतिलिपि बनाना अपेक्षाकृत सरल है, यह मानते हुए कि आप इसे सिस्टम कॉपी ईवेंट (उपयोगकर्ता CtrlCके मेनू को दबाता है या उपयोग करता है) के दौरान करना चाहते हैं ।

var isIe = (navigator.userAgent.toLowerCase().indexOf("msie") != -1 
           || navigator.userAgent.toLowerCase().indexOf("trident") != -1);

document.addEventListener('copy', function(e) {
    var textToPutOnClipboard = "This is some text";
    if (isIe) {
        window.clipboardData.setData('Text', textToPutOnClipboard);    
    } else {
        e.clipboardData.setData('text/plain', textToPutOnClipboard);
    }
    e.preventDefault();
});

क्लिपबोर्ड पर पाठ डालना सिस्टम कॉपी इवेंट के दौरान अधिक कठिन नहीं है। यह फ्लैश के माध्यम से इसे करने के लिए इन अन्य उत्तर संदर्भ तरीकों में से कुछ की तरह दिखता है, जो इसे करने का एकमात्र क्रॉस-ब्राउज़र तरीका है (अब तक मैं समझता हूं)।

इसके अलावा, ब्राउज़र-दर-ब्राउज़र आधार पर कुछ विकल्प हैं।

यह IE में सबसे सरल है, जहां आप किसी भी समय जावास्क्रिप्ट के माध्यम से क्लिपबोर्डडैटा ऑब्जेक्ट तक पहुंच सकते हैं:

window.clipboardData

(जब आप सिस्टम कट, कॉपी या पेस्ट इवेंट के बाहर ऐसा करने का प्रयास करते हैं, हालांकि, IE उपयोगकर्ता को वेब एप्लिकेशन क्लिपबोर्ड अनुमति देने के लिए संकेत देगा।)

क्रोम में, आप एक क्रोम एक्सटेंशन बना सकते हैं जो आपको क्लिपबोर्ड की अनुमति देगा (यह वही है जो हम ल्यूसिडरैट के लिए करते हैं)। तब आपके एक्सटेंशन वाले उपयोगकर्ताओं के लिए आपको सिस्टम इवेंट को स्वयं फायर करना होगा:

document.execCommand('copy');

ऐसा लगता है कि फ़ायरफ़ॉक्स में कुछ विकल्प हैं जो उपयोगकर्ताओं को क्लिपबोर्ड तक पहुंचने के लिए कुछ साइटों को अनुमति देने की अनुमति देते हैं, लेकिन मैंने इनमें से किसी भी व्यक्तिगत रूप से कोशिश नहीं की है।


2
ब्लॉग पोस्ट में उल्लेख नहीं किया गया है (मैं निकट भविष्य में इसे अपडेट करने की उम्मीद कर रहा हूं), निष्पादन में कटौती और निष्पादन को कॉपी करने की क्षमता है। यह IE10 +, Chrome 43+ और Opera29 + में समर्थित है। इसके बारे में यहां पढ़ें। updates.html5rocks.com/2015/04/cut-and-copy-commands
रिचर्ड शर्ट्ज़

इसके साथ एक समस्या यह है कि यह अन्य सामान्य कॉपी ईवेंट को हाईजैक करता है।
ब्रॉक एडम्स

नायब! यह ब्राउज़र सूँघना BAD है। सूँघने की सुविधा है। आप IE को अद्यतन करने के लिए इसे कठिन बना रहे हैं।
ओडिन्हो - वेलमॉन्ट

51

क्लिपबोर्ड.जेएस एक छोटी, गैर-फ्लैश, उपयोगिता है जो क्लिपबोर्ड पर पाठ या एचटीएमएल डेटा की प्रतिलिपि बनाने की अनुमति देता है। इसका उपयोग करना बहुत आसान है, बस .js को शामिल करें और कुछ इस तरह का उपयोग करें:

<button id='markup-copy'>Copy Button</button>

<script>
document.getElementById('markup-copy').addEventListener('click', function() {
  clipboard.copy({
    'text/plain': 'Markup text. Paste me into a rich text editor.',
    'text/html': '<i>here</i> is some <b>rich text</b>'
  }).then(
    function(){console.log('success'); },
    function(err){console.log('failure', err);
  });

});
</script>

क्लिपबोर्ड.जेएस गीथहब पर भी है

नोट: इसे अब हटा दिया गया है। विस्थापित करने के लिए यहाँ


इस लाइब्रेरी का उपयोग angular.io द्वारा अपने टूर ऑफ हीरो के लिए किया जाता है और ब्राउज़र के लिए सुंदर मोड में कमबैक किया जाता है, जो कि एक अनचाहे टेक्स्ट को प्रदर्शित करने के लिए उपयोगकर्ता को कॉपी करने के लिए निष्पादित नहीं करता है।
जॉन-फिलिप

1
ऐसा लगता है कि क्लिपबोर्ड.जेएस को बदल दिया गया है, या कांटा लगा दिया गया है, लेकिन यह जीवित प्रतीत होता है और सक्रिय रूप से npmjs.com/package/clipboard
Joao

35

ZeroClipboard मेरे द्वारा पाया गया सबसे अच्छा क्रॉस-ब्राउज़र समाधान है:

<div id="copy" data-clipboard-text="Copy Me!">Click to copy</div>    
<script src="ZeroClipboard.js"></script>
<script>
  var clip = new ZeroClipboard( document.getElementById('copy') );
</script>

अगर आपको iOS के लिए नॉन-फ्लैश सपोर्ट चाहिए तो आप बस एक फॉल-बैक जोड़ें:

clip.on( 'noflash', function ( client, args ) {
    $("#copy").click(function(){            
        var txt = $(this).attr('data-clipboard-text');
        prompt ("Copy link, then click OK.", txt);
    });
});  

http://zeroclipboard.org/

https://github.com/zeroclipboard/ZeroClipboard


25
फ़्लैश के साथ पार ब्राउज़र? iOS और Android 4.4 में काम नहीं कर रहा है
रैप्टर

1
अद्यतन उत्तर देखें। यह फ्लैश-उपयोगकर्ताओं के लिए कम कदम और बाकी सभी के लिए गिरावट की अनुमति देता है।
जस्टिन

8
यह कोड की एक बिलियन लाइनें है। यह बिल्कुल हास्यास्पद है। बेहतर नहीं है कि एक परियोजना में इस तरह के एक राक्षस को शामिल करने की तुलना में
vsync

2
एक साधारण संस्करण है gist.github.com/JamesMGreene/8698897 जो कि 20K है जिसमें 74k संस्करण में सभी घंटियाँ और सीटी नहीं हैं। न ही बहुत बड़ा है। मेरा अनुमान है कि अधिकांश उपयोगकर्ता अतिरिक्त मिलीसेकंड के साथ ठीक हैं कि एक 74k या 20k फ़ाइल डाउनलोड की जा रही है, इसलिए कॉपी / पेस्ट दो के बजाय एक क्लिक पर होगी।
जस्टिन

@ जस्टिन मैं सिर्फ स्थानीय स्तर पर काम नहीं कर सकता, भले ही मैं उदाहरणों की प्रतिलिपि बनाता / चिपकाऊं (मैं न्यूनतम बदलाव करता हूं, जैसे srcस्क्रिप्ट टैग में मूल्य )। मुझे लगता है कि उनका दस्तावेज़ीकरण बहुत सुंदर है लेकिन अक्षम है।
गुई इमामुरा

29

2018 में, यहां बताया गया है कि आप इसके बारे में कैसे जा सकते हैं:

async copySomething(text?) {
  try {
    const toCopy = text || location.href;
    await navigator.clipboard.writeText(toCopy);
    console.log('Text or Page URL copied');
  }
  catch (err) {
    console.error('Failed to copy: ', err);
  }
}

इसका उपयोग मेरे कोणीय 6+ कोड में किया जाता है:

<button mat-menu-item (click)="copySomething()">
    <span>Copy link</span>
</button>

यदि मैं एक स्ट्रिंग में गुजरता हूं, तो यह इसे कॉपी करता है। यदि कुछ नहीं है, तो यह पृष्ठ के URL की प्रतिलिपि बनाता है।

क्लिपबोर्ड सामान के लिए अधिक जिमनास्टिक भी किया जा सकता है। अधिक जानकारी यहाँ देखें:

क्लिपबोर्ड एक्सेस को अनब्लॉक करना


आप लोकलहोस्ट से जुड़े हैं
जो वार्नर

2
कृपया ध्यान रखें कि यह सफारी में काम नहीं करता है (संस्करण 11.1.2)
arjun27

1
@ arjun27 किसी दिन उम्मीद है कि एप्पल पकड़ लेगा। यद्यपि यह caniuse.com/#feat=clipboard उपरोक्त संस्करण दिखाता है जिसका आपने आंशिक रूप से समर्थन किया है।
खोही

2
मैं पढ़ने के लिए दोनों काम कर रहा हूँ, लिखो, अस्वीकार किए गए राज्य में एक वचन लिखो
ramin

3
उपलब्ध कराए गए लिंक के अनुसार, "navigator.clipboard केवल HTTPS पर दिए गए पृष्ठों के लिए समर्थित है"
टिमएच - कोडिडक्ट

26

जिन परियोजनाओं पर मैं काम कर रहा हूँ उनमें से एक से, एक jQuery कॉपी-टू-क्लिपबोर्ड प्लगइन जो शून्य क्लिपबोर्ड लाइब्रेरी का उपयोग करता है ।

यदि आप एक भारी jQuery उपयोगकर्ता हैं, तो मूल शून्य क्लिपबोर्ड प्लगइन की तुलना में इसका उपयोग करना आसान है।


6
92kb वास्तव में इतना बड़ा नहीं है, यह तेजी से काम करता है और यदि आप चाहें तो text()इसके बजाय उपयोग कर सकते हैं innerHTML()..
RozzA

17
@ जॉन: innerHTMLको लंबे समय से क्रॉस-ब्राउज़र का समर्थन किया गया है। सिर्फ इसलिए कि Microsoft मूल रूप से इस विचार के साथ आया था कि यह इसे अविश्वसनीय या मालिकाना नहीं बनाता है। यह भी अब है अंत में आधिकारिक कल्पना (के बाद हर प्रमुख ब्राउज़र विक्रेता पहले से ही के लिए समर्थन जोड़ा ... में जोड़ा जा रहा विलाप )।
जेम्स एम। ग्रीन

19
@ जॉन आप शिकायत करते हैं कि jQuery के एक जवाब में पर्याप्त नहीं है जो फ्लैश का उपयोग करता है;)
मैक्स नानसी

4
ज्यादातर मामलों में आंतरिक HTML विकल्प से बेहतर है। अपने ऊंचे घोड़े को हटाओ! यह अधिक तेज़ है, अधिक कुशल है और इसके लिए फिर से रेंडर करने की आवश्यकता नहीं है।
ईडन

4
@ रोज़ा 92KBवाकई बहुत बड़ी है। इस समय तक एलटीई परिपक्व जीपीआरएस है WW मोबाइल डेटा मानक , और यह पर शुरू होता है 1 KB/s। गणित स्वयं करें।
टीनो

23

चूंकि क्रोम 42+ और फ़ायरफ़ॉक्स 41+ अब document.execCommand ('कॉपी') कमांड का समर्थन करते हैं । इसलिए मैंने टिम डाउन के पुराने उत्तर और Google डेवलपर के उत्तर के संयोजन का उपयोग करके क्रॉस-ब्राउज़र कॉपी-टू-क्लिपबोर्ड क्षमता के लिए कुछ फ़ंक्शन बनाए :

function selectElementContents(el) {
    // Copy textarea, pre, div, etc.
    if (document.body.createTextRange) {
        // IE
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.select();
        textRange.execCommand("Copy");
    } 
    else if (window.getSelection && document.createRange) {
        // Non-Internet Explorer
        var range = document.createRange();
        range.selectNodeContents(el);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
        try {
            var successful = document.execCommand('copy');
            var msg = successful ? 'successful' : 'unsuccessful';
            console.log('Copy command was ' + msg);
        }
        catch (err) {
            console.log('Oops, unable to copy');
        }
    }
} // end function selectElementContents(el)

function make_copy_button(el) {
    var copy_btn = document.createElement('input');
    copy_btn.type = "button";
    el.parentNode.insertBefore(copy_btn, el.nextSibling);
    copy_btn.onclick = function() {
        selectElementContents(el);
    };

    if (document.queryCommandSupported("copy") || parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2]) >= 42) {
        // Copy works with Internet Explorer 4+, Chrome 42+, Firefox 41+, Opera 29+
        copy_btn.value = "Copy to Clipboard";
    }
    else {
        // Select only for Safari and older Chrome, Firefox and Opera
        copy_btn.value = "Select All (then press Ctrl + C to Copy)";
    }
}
/* Note: document.queryCommandSupported("copy") should return "true" on browsers that support copy
    but there was a bug in Chrome versions 42 to 47 that makes it return "false".  So in those
    versions of Chrome feature detection does not work!
    See https://code.google.com/p/chromium/issues/detail?id=476508
*/

make_copy_button(document.getElementById("markup"));
<pre id="markup">
  Text that can be copied or selected with cross browser support.
</pre>


इस संक्षेप के लिए धन्यवाद! आपके कोड में थोड़ी गलतियाँ हैं: आपने "रेंज" वेरिएबल को दो बार परिभाषित किया है (var range = document.createRange ())।
क्रिश्चियन एंगेल

1
आप @ChristianEngel सही हैं। मैंने दूसरा हटा दिया है। मुझे नहीं पता कि इसमें कैसे मिला।
जेफ बेकर

23

मैं इसे बहुत सफलतापूर्वक ( jQuery या किसी अन्य ढांचे के बिना ) का उपयोग करता हूं ।

function copyToClp(txt){
    txt = document.createTextNode(txt);
    var m = document;
    var w = window;
    var b = m.body;
    b.appendChild(txt);
    if (b.createTextRange) {
        var d = b.createTextRange();
        d.moveToElementText(txt);
        d.select();
        m.execCommand('copy');
    } 
    else {
        var d = m.createRange();
        var g = w.getSelection;
        d.selectNodeContents(txt);
        g().removeAllRanges();
        g().addRange(d);
        m.execCommand('copy');
        g().removeAllRanges();
    }
    txt.remove();
}

चेतावनी

टैब रिक्त स्थान में परिवर्तित हो जाते हैं (कम से कम क्रोम में)।


इस दृष्टिकोण में रिक्तियाँ गायब हैं
बिक्रम

1
क्रोम। टैब को एक स्थान पर बदल दिया जाता है
बिक्रम

22

मुझे निम्नलिखित समाधान मिला:

नीचे की ओर हैंडलर "प्री" टैग बनाता है। हम इस टैग पर प्रतिलिपि बनाने के लिए सामग्री सेट करते हैं, फिर इस टैग पर चयन करते हैं और हैंडलर में सच लौटाते हैं। यह क्रोम के मानक हैंडलर को बुलाता है और चयनित पाठ को कॉपी करता है।

और अगर आपको ज़रूरत है तो आपको पिछले चयन को पुनर्स्थापित करने के लिए फ़ंक्शन के लिए समय-सीमा निर्धारित की जा सकती है। मुतूलों पर मेरा अमल:

   function EnybyClipboard() {
     this.saveSelection = false;
     this.callback = false;
     this.pastedText = false;

     this.restoreSelection = function() {
       if (this.saveSelection) {
         window.getSelection().removeAllRanges();
         for (var i = 0; i < this.saveSelection.length; i++) {
           window.getSelection().addRange(this.saveSelection[i]);
         }
         this.saveSelection = false;
       }
     };

     this.copyText = function(text) {
       var div = $('special_copy');
       if (!div) {
         div = new Element('pre', {
           'id': 'special_copy',
           'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;'
         });
         div.injectInside(document.body);
       }
       div.set('text', text);
       if (document.createRange) {
         var rng = document.createRange();
         rng.selectNodeContents(div);
         this.saveSelection = [];
         var selection = window.getSelection();
         for (var i = 0; i < selection.rangeCount; i++) {
           this.saveSelection[i] = selection.getRangeAt(i);
         }
         window.getSelection().removeAllRanges();
         window.getSelection().addRange(rng);
         setTimeout(this.restoreSelection.bind(this), 100);
       } else return alert('Copy not work. :(');
     };

     this.getPastedText = function() {
       if (!this.pastedText) alert('Nothing to paste. :(');
       return this.pastedText;
     };

     this.pasteText = function(callback) {
       var div = $('special_paste');
       if (!div) {
         div = new Element('textarea', {
           'id': 'special_paste',
           'style': 'opacity: 0;position: absolute;top: -10000px;right: 0;'
         });
         div.injectInside(document.body);
         div.addEvent('keyup', function() {
           if (this.callback) {
             this.pastedText = $('special_paste').get('value');
             this.callback.call(null, this.pastedText);
             this.callback = false;
             this.pastedText = false;
             setTimeout(this.restoreSelection.bind(this), 100);
           }
         }.bind(this));
       }
       div.set('value', '');
       if (document.createRange) {
         var rng = document.createRange();
         rng.selectNodeContents(div);
         this.saveSelection = [];
         var selection = window.getSelection();
         for (var i = 0; i < selection.rangeCount; i++) {
           this.saveSelection[i] = selection.getRangeAt(i);
         }
         window.getSelection().removeAllRanges();
         window.getSelection().addRange(rng);
         div.focus();
         this.callback = callback;
       } else return alert('Fail to paste. :(');
     };
   }

उपयोग:

enyby_clip = new EnybyClipboard(); //init 

enyby_clip.copyText('some_text'); // place this in CTRL+C handler and return true;

enyby_clip.pasteText(function callback(pasted_text) {
        alert(pasted_text);
}); // place this in CTRL+V handler and return true;

पेस्ट करने पर यह टेक्सटरिया बनाता है और उसी तरह काम करता है।

PS हो सकता है यह समाधान फ्लैश के बिना पूरी तरह से क्रॉस-ब्राउज़र समाधान बनाने के लिए उपयोग किया जा सकता है। एफएफ और क्रोम में इसका काम करता है।


2
क्या किसी ने कोशिश की है? यदि यह वास्तव में ब्राउज़रों की श्रेणी में काम करता है, तो एक निफ्टी चीज़ की तरह लगता है!
माइकल

1
jsfiddle.net/H2FHC डेमो: fiddle.jshell.net/H2FHC/show कृपया इसे खोलें और Ctrl + V या Ctrl + C दबाएं। एफएफ 19.0 में कांटे पूरी तरह से। क्रोम में 25.0.1364.97 मी। ओपेरा 12.14 - ठीक है। विंडोज के लिए सफारी 5.1.7 - ठीक है। IE - विफल।
Enyby

IE के लिए पृष्ठ के अंदर तत्व पर रन फोकस की आवश्यकता है। IE 9/10 में fiddle.jshell.net/H2FHC/3/show और fiddle.jshell.net/H2FHC/3 देखें । IE 6/7 जरूरत प्रक्रिया को अन्य तरीके से चयन करना है क्योंकि document.createRange समर्थित नहीं है।
एनबीबी

21

अन्य तरीके क्लिपबोर्ड पर सादे पाठ की नकल करेंगे। HTML की प्रतिलिपि बनाने के लिए (यानी, आप WSIWYG संपादक में परिणाम पेस्ट कर सकते हैं), आप केवल IE में निम्नलिखित कर सकते हैं । यह मूल रूप से अन्य विधियों से अलग है, क्योंकि ब्राउज़र वास्तव में सामग्री का चयन करता है।

// create an editable DIV and append the HTML content you want copied
var editableDiv = document.createElement("div");
with (editableDiv) {
    contentEditable = true;
}     
editableDiv.appendChild(someContentElement);          

// select the editable content and copy it to the clipboard
var r = document.body.createTextRange();
r.moveToElementText(editableDiv);
r.select();  
r.execCommand("Copy");

// deselect, so the browser doesn't leave the element visibly selected
r.moveToElementText(someHiddenDiv);
r.select();   

देखना और अधिक पूर्ण एचटीएमएल यहाँ समाधान stackoverflow.com/questions/34191780/...
kofifus

21

मैंने एक साथ रखा है जो मुझे लगता है कि सबसे अच्छा है।

  • सीधे स्टाइल के विपरीत इंटरनेट एक्सप्लोरर में अपवादों से बचने के लिए cssText का उपयोग करता है।
  • यदि एक था, तो चयन को पुनर्स्थापित करता है
  • आसानी से सेट हो जाता है ताकि कीबोर्ड मोबाइल उपकरणों पर न आए
  • आईओएस के लिए एक वर्कअराउंड है ताकि यह वास्तव में काम करे क्योंकि यह सामान्य रूप से एक्ज़ीकॉम ब्लॉक करता है।

यह रहा:

const copyToClipboard = (function initClipboardText() {
  const textarea = document.createElement('textarea');

  // Move it off screen.
  textarea.style.cssText = 'position: absolute; left: -99999em';

  // Set to readonly to prevent mobile devices opening a keyboard when
  // text is .select()'ed.
  textarea.setAttribute('readonly', true);

  document.body.appendChild(textarea);

  return function setClipboardText(text) {
    textarea.value = text;

    // Check if there is any content selected previously.
    const selected = document.getSelection().rangeCount > 0 ?
      document.getSelection().getRangeAt(0) : false;

    // iOS Safari blocks programmtic execCommand copying normally, without this hack.
    // /programming/34045777/copy-to-clipboard-using-javascript-in-ios
    if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
      const editable = textarea.contentEditable;
      textarea.contentEditable = true;
      const range = document.createRange();
      range.selectNodeContents(textarea);
      const sel = window.getSelection();
      sel.removeAllRanges();
      sel.addRange(range);
      textarea.setSelectionRange(0, 999999);
      textarea.contentEditable = editable;
    }
    else {
      textarea.select();
    }

    try {
      const result = document.execCommand('copy');

      // Restore previous selection.
      if (selected) {
        document.getSelection().removeAllRanges();
        document.getSelection().addRange(selected);
      }

      return result;
    }
    catch (err) {
      console.error(err);
      return false;
    }
  };
})();

उपयोग: copyToClipboard('some text')


13

फ्लैश 10 के रूप में, आप केवल क्लिपबोर्ड पर कॉपी कर सकते हैं यदि कार्रवाई फ्लैश ऑब्जेक्ट के साथ उपयोगकर्ता इंटरैक्शन से उत्पन्न होती है। ( एडोब की फ्लैश 10 घोषणा से संबंधित अनुभाग पढ़ें )

समाधान कॉपी बटन के ऊपर एक फ्लैश ऑब्जेक्ट को खत्म करना है, या जो भी तत्व कॉपी शुरू करता है। जीरो क्लिपबोर्ड वर्तमान में इस कार्यान्वयन के साथ सबसे अच्छा पुस्तकालय है। अनुभवी फ्लैश डेवलपर्स सिर्फ अपनी खुद की लाइब्रेरी बनाना चाहते हैं।


12

  <!DOCTYPE html>

  <style>
    #t {
      width: 1px
      height: 1px
      border: none
    }
    #t:focus {
      outline: none
    }
  </style>

  <script>
    function copy(text) {
      var t = document.getElementById('t')
      t.innerHTML = text
      t.select()
      try {
        var successful = document.execCommand('copy')
        var msg = successful ? 'successfully' : 'unsuccessfully'
        console.log('text coppied ' + msg)
      } catch (err) {
        console.log('Unable to copy text')
      }
      t.innerHTML = ''
    }
  </script>

  <textarea id=t></textarea>

  <button onclick="copy('hello world')">
    Click me
  </button>


सबसे अच्छा जवाब: डी, ​​आप इसे कुछ इस तरह से सुधार सकते हैं: # टी {स्थिति: निरपेक्ष; बायां: 0; z-index: -900; चौड़ाई: 0px; ऊंचाई: 0px; सीमा: कोई नहीं; } तो यह पूरी तरह से छिपा जा रहा है! लेकिन वास्तव में धन्यवाद भाई!
फेडेरिको नवरेट

#t {resize: none;}
SmartManoj

एक स्पष्टीकरण क्रम में होगा।
पीटर मोर्टेंसन

12

मुझे निम्नलिखित समाधान मिला:

मेरे पास छिपे इनपुट में पाठ है। क्योंकि setSelectionRangeछिपे हुए इनपुट पर काम नहीं करता है, मैंने अस्थायी रूप से पाठ के प्रकार को बदल दिया, पाठ की प्रतिलिपि बनाई और फिर इसे फिर से छिपा दिया। यदि आप किसी तत्व से पाठ की प्रतिलिपि बनाना चाहते हैं, तो आप इसे फ़ंक्शन में पास कर सकते हैं और इसकी सामग्री को लक्ष्य चर में सहेज सकते हैं।

jQuery('#copy').on('click', function () {
    copyToClipboard();
});

function copyToClipboard() {
    var target = jQuery('#hidden_text');

    // Make it visible, so can be focused
    target.attr('type', 'text');
    target.focus();
    // Select all the text
    target[0].setSelectionRange(0, target.val().length);

    // Copy the selection
    var succeed;
    try {
        succeed = document.execCommand("copy");
    }
    catch (e) {
        succeed = false;
    }

    // Hide input again
    target.attr('type', 'hidden');

    return succeed;
}

11

HTML इनपुट से क्लिपबोर्ड पर टेक्स्ट कॉपी करें:

 function myFunction() {
   /* Get the text field */
   var copyText = document.getElementById("myInput");

   /* Select the text field */
   copyText.select();

   /* Copy the text inside the text field */
   document.execCommand("Copy");

   /* Alert the copied text */
   alert("Copied the text: " + copyText.value);
 }
 <!-- The text field -->
 <input type="text" value="Hello Friend" id="myInput">

 <!-- The button used to copy the text -->
<button onclick="myFunction()">Copy text</button>

नोट: विधि पहले इंटरनेट एक्सप्लोरर 9 में समर्थित नहीं है और।document.execCommand()

स्रोत : W3Schools - क्लिपबोर्ड पर कॉपी पाठ


11

पहले से ही कई उत्तर हैं, हालांकि एक (jQuery) जोड़ना पसंद करते हैं। किसी भी ब्राउज़र पर महान काम करता है, मोबाइल वाले भी (यानी, सुरक्षा के बारे में संकेत देते हैं, लेकिन जब आप इसे स्वीकार करते हैं तो यह ठीक काम करता है)।

function appCopyToClipBoard(sText)
{
    var oText = false,
        bResult = false;
    try
    {
        oText = document.createElement("textarea");
        $(oText).addClass('clipboardCopier').val(sText).insertAfter('body').focus();
        oText.select();
        document.execCommand("Copy");
        bResult = true;
    }
    catch(e) {
    }

    $(oText).remove();
    return bResult;
}

आपके कोड में:

if (!appCopyToClipBoard('Hai there! This is copied to the clipboard.'))
{
    alert('Sorry, copy to clipboard failed.');
}

9

यह अन्य उत्तरों के बीच थोड़ा सा संयोजन है।

var copyToClipboard = function(textToCopy){
    $("body")
        .append($('<textarea name="fname" class="textToCopyInput"/>' )
        .val(textToCopy))
        .find(".textToCopyInput")
        .select();
      try {
        var successful = document.execCommand('copy');
        var msg = successful ? 'successful' : 'unsuccessful';
        alert('Text copied to clipboard!');
      } catch (err) {
          window.prompt("To copy the text to clipboard: Ctrl+C, Enter", textToCopy);
      }
     $(".textToCopyInput").remove();
}

यह jQuery का उपयोग करता है, लेकिन यह निश्चित रूप से नहीं है। आप चाहें तो इसे बदल सकते हैं। मेरे पास अपने निपटान के लिए सिर्फ jQuery था। आप यह सुनिश्चित करने के लिए कुछ सीएसएस भी जोड़ सकते हैं कि इनपुट नहीं दिखा। उदाहरण के लिए कुछ इस तरह:

.textToCopyInput{opacity: 0; position: absolute;}

या निश्चित रूप से आप कुछ इनलाइन स्टाइल भी कर सकते हैं

.append($('<textarea name="fname" style="opacity: 0;  position: absolute;" class="textToCopyInput"/>' )

चर डेटा से सीधे कॉपी कैसे करें:। Var str = "word"; ?

चर संदेश अप्रयुक्त है
मल्लाह

मामले textToCopyमें '<textarea class = "textToCopyInput" /> </ textarea> का उपयोग करना बेहतर है\n
मल्लाह

8

IE के अलावा ब्राउज़रों में आपको क्लिपबोर्ड में हेरफेर करने के लिए एक छोटी फ्लैश ऑब्जेक्ट का उपयोग करने की आवश्यकता होती है, जैसे


यह अब पुराना है ... GvS द्वारा सुझाव की जाँच करें
Mottie

6
जीवीएस द्वारा सुझाव एक फ्लैश फिल्म का उपयोग करता है? क्या यह वही विचार नहीं है?
EmirOfGroofunkistan

8

मुझे एक ही समस्या थी कि कस्टम ग्रिड एडिट (एक्सेल जैसी चीज़) और एक्सेल के साथ संगतता का निर्माण। मुझे कई कोशिकाओं का चयन करने, कॉपी करने और चिपकाने का समर्थन करना पड़ा।

समाधान: एक टेक्स्टारिया बनाएं जहां आप उपयोगकर्ता को कॉपी करने के लिए डेटा डालेंगे (मेरे लिए जब उपयोगकर्ता कोशिकाओं का चयन कर रहा है), तो उस पर ध्यान केंद्रित करें (उदाहरण के लिए, जब उपयोगकर्ता प्रेस करता है Ctrl ) और पूरे पाठ का चयन करें।

तो, जब उपयोगकर्ता Ctrl+ माराC तो उसे कॉपी की गई सेल मिलती हैं। परीक्षण करने के बाद सिर्फ एक पिक्सेल के लिए textarea का आकार बदलना (अगर यह प्रदर्शन पर काम कर रहा होगा तो मैंने परीक्षण नहीं किया: कोई नहीं)। यह सभी ब्राउज़रों पर अच्छी तरह से काम करता है, और यह उपयोगकर्ता के लिए पारदर्शी है।

Pasting - आप ऐसा ही कर सकते हैं (अपने लक्ष्य पर अलग-अलग) - textarea पर ध्यान रखें और पेस्ट घटनाओं का उपयोग करके onpaste का उपयोग करें (अपनी परियोजना में मैं संपादित करने के लिए कक्षों में textareas का उपयोग करता हूं)।

मैं एक उदाहरण (कमर्शियल प्रोजेक्ट) पेस्ट नहीं कर सकता, लेकिन आपको इसका अंदाजा है।


7

मैंने क्लिपबोर्ड का उपयोग किया है। जेएस

हम इसे npm पर प्राप्त कर सकते हैं:

npm install clipboard --save

और बोवर पर भी

bower install clipboard --save

उपयोग और उदाहरण https://zenorocha.github.io/clipboard.js/ पर हैं


मुझे डर था कि यह गतिशील सामग्री के साथ संगत नहीं था, लेकिन यह ;-) मुझे लगता है कि यह बेहतर समाधान है, अब, 2008 के पुराने की तुलना में।
बेनार्ड पैट्रिक


6

यह @ चेस के उत्तर का विस्तार है, इस लाभ के साथ कि यह IE9 पर DIVs ही नहीं, IMAGE और टेबल तत्वों के लिए काम करेगा।

if (document.createRange) {
    // IE9 and modern browsers
    var r = document.createRange();
    r.setStartBefore(to_copy);
    r.setEndAfter(to_copy);
    r.selectNode(to_copy);
    var sel = window.getSelection();
    sel.addRange(r);
    document.execCommand('Copy');  // does nothing on FF
} else {
    // IE 8 and earlier.  This stuff won't work on IE9.
    // (unless forced into a backward compatibility mode,
    // or selecting plain divs, not img or table). 
    var r = document.body.createTextRange();
    r.moveToElementText(to_copy);
    r.select()
    r.execCommand('Copy');
}

5

ऐसा लगता है कि मैं प्रश्न को गलत मानता हूं, लेकिन संदर्भ के लिए, आप डोम की एक सीमा निकाल सकते हैं (क्लिपबोर्ड पर नहीं), सभी आधुनिक ब्राउज़रों के साथ संगत), और क्लिपबोर्ड के व्यवहार को प्राप्त करने के लिए इसे ऑनकोपी और ऑनपेस्ट और ऑनबॉस्पस्ट घटनाओं के साथ संयोजित करें। इसे प्राप्त करने के लिए यहाँ कोड है:

function clipBoard(sCommand) {
  var oRange=contentDocument.createRange();
  oRange.setStart(startNode, startOffset);
  oRange.setEnd(endNode, endOffset);
/* This is where the actual selection happens.
in the above, startNode and endNode are dom nodes defining the beginning 
and end of the "selection" respectively. startOffset and endOffset are 
constants that are defined as follows:

END_TO_END: 2
END_TO_START: 3
NODE_AFTER: 1
NODE_BEFORE: 0
NODE_BEFORE_AND_AFTER: 2
NODE_INSIDE: 3
START_TO_END: 1
START_TO_START: 0

and would be used like oRange.START_TO_END */
      switch(sCommand) {
    case "cut":
          this.oFragment=oRange.extractContents();
      oRange.collapse();
      break;
    case "copy":
      this.oFragment=oRange.cloneContents();
      break;
    case "paste":
      oRange.deleteContents();
      var cloneFragment=this.oFragment.cloneNode(true)
      oRange.insertNode(cloneFragment);
      oRange.collapse();
      break;
  }
}

1
वास्तव में मैंने कोड को सही किया। यह सभी ब्राउज़रों में काम करता है लेकिन वास्तव में क्लिपबोर्ड पर कॉपी नहीं करता है। बस अर्क (कटौती), क्लोन (प्रतियां) चर के माध्यम से सामग्री। ऐसा लगता है कि मैं उपयोग भूल गया था।
mrBorna

5

मेरी गलती। यह केवल IE में काम करता है।

टेक्स्ट कॉपी करने का एक और तरीका यहाँ है:

<p>
    <a onclick="window.clipboardData.setData('text', document.getElementById('Test').innerText);">Copy</a>
</p>

9
यह वर्तमान Chrome (V31) या FireFox (v25) में काम नहीं करता है। त्रुटि यह है कि window.clipboardData अपरिभाषित है। प्लस साइड पर, यह IE9 में काम करता है। इसलिए जब तक आप अच्छे ब्राउज़रों की परवाह नहीं करते हैं और अपनी साइट को बुरे लोगों का उपयोग करने से रोकना चाहते हैं, यह आपके लिए ऐसा करने का तरीका है!
एंथनी

2
मुझे नहीं मिलता है कि इतने मूर्खतापूर्ण जवाब क्यों। w3schools.com/howto/tryit.asp?filename=tryhow_js_copy_clipboard
Martian2049

5

इंटरनेट के चारों ओर विभिन्न तरीकों को देखने के बाद मुझे केवल यही काम मिला। यह एक गन्दा विषय है। दुनिया भर में बहुत सारे समाधान पोस्ट किए गए हैं और उनमें से अधिकांश काम नहीं करते हैं। यह मेरे लिए काम किया:

नोट: यह कोड केवल तभी काम करेगा जब इसे 'तुल्यकालित' पद्धति की तरह सीधे समकालिक कोड के रूप में निष्पादित किया जाए। यदि आप अजाक्स के लिए एक अतुल्यकालिक प्रतिक्रिया या किसी अन्य अतुल्यकालिक तरीके से कॉल करते हैं तो यह काम नहीं करेगा।

copyToClipboard(text) {
    var copyText = document.createElement("input");
    copyText.type = "text";
    document.body.appendChild(copyText);
    copyText.style = "display: inline; width: 1px;";
    copyText.value = text;
    copyText.focus();
    document.execCommand("SelectAll");
    document.execCommand("Copy");
    copyText.remove();
}

मुझे लगता है कि इस कोड को मिलिसेकंड के लिए स्क्रीन पर एक 1-पिक्सेल चौड़ा घटक दिखाई देगा, लेकिन इस बारे में चिंता न करने का फैसला किया, जो कि एक वास्तविक समस्या होने पर दूसरों को संबोधित कर सकता है।


5

अपने क्लिपबोर्ड में एक चयनित पाठ ('टेक्स्ट टू कॉपी') की प्रतिलिपि बनाने के लिए, एक बुकमार्कलेट बनाएं (ब्राउज़र बुकमार्क जो जावास्क्रिप्ट निष्पादित करता है) और इसे निष्पादित करें (उस पर क्लिक करें)। यह एक अस्थायी बनावट पैदा करेगा।

GitHub से कोड:

https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d

(function (text) {
  var node = document.createElement('textarea');
  var selection = document.getSelection();

  node.textContent = text;
  document.body.appendChild(node);

  selection.removeAllRanges();
  node.select();
  document.execCommand('copy');

  selection.removeAllRanges();
  document.body.removeChild(node);
})('Text To Copy');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.