JavaScript实现禁止抓屏、复制与打印的技术方案

作者:流萤

时间:2026-10-22

浏览:407

本文探讨在Web开发中禁止用户抓屏、复制和打印的多种JavaScript实现方案。通过定时清空剪贴板、监听窗口焦点事件以及禁用右键菜单和键盘快捷键,可限制常规复制行为。针对抓屏,利用剪贴板机制进行干扰;针对打印,则通过CSS媒体查询隐藏页面内容。文章同时指出了各方案在IE6环境下的兼容性及焦点丢失时的局限性,供开发者参考。

文章目录

禁止抓屏:基于剪贴板的曲线救国策略

项目提出了禁止抓屏、复制和打印的需求。虽然实现禁止复制和打印相对容易,网络上也有大量相关脚本,但如何有效禁止抓屏仍是一个挑战。由于PrintScreen键没有keyCode,传统的onkeydown事件无法捕获该按键。因此,我们可以转换思路,从剪贴板入手,采取一种间接的策略来应对。具体实现代码如下:


<script language="javascript">


window.setInterval("clipboardData.setData('text','')",100);


</script>


上述代码通过每100毫秒清空一次剪贴板来运作,页面加载后脚本即自动执行。然而,这种方法存在明显缺陷:只要窗口处于打开状态,无论网页是否被最小化,系统内所有的复制操作都会被干扰(因为剪贴板持续被清空)。虽然这在一定程度上达到了防止内容被复制的目的,但用户体验较差。



优化方案:利用窗口焦点事件控制剪贴板

考虑到所有控件(包括window对象)都具备onfocus和onblur事件,我们可以利用这两个事件来优化方案。只有当当前窗口处于活动状态(获得焦点)时,才执行清空剪贴板的操作;一旦窗口失去焦点,则停止执行。具体代码如下:


<script language="javascript">


var interval


window.onfocus=function(){interval=window.setInterval("clipboardData.setData('text','')",100);}


window.onblur=function(){window.clearInterval(interval);}


</script>


通过上述焦点监听机制,问题似乎得到了完美解决。然而,对于那些不将截屏内容存入剪贴板的抓屏软件而言,此方法依然力不从心。


在最新的测试实践中发现,使用onfocus和onblur事件的方法仍存在不足。当焦点转移到页面内的其他控件(即使是Table元素)时,window对象会失去焦点,从而触发onblur事件并停止清空剪贴板的命令。这是否意味着需要遍历所有控件并为其绑定onfocus和onblur事件?这让人感到困惑和失望。


此外,window.onfocus实际上对应的是document的onfocus事件。如果焦点位于地址栏或菜单等非页面元素区域,onfocus事件同样会失效。


仅以此文字记录自己半天时间研究JS的心得。



禁止打印与复制:CSS与JavaScript组合实现

禁止打印只需将以下样式代码放入程序中即可(打印出的页面内容将为空白):


<style>@media print{body{display:none}}</style>



禁止复制、选择及右键菜单的实现代码如下:


<script language=javascript>


function click() {


return false;}


function click1(){if (event.button==2) {return false; }}


function CtrlKeyDown(){


if (event.keyCode==67&&event.ctrlKey)


 {

clipboardData.setData('text','');


return false;


 }
}

document.onkeydown=CtrlKeyDown;


document.onselectstart=click;


document.onmousedown=click1;


</script>


<noscript><iframe src=*.html></iframe></noscript>


<script language=javascript>


<!-- 

if (window.Event)


document.captureEvents(Event.MOUSEUP);


function nocontextmenu(){


event.cancelBubble = true


event.returnValue = false;


return false;


} 

function norightclick(e){


if (window.Event){


if (e.which == 2 || e.which == 3)


return false;


} 

else if (event.button == 2 || event.button == 3)


{

event.cancelBubble = true;


event.returnValue = false;return false;}


} 

document.oncontextmenu = nocontextmenu; // for IE5+


document.onmousedown = norightclick; // for all others


//--></script>




以上代码在IE6.0环境下运行正常。


实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章