【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)
    }
}

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