为啥复制功能在 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.log
在setTimeout
内部工作?
console
不只是一个控制台命令。它随处可用,copy
不可用。【参考方案2】:
受this answer 中提到的with
的启发,我发现您可以使用它使copy()
在setTimeout()
和其他回调中可用,而不必创建对它的全局引用:
with ( copy ) setTimeout(() => copy("copied!"), 0)
copied!
现在将出现在您的剪贴板上。不幸的是,这个技巧在 Firefox 的控制台中似乎不起作用。
【讨论】:
优秀的答案!我在一个回调函数中使用它,该函数遍历选定的复选框并将它们的值列表复制到剪贴板。以上是关于为啥复制功能在 setTimeout 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 HttpServletRequest.getRemoteAddr() 在 Java servlet 中不起作用? [复制]
为啥百分号 (%) 在 crontab 中不起作用? [复制]