为啥复制功能在 setTimeout 中不起作用?

Posted

技术标签:

【中文标题】为啥复制功能在 setTimeout 中不起作用?【英文标题】: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 中不起作用,这是一个错误吗?

【问题讨论】:

***.com/questions/18432072/…***.com/questions/48934462/… 趣味游戏:为window.copy 添加手表。这是undefined。现在在控制台中输入debugger 并观看它的显示! 【参考方案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 的控制台中似乎不起作用。

【讨论】:

优秀的答案!我在一个回调函数中使用它,该函数遍历选定的复选框并将它们的值列表复制到剪贴板。

以上是关于为啥复制功能在 setTimeout 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 memset 功能不起作用? [复制]

为啥默认约束在mysql中不起作用? [复制]

为啥 HttpServletRequest.getRemoteAddr() 在 Java servlet 中不起作用? [复制]

为啥百分号 (%) 在 crontab 中不起作用? [复制]

为啥 iframe 高度 100% 在 XHTML 页面中不起作用? [复制]

为啥 `\d` 在 sed 的正则表达式中不起作用? [复制]