Показывать всплывающее окно разрешения для буфера обмена

Я работаю над приложением, которому требуется разрешение пользователя на чтение/запись в его буфер обмена. Я хочу заблокировать доступ к части моего веб-сайта, если они не предоставили эти разрешения. Кроме того, если они не предоставили разрешение, отобразите кнопку, при нажатии на которую в верхнем левом углу браузера отображается небольшое всплывающее окно с просьбой предоставить разрешение. Я уже пробовал использовать это, но это не работает:

async function checkClipboardPermissionAndRequest() {
  try {
    const result = await navigator.permissions.query({ name: 'clipboard-read' });
    
    if (result.state !== 'granted') {
      const permissionRequest = await navigator.permissions.request({ name: 'clipboard-read' });
      if (permissionRequest.state === 'granted') {
        console.info('Clipboard read permission granted.');
      } else {
        console.info('Clipboard read permission denied.');
      }
    } else {
      console.info('Clipboard read permission already granted.');
    }
  } catch (error) {
    console.error('Error checking clipboard permission:', error);
  }
}

// Call the function to check clipboard permissions and request if necessary
checkClipboardPermissionAndRequest();

Это было сделано только для тестирования веб-консоли, но я хочу реализовать это в своем приложении Next.js.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
107
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Основная проблема с предоставленным вами фрагментом кода — использование navigator.permissions.request(). В настоящее время в API navigator.permissions нет метода под названием request. Вот почему функция не работает должным образом.

API navigator.permissions позволяет запрашивать статус разрешений с помощью navigator.permissions.query(), но не предоставляет метода для прямого запроса разрешений. Разрешение на доступ к буферу обмена (или любому другому конфиденциальному ресурсу) обычно запрашивается неявно при попытке выполнить действие, требующее этого разрешения, например чтение или запись в буфер обмена.

Вот исправленный подход к управлению разрешениями буфера обмена:

Пример HTML:

<div id = "contentArea" style = "display: none;">
    <p>Clipboard-accessible content here.</p>
</div>

Пример js:

async function checkClipboardPermissionAndRequest() {
        const contentArea = document.getElementById('contentArea');
        try {
            const result = await navigator.permissions.query({ name: 'clipboard-read' });
            console.info(`Clipboard read permission: ${result.state}`);

            if (result.state !== 'granted') {
                try {
                    const text = await navigator.clipboard.readText();
                    console.info('Clipboard read successfully:', text);
                    console.info('Clipboard read permission granted after read attempt.');
                    contentArea.style.display = 'block';
                } catch (error) {
                    console.info('Clipboard read permission denied after read attempt:', error);
                    contentArea.style.display = 'none'; 
                }
            } else {
                console.info('Clipboard read permission was already granted.');
                contentArea.style.display = 'block';
            }
        } catch (error) {
            console.error('Error checking clipboard permission:', error);
            contentArea.style.display = 'none'; 
        }
    }

checkClipboardPermissionAndRequest();

Большое спасибо, именно этот подход я искал.

Unique Rax Law 29.04.2024 04:46

Используйте вместо const PermissionRequest = await navigator.permissions.request({ name: 'clipboard-read' });

ожидайте navigator.clipboard.read()

Самым важным является поддержка браузера, пожалуйста, проверьте там и найдите альтернативное решение для запроса разрешений и прочитайте буфер обмена

async function checkClipboardPermissionAndRequest() {
  try {
    const result = await navigator.permissions.query({ name: 'clipboard-read' });

    if (result.state !== 'granted'){
      await navigator.clipboard.read(); // denied permission will throw error can catch exception in under catch
      // or 
      //await navigator.clipboard.readText();
      console.info('Clipboard read permission granted.'); //granted permission
    }else {
      console.info('Clipboard read permission already granted.');
    }
    
  } catch (error) {
    console.info('ERROR:: Clipboard read permission denied:', error);
  }
}

// Example usage:S
checkClipboardPermissionAndRequest();

Другие вопросы по теме