浏览器中页面的复制事件和粘贴事件(禁止复制文字的原理、如何阻止用户复制文字、在复制内容后加上版权信息、如何解除禁止复制的限制、与剪贴板相关的API)

1. 问题引入

在浏览某些文章时,无论是CTRL + C复制,还是右键复制,都会弹出充值页面(常见于某某文库),虽然说可以截图后进行文字识别,但有些文章篇幅较长,文字识别不是长久之计

作为一名优秀的复制粘贴工程师,是不能忍受连复制文字都要收钱的

在这里插入图片描述

2. 禁止复制文字的原理

复制文字之后弹出充值页面是怎么做到的呢,本质上就是监听了复制事件

2.1 准备工作

我们准备一个简单的HTML页面

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>copy</title>
</head>
<body>
<div>
    <p>你来自于南方的村落</p>
    <p>来自粗糙的双手</p>
    <p>你站在楼宇的缝隙</p>
    <p>可你没有退缩</p>
    <p>我来自于北方的春天</p>
    <p>来自一步一回首</p>
    <p>背后有告别的路口</p>
    <p>温暖每个日落</p>
    <p>当家乡入冬的时候</p>
    <p>列车到站以后</p>
    <p>小时候的风再吹过</p>
    <p>回忆起单纯的快乐</p>
    <p>在熟悉的街头</p>
    <p>有人会用所有的温柔</p>
    <p>喊出你的名字</p>
    <p>离家的人啊我敬你一杯酒</p>
    <p>敬你的沉默和每一声怒吼</p>
    <p>敬你弯着腰上山往高处走</p>
    <p>头顶苍穹努力地生活</p>
</div>
<script>
    document.addEventListener('copy', function (event) {
        console.log(event)
    })
</script>
</body>
</html>

正常情况下,无论是CTRL + C复制,还是右键复制,都是会触发复制事件的

2.2 如何阻止用户复制文字

怎么阻止用户复制文字呢?我们只需要阻止复制事件的默认行为就可以了

在这里插入图片描述

<script>
    document.addEventListener('copy', function (event) {
        console.log(event)

        // 阻止复制事件的默认行为
        event.preventDefault()
    })
</script>

阻止复制事件的默认行为之后,即使用户进行了复制操作,剪贴板中也不会有对应的内容(按下Win + V快捷键键可以查看剪贴板内容)

2.3 在复制内容后面加上版权信息

拿到event对象之后,我们可以实现一些更好玩的效果,例如用户进行复制操作后,在复制内容后面加上版权信息

复制CSDN上的文章时,复制内容后面会附带版权信息,就是利用event对象实现的

在这里插入图片描述

<script>
    document.addEventListener('copy', function (event) {
        // 阻止复制事件的默认行为
        event.preventDefault()
        // 获取选中的文本
        const selection = document.getSelection().toString()
        // 设置要添加的版权信息
        const copyrightText = '\n\n版权所有 © 聂可以'
        // 将版权信息添加到选中的文本后面
        const textToCopy = selection + copyrightText;
        // 使用 Clipboard API 写入新的文本
        event.clipboardData.setData('text/plain', textToCopy)
    })
</script>

3. 如何解除禁止复制的限制

我们回到正题,知道了禁止复制的原理之后,怎么解除浏览器中禁止复制的限制呢?

3.1 案例演示

第一步:按下F12打开浏览器的控制台,点击选择元素按钮(也可以直接按下CTRL + SHIFT + C快捷键)

在这里插入图片描述

第二步:鼠标左键点击要复制的内容

在这里插入图片描述

点击要复制的内容后对应的标签会有高亮背景,接着我们点击事件监听器一栏,再点开copy事件

在这里插入图片描述

点击删除图标,把所有监听copy事件的侦听器全删掉,就能愉快地复制所有内容了(记得把上级元素也勾上)

在这里插入图片描述

3.2 动手实践

看到这里的同学,赶紧找一个复制文字要付费的网页动手实践一下吧

或者也可以直接在本文章上进行测试,看看能不能去掉CSDN在复制内容后面添加的版权信息(记得复制大量文字,仅复制少量文字时不会在复制内容后面加上版权信息)

3.3 使用浏览器插件解除禁止复制限制

其实,我们能想到的,大概率已经有人想到了。没错,已经有大神开发出了能解除禁止复制限制的浏览器插件


第一步:打开浏览器的插件页面

在这里插入图片描述

点击获取 Microsoft Edge 扩展

在这里插入图片描述

第二步:在右上角搜索SuperCopy 超级复制,点击第一个

SuperCopy 超级复制

在这里插入图片描述

接着点击右上角的获取按钮(由于我已经装过了,所以获取按钮变成了删除按钮)

在这里插入图片描述

第三步:安装完成后,再次打开浏览器的插件页面,将刚才安装的SuperCopy 超级复制插件固定到工具栏

在这里插入图片描述

第四步:打开某个网页,点击SuperCopy 超级复制插件的图标

在这里插入图片描述

点击破解禁止复制,就能够愉快地复制文字了

在这里插入图片描述

