الطريقة الحديثة
استخدام Async Clipboard API
لقراءة نص من حافظة المستخدم آليًا، مثلاً بعد النقر على زر، يمكنك استخدام طريقة readText() في Async Clipboard API. إذا لم يتم منح الأذونات اللازمة لقراءة الحافظة بعد، سيطلب استدعاء navigator.clipboard.readText() ذلك عند استدعاء الطريقة لأول مرة.
const pasteButton = document.querySelector('#paste-button');
pasteButton.addEventListener('click', async () => {
try {
const text = await navigator.clipboard.readText()
document.querySelector('textarea').value += text;
console.log('Text pasted.');
} catch (error) {
console.log('Failed to read clipboard');
}
});
الطريقة الكلاسيكية
جارٍ استخدام document.execCommand()
باستخدام document.execCommand('paste')، يمكنك لصق محتوى الحافظة في نقطة الإدراج (عنصر HTML الذي يتم التركيز عليه حاليًا). تعرض الطريقة execCommand قيمة منطقية تشير إلى ما إذا كان الحدث paste ناجحًا. ومع ذلك، تتضمّن هذه الطريقة بعض القيود، مثل أنّ لصق كميات كبيرة من البيانات قد يؤدي إلى حظر الصفحة لأنّها متزامنة.
pasteButton.addEventListener('click', () => {
document.querySelector('textarea').focus();
const result = document.execCommand('paste')
console.log('document.execCommand result: ', result);
})
التحسين التدريجي
pasteButton.addEventListener('click', async () => {
try {
const text = await navigator.clipboard.readText()
document.querySelector('textarea').value += text;
console.log('Text pasted.');
} catch (error) {
console.log('Failed to read clipboard. Using execCommand instead.');
document.querySelector('textarea').focus();
const result = document.execCommand('paste')
console.log('document.execCommand result: ', result);
}
});
محتوى إضافي للقراءة
عرض توضيحي
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🎉</text></svg>"
/>
<title>How to paste text</title>
</head>
<body>
<h1>How to paste text</h1>
<p>
<button type="button">Paste</button>
</p>
<textarea></textarea>
</body>
</html>CSS
:root {
color-scheme: dark light;
}
html {
box-sizing: border-box;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
body {
margin: 1rem;
font-family: system-ui, sans-serif;
}
button {
display: block;
}
JS
const pasteButton = document.querySelector('button');
pasteButton.addEventListener('click', async () => {
try {
const text = await navigator.clipboard.readText()
document.querySelector('textarea').value += text;
console.log('Text pasted.');
} catch (error) {
console.log('Failed to read clipboard. Using execCommand instead.');
document.querySelector('textarea').focus();
const result = document.execCommand('paste')
console.log('document.execCommand result: ', result);
}
});