全面的前端编程教程 - 秘密武器开发者中心

热搜:m1 代理 前端 301

原生的JavaScript来复制文本内容

2024-01-10 16:50:41

在HTML中使用原生的JavaScript来复制文本,通常会涉及到创建一个临时的 `textarea` 或者 `input` 元素,将需要复制的文本设置到该元素的 `value` 属性中,然后执行复制命令。关于按钮的一部分,你可以保持不变。下面是如何实现此功能的代码示例:


首先,需要一个按钮来触发复制操作,这个按钮可以保持不变,但是去掉内联 `onclick` 事件处理,最好将事件监听器放在单独的脚本中,以遵循良好的实践:

<button id="copyButton" class="btn btn-default" value="复制">复制</button>

此外,需要一个元素来显示输出内容的地方,这里我使用了 `div`,你可以根据实际情况使用 `textarea` 或其他元素:

<div id="output">这里是要复制的内容</div>

然后在一个单独的脚本中,可以监听按钮的点击事件来执行复制功能:

<script>
document.addEventListener('DOMContentLoaded', function() {
    var copyButton = document.getElementById('copyButton');
    var output = document.getElementById('output');

    copyButton.addEventListener('click', function() {
        var range = document.createRange();
        range.selectNode(output);
        window.getSelection().removeAllRanges(); // Clear current selection
        window.getSelection().addRange(range); // Select the text content within `output`

        try {
            // Execute the copy command
            var successful = document.execCommand('copy');
            var msg = successful ? '成功复制文本!' : '无法复制文本';
            console.log(msg);
        } catch (err) {
            console.log('复制时发生错误', err);
        }

        // Remove the selection - no longer necessary in here
        window.getSelection().removeAllRanges();
    });
});
</script>

这段脚本首先监听 `DOMContentLoaded` 事件来确保DOM完全加载后再绑定事件。然后,它为 `copyButton` 添加了一个 `click` 事件监听器,当点击时,它会创建一个 `Range` 对象来选择 `output` 元素的内容,然后使用 `document.execCommand('copy')` 方法来复制选中的文本。如果成功,它将在控制台显示一条消息,如果失败,则显示另一条消息。最后,它清除所做的选择。


注意:`document.execCommand` 方法已经被认为是过时的,并且在某些浏览器上可能不再支持。现代替代方法是使用 `navigator.clipboard.writeText()`,但是这需要用户的交互(如点击事件),并且因为它返回一个Promise,所以错误处理会有所不同。如果浏览器环境支持和允许使用 `navigator.clipboard` API,建议使用以下方式:

copyButton.addEventListener('click', function() {
    navigator.clipboard.writeText(output.innerText).then(function() {
        console.log('成功复制文本!');
    }).catch(function(err) {
        console.log('复制时发生错误', err);
    });
});

在利用 `navigator.clipboard.writeText()` 时,我们不需要创建 `Range` 或操作选择,只需要直接将要复制的文本传递给此函数即可。