Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
68
rated 0 times [  72] [ 4]  / answers: 1 / hits: 66598  / 8 Years ago, mon, march 28, 2016, 12:00:00

I have looked at many posts but could not find a clear current answer to the following two questions as it seems standards and browser support has been constantly changing.


Is it a legal operation according to the standard to change the clipboard with event.clipboardData.setData inside a 'copy' event handler?


More From » html

 Answers
29

Clipboard APIs were indeed in active development as of 2016, but things have stabilized since then:



Using event.clipboardData.setData() is supported



Changing the clipboard with event.clipboardData.setData() inside a 'copy' event handler is allowed by the spec (as long as the event is not synthetic).



Note that you need to prevent the default action in the event handler to prevent your changes from being overwritten by the browser:



document.addEventListener('copy', function(e){
e.clipboardData.setData('text/plain', 'foo');
e.preventDefault(); // default behaviour is to copy any selected text
});


To trigger the copy event use execCommand



If you need to trigger the copy event (and not just handle the copy requests made by the user via the browser UI), you must use document.execCommand('copy'). It will only work in certain handlers, such as the click handler:



document.getElementById(copyBtn).onclick = function() {
document.execCommand('copy');
}


Modern browsers support both methods





https://github.com/garykac/clipboard/blob/master/clipboard.md has a compatibility table for execCommand(cut / copy / paste).



You can test this using the snippet below, please comment with the results.



More resources





Testcase





window.onload = function() {
document.addEventListener('copy', function(e){
console.log(copy handler);
if (document.getElementById(enableHandler).checked) {
e.clipboardData.setData('text/plain', 'Current time is ' + new Date());
e.preventDefault(); // default behaviour is to copy any selected text
}
// This is just to simplify testing:
setTimeout(function() {
var tb = document.getElementById(target);
tb.value = ;
tb.focus();
}, 0);
});
document.getElementById(execCopy).onclick = function() {
document.execCommand('copy'); // only works in click handler or other user-triggered thread
}
document.getElementById(synthEvt).onclick = function() {
var e = new ClipboardEvent(copy, {dataType: text/plain, data:bar});
document.dispatchEvent(e);
}
}

<html>
<input id=enableHandler type=checkbox checked>
<label for=enableHandler>Run clipboardData.setData('text/plain', ...) in the copy handler</label>
<p>Try selecting this text and triggering a copy using</p>
<ul>
<li><button id=execCopy>document.execCommand('copy')</button> - should work.</li>
<li><button id=synthEvt>document.dispatchEvent(clipboardEvent)</button> - should NOT work</li>
<li>with keyboard shortcut - should work</li>
<li>or from the context menu - should work</li>
</ul>
<p>If the copy handler was triggered, the focus will move to the textbox below automatically, so that you can try pasting from clipboard:</p>
<input type=text id=target size=80>





Async Clipboard API will provide a simpler way to manage the clipboard



When implemented, navigator.clipboard will let you write code like this:



navigator.clipboard.writeText('Text to be copied')
.then(() => {
console.log('Text copied to clipboard');
})
.catch(err => {
// This can happen if the user denies clipboard permissions:
console.error('Could not copy text: ', err);
});


Chrome 66 starts shipping a partial implementation, and they've published an article about the new API.


[#62776] Saturday, March 26, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
lelasamiraa

Total Points: 208
Total Questions: 99
Total Answers: 107

Location: Uzbekistan
Member since Tue, Nov 30, 2021
3 Years ago
;