开启破解禁止复制之后,插件的图标也会变成蓝色(关闭破解复制后会重新刷新页面)

在这里插入图片描述

4. 与剪贴板相关的API

4.1 与剪贴板相关的API的应用场景

我们来看一下粘贴板的应用场景:

  1. 在网页中粘贴一张图片,图片能够立即回显到页面上
  2. 打开某个程序时,程序会将剪贴板中的内容读取出来,跳转到对应的商品页面或视频页面(当好友在微信分享了一个某音、某手、某多多或某东的链接给你时,复制链接后,打开对应的程序,就能够跳转到详情页面)

除了上述应用场景之外,上面演示的禁止复制文字也是利用了与剪贴板相关的API

4.2 Clipboard API

剪贴板,可以理解为操作系统为我们开辟的一块独立内存空间

  • 当进行复制操作的时候,就相当于往这个内存空间里面写入数据,可以写入文字、图片,也可以写入文件
  • 当进行粘贴操作的时候,就是从这个内存空间里面把数据读取出来,显示在某一个地方

浏览器为我们提供了一套与剪贴板相关的API,这套API被称为Clipboard API,我们可以在浏览器的控制台中查看

navigator.clipboard

在这里插入图片描述

navigator.clipboard 对象提供了用于读写系统剪贴板的接口。以下是 Clipboard 对象中的四个主要方法及其含义:

  • read(): 这个方法返回一个 Promise,该 Promise 解析为一个 ClipboardItem 对象数组,表示剪贴板上的数据。ClipboardItem 对象可以包含不同类型的数据,比如文本、图像等。这个方法通常用于读取剪贴板上的非文本内容。
  • readText(): 这个方法返回一个 Promise,该 Promise 解析为剪贴板上的文本内容。如果剪贴板上没有文本内容,则解析为空字符串。这个方法用于读取剪贴板上的文本数据
  • write(): 这个方法接收一个 ClipboardItem 对象数组作为参数,并尝试将它们写入剪贴板。这个方法用于将复杂的数据类型(如文本、图像等)写入剪贴板
  • writeText(): 这个方法接收一个字符串作为参数,并将其作为文本写入剪贴板。如果操作成功,该方法返回一个 Promise,该 Promise 在写入完成后解析为 undefined。这个方法用于将文本数据写入剪贴板

为什么readXXX方法返回的是一个Promise对象呢,因为剪贴板涉及到用户的隐私,浏览器会询问用户是否允许访问粘贴板,只有用户允许访问之后,Promise才会执行完成,执行完成后会回传从剪贴板中读取到的内容

在这里插入图片描述

示例代码

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Clipboard-copy</title>
</head>
<body>
<div class="editor">

</div>
<script>
    navigator.clipboard.readText().then((text) => {
        document.querySelector('.editor').innerHTML = text
    })
</script>
</body>
</html>

4.3 案例演示

我们来做一个案例,将剪贴板中的图片读取出来,回显到页面上

我们准备一个div标签,为这个div标签加上contenteditable属性,使这个div标签变成一个文本编辑器(毕竟图片不能放到input标签里面,也不能放到textArea标签里面)


我们监听这个文本编辑器的粘贴事件,如果用户粘贴的是纯文本,我们不做额外处理,我们只处理粘贴内容的是文件的情况

拿到图片文件后,不仅可以回显到页面上(其实div标签加上contenteditable属性后,即使不做额外处理,浏览器也能够回显用户粘贴的图片),还可以上传到服务器

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Clipboard-paste</title>
    <style>
        /* 设置编辑器的样式 */
        .editor {
            min-height: 300px; /* 编辑器的最小高度 */
            border: 3px solid #4CAF50; /* 编辑器的边框 */
            padding: 20px; /* 内边距 */
            font-family: 'Arial', sans-serif; /* 字体 */
            font-size: 16px; /* 字体大小 */
            color: #333; /* 文字颜色 */
            background-color: #FAFAFA; /* 背景颜色 */
            resize: vertical; /* 允许垂直方向调整大小 */
            outline: none; /* 移除焦点时的轮廓线 */
            transition: all 0.3s ease; /* 过渡效果 */
        }
        /* 编辑器获得焦点时的样式 */
        .editor:focus {
            border-color: #2196F3; /* 焦点时的边框颜色 */
            box-shadow: 0 0 10px #2196F3; /* 焦点时的阴影效果 */
        }
    </style>
</head>
<body>
<!-- 创建一个可编辑的 div 元素,用作文本编辑器 -->
<div class="editor" contenteditable="true">
    <!-- 用户可以在这里粘贴内容 -->
</div>

