【问题标题】:Why copy function is not working inside setTimeout?为什么复制功能在 setTimeout 中不起作用?
【发布时间】:2018-08-08 06:51:34
【问题描述】:

当我尝试在setTimeout 中使用copy 时,Chrome 会抱怨。

setTimeout(function () { copy('a') }, 0)

Uncaught ReferenceError: copy is not defined
    at <anonymous>:1:26

它也不适用于window 范围。

setTimeout(function () { window.copy('a') }, 0)

Uncaught TypeError: window.copy is not a function

有趣的是,如果我保留对 copy 的引用并重复使用它,它就可以工作

cc = copy;
setTimeout(function () { cc('a') }, 0);

在 Firefox 中,它不会引发任何错误,但即使使用已保存的引用,它也不起作用。

为什么copy 函数在setTimeout 中不起作用,这是一个错误吗?

【问题讨论】:

标签: javascript google-chrome firefox google-chrome-devtools firefox-developer-tools


【解决方案1】:

copy 是开发者工具Command Line API 的一部分,在浏览器控制台之外不可用。例如,尝试在作为普通网页一部分的 JavaScript 文件中执行命令,您会得到相同的错误。

当您在setTimeout 回调中调用命令时,执行上下文不再是控制台,因此copy 不再存在。

【讨论】:

  • 如果您想将 DOM 输入元素值复制到剪贴板,那么您可以在选择此示例代码中提到的输入元素后使用此 javascript 代码 document.exeCommand("Copy") 执行复制命令w3schools.com/howto/howto_js_copy_clipboard.asp
  • 但是为什么console.logsetTimeout 内部工作?
  • console 不只是一个控制台命令。它随处可用,copy 不可用。
【解决方案2】:

this answer 中提到的with 的启发,我发现您可以使用它使copy()setTimeout() 和其他回调中可用,而不必创建对它的全局引用:

with ({ copy }) { setTimeout(() => copy("copied!"), 0) }

copied! 现在将出现在您的剪贴板上。不幸的是,这个技巧在 Firefox 的控制台中似乎不起作用。

【讨论】:

  • 优秀的答案!我在一个回调函数中使用它,该函数遍历选定的复选框并将它们的值列表复制到剪贴板。
猜你喜欢
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多