I found eclipboardData.items
not to be helpful and needed to use file_input.files = e.clipboardData.files
.
I'm having additional issue in Firefox, specifically when using a form and script that are dynamically added to the page and shown in a modal (no iframes). I found that the File
object is available DURING the paste
event, but is no longer available after.
I tried using FileReader
and creating a new File
, but ended up with the same result. I used a (bad) workaround that auto-submits the form during the paste
event, which won't be sufficient for all cases.
I have no issues with the File object later disappearing if the form & script load in the initial page request, but I want to include this just in case you're having the 'disappears after paste event' issue.
Example:
//setup the paste listener
document.body.addEventListener('paste',
async function (e){
const form = document.querySelector('form[action="/files/upload/"]');
const file_input = form.querySelector('input[type="file"]');
// display error if no files to paste
const err = form.querySelector('.file_input_error');
if (e.clipboardData.files.length == 0){
err.innerText = 'No images in the clipboard. Copy an image and try again.';
err.style.display = "block";
return;
}
file_input.files = e.clipboardData.files;
// show_file(file_input); // custom function to display the image in the form
// fire the change event
const changeEvent = new Event("change");
file_input.dispatchEvent(changeEvent);
}
);
//use a file_input change event to submit the form, so it works for both copy+paste & regularly adding the file
file_input.addEventListener('change',
function (e){
const form = document.querySelector('form[action="/files/upload/"]');
form.querySelector('input[type="submit"]').click();
}
);