<script>
    // 获取编辑器元素
    const editor = document.querySelector('.editor')

    // 为编辑器添加 paste 事件监听器,当用户粘贴内容时触发
    editor.addEventListener('paste', (pasteEvent) => {
        // 检查剪贴板数据中是否有文件
        if (pasteEvent.clipboardData.files.length > 0) {
            // 阻止默认的粘贴行为,因为我们想要自定义处理文件
            pasteEvent.preventDefault()

            // 获取剪贴板中的第一个文件
            const file = pasteEvent.clipboardData.files[0]

            // 创建一个新的 FileReader 对象,用于读取文件内容
            const reader = new FileReader()

            // 当文件读取完成时触发的事件处理器
            reader.onload = (loadEvent) => {
                // 创建一个新的 img 元素,用于显示图片
                const img = document.createElement('img')
                // 设置 img 元素的 src 属性为读取到的文件数据
                img.src = loadEvent.target.result.toString()
                // 将 img 元素添加到编辑器中
                editor.appendChild(img)
            }

            // 读取文件内容为 Data URL
            reader.readAsDataURL(file)
        }
    })
</script>
</body>
</html>

5. 参考视频

<think>好的,用户问的是怎么解决头歌平台不能复制粘贴的问题。首先,我需要确定头歌平台是什么类型的平台。头歌(EduCoder)应该是一个在线编程教育平台,可能用于课程学习或实验环境。用户遇到的复制粘贴限制可能是平台有意设计的,防止学生直接复制代码,促进手动输入加深理解。但用户可能因为各种原因需要复制,比如节省时间或避免输入错误。 接下来,我要考虑常见的解决这类限制的方法。通常,网页上的复制限制可以通过浏览器开发者工具来绕过,比如禁用JavaScript或者检查元素修改属性。另外,可能有浏览器扩展插件能解除限制,或者使用第三方工具如文本抓取工具。还有一种可能是使用自动化脚本,比如书签脚本或者控制台执行JavaScript代码。 不过,用户可能不具备技术背景,所以需要提供简单易懂的步骤。首先,建议检查是否有平台本身的设置允许复制,比如某些权限或选项。如果没有,再转向技术方法。例如,禁用JavaScript:进入浏览器设置,找到JavaScript选项,关闭后刷新页面,尝试复制。但需要注意,禁用JS可能会影响其他功能,所以操作后需重新启用。 另一个方法是使用开发者工具检查元素。右键点击页面,选择“检查”,找到被禁用的输入框或文本区域,删除相关的属性如readonly或disabled,这样就可以手动选择复制。这种方法需要用户对开发者工具有一定了解,但步骤相对简单。 此外,推荐安装浏览器扩展如Enable Copy,这类插件能一键解除限制,适合不想手动操作的用户。同时,提醒用户注意版权问题,复制内容需遵守平台规定,避免侵权。如果是为了学习,手动输入可能更有帮助,但用户可能有自己的理由需要复制,比如保存代码片段或笔记。 最后,要确保回答结构清晰,分步骤说明,并给出不同方法的优缺点,让用户自行选择。同时强调合法合规,避免鼓励用户绕过正当限制,保持中立帮助的态度。</think>关于头歌平台无法复制粘贴的问题,可以通过以下步骤尝试解决: ### 一、检查平台限制性质 1. **确认是否为全局限制** 尝试在不同浏览器(Chrome/Firefox/Edge)中测试,部分平台会针对特定浏览器设置限制 2. **查看页面源代码** 按 `Ctrl+U` 查看网页源码,搜索 `oncopy` 或 `onpaste` 事件监听,这可能包含限制逻辑 ### 二、技术解决方案 #### 方法1:禁用JavaScript 1. 在浏览器地址栏输入: ``` chrome://settings/content/javascript ``` 2. 点击"不允许网站使用 JavaScript" $$ \text{注意:操作后需刷新页面} $$ #### 方法2:控制台脚本解除 1. 按 `F12` 打开开发者工具 2. 在Console面板输入以下代码: ```javascript document.body.oncopy = null; document.body.onpaste = null; document.execCommand('enableAbsolutePositionEditor', false, true); ``` #### 方法3:元素属性修改 1. 定位目标元素后执行: ```javascript document.querySelector('textarea').removeAttribute('readonly') ``` ### 三、辅助工具方案 1. **使用浏览器扩展** 推荐安装: - Enable Copy(Chrome商店ID:jhnbgceednbmnpfjgelkgocnnojhjlfc) - Absolute Enable Right Click & Copy 2. **OCR识别工具** 对无法直接复制的文本,可使用: ```python # 示例:使用pytesseract进行OCR识别 import pytesseract from PIL import Image text = pytesseract.image_to_string(Image.open('screenshot.png')) ``` ### 四、注意事项 1. **平台协议合规性** 需确认是否违反《用户服务协议》第3.2条关于内容复制限制条款 2. **编码问题处理** 若复制后出现乱码,可尝试: ```bash iconv -f gb2312 -t utf-8 input.txt > output.txt ``` ### 五、替代方案建议 1. 使用开发者工具网络抓包(Network面板),直接获取接口返回的原始数据 2. 对于编程题目,可通过编写输出函数自动生成答案文件: ```python with open('answer.txt', 'w') as f: f.write(solution_code) ``` > 提示:部分实验平台(如头歌)会记录剪贴板操作日志,建议优先使用平台提供的导出功能。如果涉及课程作业,建议遵守教学要求进行手动实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聂 可 以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值