我试图用javascript做一个简单的编码器,并将输出复制到剪贴板,但是代码给出了一个错误。
我试了这个代码:
function encode() {
let alphabet = " abcdefghijklmnopqrstuvwxyz1234567890-=!@#$%^&*()_+[];'/.,'{}|:~";
const a_list = alphabet.split('');
const m_list = prompt("message: ").split('');
let return_message = "";
for (let i = 0; i < m_list.length; i++) {
let current_letter = m_list[i];
let translated_letter = a_list[a_list.indexOf(current_letter) + 5];
return_message += translated_letter;
}
navigator.clipboard.writeText(return_message);
}
encode()
但控制台给出以下错误:
错误:DOM异常{索引大小错误:1,域字符串大小错误:2,层次结构请求错误:3,错误文档错误:4,无效字符错误:5、...}
我在replit中托管服务器。当我尝试用编码的单词做警报时,它工作得很好。
2条答案
按热度按时间6tdlim6h1#
navigator.clipboard.writeText
需要一个transient user activation。这就是为什么当你点击一个警报框时它会工作。需要临时用户激活。用户必须与页面或UI元素交互才能使用此功能。
Permissions API的“clipboard-write”权限会自动授予处于活动选项卡中的页面。
https://devdocs.io/dom/clipboard/writetext
gr8qqesn2#
您得到的错误是因为在a_list数组中找不到所需字符时,indexOf函数返回-1。
在访问a_list数组中的元素之前,您可以检查indexOf返回的索引是否大于或等于零,如果返回的索引小于零,则只需将原始字符添加到return_message中即可。
下面是一个例子:
正如在@dotnetCarpenter reply navigator. clipboard. writeText中所回答的,writeText需要一个临时用户激活,这就是为什么当一个警告框被点击时它才能工作。