在javascript中将文本复制到剪贴板时出现DOMException

csga3l58  于 2023-02-18  发布在  Java
关注(0)|答案(2)|浏览(757)

我试图用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中托管服务器。当我尝试用编码的单词做警报时,它工作得很好。

6tdlim6h

6tdlim6h1#

navigator.clipboard.writeText需要一个transient user activation。这就是为什么当你点击一个警报框时它会工作。
需要临时用户激活。用户必须与页面或UI元素交互才能使用此功能。
Permissions API的“clipboard-write”权限会自动授予处于活动选项卡中的页面。
https://devdocs.io/dom/clipboard/writetext

gr8qqesn

gr8qqesn2#

您得到的错误是因为在a_list数组中找不到所需字符时,indexOf函数返回-1。
在访问a_list数组中的元素之前,您可以检查indexOf返回的索引是否大于或等于零,如果返回的索引小于零,则只需将原始字符添加到return_message中即可。
下面是一个例子:

function encode() {
    // Define the list of characters to be substituted
    const alphabet = "abcdefghijklmnopqrstuvwxyz";
    const charList = alphabet.split('');

    // Receive the string to be substituted from the user
    const inputString = prompt("Enter the string to be substituted:");

    // Convert the string to an array of characters
    const inputChars = inputString.split('');

    // Create a new array with the substituted characters
    const outputChars = inputChars.map(char => {
      // Find the index of the current character in the character list
      const index = charList.indexOf(char.toLowerCase());

      // If the character is not in the character list, keep the original character
      if (index === -1) {
        return char;
      }

      // Find the next character in the character list
      const nextIndex = (index + 1) % charList.length;
      const nextChar = charList[nextIndex];

      // Return the next substituted character
      return char.toUpperCase() === char ? nextChar.toUpperCase() : nextChar;
    });

    // Convert the array of characters back to a string
    const outputString = outputChars.join('');

    // Display the substituted string in the console
    navigator.clipboard.writeText(outputString);
}

encode()

正如在@dotnetCarpenter reply navigator. clipboard. writeText中所回答的,writeText需要一个临时用户激活,这就是为什么当一个警告框被点击时它才能工作。

相关问题