调用 navigator.clipboard.readText() 时出现 DOMException

fro*_*sty 17 javascript google-chrome

以下代码行在 chrome 升级到版本 74.0.3729.169(官方版本)(64 位)后用于工作并停止工作。现在,即使权限设置正确,我也会收到 DOMException。感谢您能否解释错误和解决方法。异常详情:

消息:文档不是重点名称:NotAllowedError 代码:0

        navigator.permissions.query({ name: 'clipboard-read' }).then(result => {
            // If permission to read the clipboard is granted or if the user will
            // be prompted to allow it, we proceed.

            if (result.state === 'granted' || result.state === 'prompt') {
                navigator.clipboard.readText()
                    .then(text => {
                        //my code to handle paste
                    })
                    .catch(err => {
                        console.error('Failed to read clipboard contents: ', err);
                    });
Run Code Online (Sandbox Code Playgroud)

Mic*_*ney 42

我遇到的问题是,我收到一条警报,提示文本已被复制,这导致文档焦点消失。具有讽刺意味的是,这导致文本无法被复制。解决方法非常简单:

    clipboard.writeText(clippy_button.href).then(function(x) {
      alert("Link copied to clipboard: " + clippy_button.href);
    });
Run Code Online (Sandbox Code Playgroud)

只需在 Promise 解决时显示警报即可。这可能无法解决每个人的问题,但如果您是基于搜索错误来到这里的,这可能是您代码的正确修复方法。

  • 是的,我也遇到这个问题。讽刺的是,我从 [w3schools](https://www.w3schools.com/howto/tryit.asp?filename=tryhow_js_copy_clipboard) 复制它。删除警报或更改为异步/等待样式可以防止此问题。 (2认同)
  • @Lichi 当我在互联网上搜索任何与 javascript 相关的内容时,我总是将“mdn”添加到我的搜索行中,这样它们就会冒泡到顶部。我对 w3schools 印象不深,并避免使用它。 (2认同)

小智 14

正如 Kaiido 所说,你的 DOM 需要专注。当我在代码中放置断点时,我在开发过程中遇到了同样的问题......控制台开发人员获取了焦点并出现了错误。使用相同的代码和相同的浏览器,如果 F12 关闭,一切正常


Jan*_*nou 13

从 devtools 控制台或片段执行代码时似乎会发生这种情况。

解决方法:

您可以执行以下代码并在 3 秒内通过单击某处或仅按 来关注窗口<tab>

例如从片段

Ctrl-Enter
<Tab>

例如从控制台

Enter
<Tab>

setTimeout(async()=>console.log(
     await window.navigator.clipboard.readText()), 3000)
Run Code Online (Sandbox Code Playgroud)


Aid*_*din 10

问题

显然,这是一个安全风险。:)

解决方案

我假设当您尝试从开发工具调用它时您会遇到这个问题。好吧,为了让生活更轻松,我采用詹尼斯的答案,以一种不那么肾上腺素为导向的方式。:)

我添加了一个一次性focus侦听器,以便window在从开发工具中点击“选项卡”后神奇地完成这些操作。

function readClipboardFromDevTools() {
    return new Promise((resolve, reject) => {
        const _asyncCopyFn = (async () => {
            try {
                const value = await navigator.clipboard.readText();
                console.log(`${value} is read!`);
                resolve(value);
            } catch (e) {
                reject(e);
            }
            window.removeEventListener("focus", _asyncCopyFn);
        });
    
        window.addEventListener("focus", _asyncCopyFn);
        console.log("Hit <Tab> to give focus back to document (or we will face a DOMException);");
    });
}

// To call:
readClipboardFromDevTools().then((r) => console.log("Returned value: ", r));
Run Code Online (Sandbox Code Playgroud)

注意:返回值是一个 Promise,因为它是异步调用。

  • 这可能是[奎因程序](https://en.wikipedia.org/wiki/Quine_(computing))名人堂的候选人吗:)? (2认同)

Kai*_*ido 0

正如异常消息所示,您需要主动关注文档才能使用此 API。

  • 这就是异常所说的内容,但是如何实际解决这个问题呢?有程序化的方式吗? (2认同)