【JavaScript编程】禁止复制html页面内容

1、使用 JS、CSS 分别实现禁止复制 HTML 页面内容,会产生不同的页面效果
2、如何实现禁止复制 HTML 页面局部内容


一、复制html页面内容,正确姿势


使用鼠标拖动,选择需要的文字,被选中的文字会变成蓝色。复制、粘贴会得到想要的结果

在这里插入图片描述

二、JS 实现禁止复制


1.1、代码实现:使用 onselectstart 事件,以下两种方式均可

<html lang="en" onselectstart="return false">

document.onselectstart = function(e){
    return false
};

1.2、效果(重复‘一’的正确姿势)

选择文字的时候会发现根本选不到——没有任何文字变成蓝色(选中的状态)


2.1、代码实现:使用 oncopy 事件,以下两种方式均可

<body oncopy="return false">

document.oncopy = function(e){
    return false
};

2.2、效果(重复‘一’的正确姿势)

被选中的文字依然会变成蓝色。但是复制之后,粘贴是没有效果的——选中的内容没有复制到剪切板


三、CSS 实现禁止复制


1、代码实现

body{
    user-select:none;
    -moz-user-select:none;
    -webkit-user-select:none;
    -ms-user-select:none;
    -khtml-user-select:none;
}

2、效果(重复‘一’的正确姿势)

选择文字的时候会发现根本选不到——没有任何文字变成蓝色(选中的状态)


四、如何实现禁止复制局部内容


复制表格时,如果有这样的需求场景:不需要复制表格的操作项单元格,其他的单元格则可以被复制。


1.1、给目标单元格设定样式

<table border="1">
    <tr>
        <th class="disableSelectText">操作</th>
        <th>编号</th>
        <th>名称</th>
    </tr>
    <tr>
        <td class="disableSelectText">删除</td>
        <td>test1</td>
        <td>测试1</td>
    </tr>
    <tr>
        <td class="disableSelectText">删除</td>
        <td>test2</td>
        <td>测试2</td>
    </tr>
</table>
.disableSelectText{
    user-select:none;
    -moz-user-select:none;
    -webkit-user-select:none;
    -ms-user-select:none;
    -khtml-user-select:none;
}

1.2、效果(重复‘一’的正确姿势)

选中的文字就是我们想要复制的内容,但是在 excel 粘贴的时候会发现操作列还是被粘贴出来了

在这里插入图片描述
在这里插入图片描述

2、JS 能实现吗

上述给局部元素设置样式对复制并没有效果,其实同样,用js给局部元素添加事件依然无效:

  • 因为我们复制的是整个表格,$('.disableSelectText').oncopy 事件是不会被触发的
  • $('.disableSelectText').onselectstart 事件只会阻止鼠标在该元素上进行选择,而鼠标移到表格外进行选择的话,同样可以复制整个表格

3、操作Selection和Range对象来实现

参考文章:【JavaScript编程】Selection对象和Range对象


代码实现:

document.body.oncopy = function(e){
    var sel, range, con

    try {
        sel = window.getSelection()
    } catch (error) {
        sel = document.selection // ie
    }
    range = sel.getRangeAt(0)
    con = range.cloneContents()

    if ($(con).find('.disableSelectText').length) {
    	// 删除禁止复制的节点
        $(con).find('.disableSelectText').remove()

        var oDiv = document.createElement('div')
        oDiv.style.position = 'fixed'
        oDiv.style.top = '100%'

        if ($(con).find('table').length) {
            oDiv.appendChild(con)
        }
        else {
            var oTable = document.createElement('table')
            oTable.appendChild(con)
            oDiv.appendChild(oTable)
        }

        document.body.appendChild(oDiv)

        sel.selectAllChildren(oDiv)
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章