يتألف لصق الملفات في المتصفّح من استخدام حدث paste الخاص بـ HTMLElement.
استخدام حدث paste الخاص بـ HTMLElement
كخطوة أولى، عليك إضافة متتبِّع الأحداث لحدث paste في العنصر المطلوب، ويكون ذلك عادةً على مستوى document، لذا لا يلزم التركيز على عنصر معيّن. بعد ذلك، يمكنك استخدام Clipboard API، الذي يتيح لك الوصول إلى الحقل clipboardData الخاص بحدث paste الخاص بـ HTMLElement، والذي يمكنك بعد ذلك تكرار قائمة files الخاصة به. استنادًا إلى نوع MIME لكل ملف من الملفات التي تم لصقها، يمكنك تحديد ما إذا كنت تريد عرضها على الشاشة، كما هو الحال مع صورة أو فيديو، أو لصق محتوى النص الخاص بالملف في عنصر textarea مثلاً، كما هو الحال مع ملف نصي.
document.addEventListener('paste', async (e) => {
// Prevent the default behavior, so you can code your own logic.
e.preventDefault();
if (!e.clipboardData.files.length) {
return;
}
// Iterate over all pasted files.
Array.from(e.clipboardData.files).forEach(async (file) => {
// Add more checks here for MIME types you're interested in,
// such as `application/pdf`, `video/mp4`, etc.
if (file.type.startsWith('image/')) {
// For images, create an image and append it to the `body`.
const img = document.createElement('img');
const blob = URL.createObjectURL(file);
img.src = blob;
document.body.append(img);
} else if (file.type.startsWith('text/')) {
// For text files, read the contents and output it into a `textarea`.
const textarea = document.createElement('textarea');
textarea.value = await file.text();
document.body.append(textarea);
}
});
});
محتوى إضافي للقراءة
عرض توضيحي
HTML
<!DOCTYPE html>
<html>
<head>
<title>How to paste files</title>
</head>
<body>
<h1>How to paste files</h1>
<p>Hit <kbd>⌘</kbd> + <kbd>v</kbd> (for macOS) or <kbd>ctrl</kbd> + <kbd>v</kbd>
(for other operating systems) to paste image or text file(s) anywhere in this page.
</p>
</body>
</html>CSS
html {
box-sizing: border-box;
font-family: system-ui, sans-serif;
color-scheme: dark light;
}
*, *:before, *:after {
box-sizing: inherit;
}
body {
margin: 1rem;
}
img {
height: auto;
max-width: 100%;
display: block;
}
JS
document.addEventListener('paste', async (e) => {
// Prevent the default behavior, so you can code your own logic.
e.preventDefault();
if (!e.clipboardData.files.length) {
return;
}
// Iterate over all pasted files.
Array.from(e.clipboardData.files).forEach(async (file) => {
// Add more checks here for MIME types you're interested in,
// such as `application/pdf`, `video/mp4`, etc.
if (file.type.startsWith('image/')) {
// For images, create an image and append it to the `body`.
const img = document.createElement('img');
const blob = URL.createObjectURL(file);
img.src = blob;
document.body.append(img);
} else if (file.type.startsWith('text/')) {
// For text files, read the contents and output it into a `textarea`.
const textarea = document.createElement('textarea');
textarea.value = await file.text();
document.body.append(textarea);
}
});
});