禁止网站复制功能

8
我知道阻止全球最先进的思维是不可能的,但我想在我的网站上设置最轻微的障碍,以防止我的学生从中复制文本并将其作为他们的答案发布(如果他们手动输入,那就可以)。
我非常害怕JavaScript,因为存在跨浏览器不一致性。
鉴于我已经加载了jQuery并且尽可能使用jQuery,请问如何:
1. 禁用Ctrl + c 2. 禁用菜单编辑复制。

10
你在浪费时间。只要其中的一个人发现了如何绕过你所采取的任何措施,一切就都结束了。 - Jon
1
你可以使用PHP将文本放入图像中并显示图像。但OCR可以很好地处理它(甚至Google文档也有这样的功能)。最好的建议是,要么不在意(我喜欢这个),要么提出那些答案无法复制的问题。 - Jess
Blender:我在任何机会都使用jQuery,因为我从不知道FF、IE、Chrome、Safari等浏览器中会出现什么问题。 - Phillip Senn
保罗:我不认为这是老派的。我试图让他们把鼻子塞进书里,强迫他们从教科书上打出一些东西是我能想到的一种方式。 - Phillip Senn
他们可以直接截屏并将其放在PDF上。PDF可以检测图像中的文字。徒劳无功。 - kommradHomer
显示剩余4条评论
9个回答

13

有些令人畏惧,要创建一个这样的函数,你需要关注的是清空剪贴板,这样即使用户按下Ctrl + C,也不会复制任何内容到剪贴板,像这样简单的函数就能解决问题:

<script language="javascript">
    function clearData(){
        window.clipboardData.setData('text','') 
    }
    function cldata(){
        if(clipboardData){
            clipboardData.clearData();
        }
    }
    setInterval("cldata();", 1000);
</script>


<body ondragstart="return false;" onselectstart="return false;"  oncontextmenu="return false;" onload="clearData();" onblur="clearData();">

尽管仍然可以被打败,但这是一种有效的安全措施。


一切皆可战胜。在浏览器中禁用JavaScript或在Firebug中进行调整是一个好主意。 - Paul
是的,这很好。它不断地清除剪贴板。我没有考虑到这一点 - 我在想前端。 - Phillip Senn
setInterval("cldata();", 1000); 可以不用引号重写吗? - Phillip Senn
为什么在一个地方使用clipboardData.clearData(),而在另一个地方使用clipboardData.setData('text','')? - Phillip Senn
@cf_PhillipSenn,你需要在一个循环中使用setInterval不断地调用该函数。在这种情况下,如果没有引号,它将无法工作。 - Charming Prince
@CharmingPrince 但你可以这样做:setInterval(cldata, 1000) - Oybek Odilov

6
只需在网页的</HEAD>标签前添加以下代码即可:

<script>
    function killCopy(e){
        return false;
    }
    function reEnable(){
        return true;
    }
    document.onselectstart=new Function ("return false");
    if (window.sidebar){
        document.onmousedown=killCopy;
        document.onclick=reEnable;
    }
</script>

1
我没有意识到之前没有接受任何答案。我将尝试你的解决方案,@Amit。 - Phillip Senn
这段代码无法与最新版本的Firefox(43.0.4)兼容,因此不应使用。用户无法填写表单,例如登录字段。 - WendiT

4
我建议你使用以下内容:
<div oncopy="return false;">Here you have protected text</div>

您可以在此处找到支持此方法的内容:http://help.dottoro.com/ljwexqxl.php

这种方法很简单,对于普通用户来说已经足够了。老实说,没有完全防止复制文本的选项。人们总是可以使用例如Chrome Developer Tools,甚至可以从中复制动态加载的文本。

为了更有效地保护,您应该将oncopy放置在<body>标签中,否则可能通过从外部<div>开始选择来复制文本。


3
如果您的文本在特定的div中,您可以在这些div上面放置一个透明的div。其次,您可以使所有受保护的文本动态化,并从JavaScript中将其注入到div中,以便以编码形式存在--这将防止“查看源代码”。

我喜欢这两个想法。我认为我有能力用jQuery ajax命令注入它,但是什么是透明div? - Phillip Senn
透明的div只是一个没有背景的div,它的大小足以覆盖您想要保护的内容 - 它必须具有很高的z-index,以便它可以处于顶部。[div style="position:absolute;left:0px;top:0px;width:10000px;height:10000px;z-index:9999"] - 在BODY中将覆盖整个页面并使所有内容无法点击等 - 您需要动态创建此内容以获取正确的高度和宽度,否则您的滚动条将变得非常大。 - Mark Robbins
任何网络内容都可以被检查。 - uhfocuz

3
一种简单而有效的解决方法是绑定“复制”事件并阻止它。您还可以设置将被复制(以后由用户粘贴)的文本。
document.addEventListener('copy', function (e){
    e.preventDefault();
    e.clipboardData.setData("text/plain", "Do not copy this site's content!");
})

3
<script type="text/javascript" language="javascript">

     $(function() {

            $(this).bind("contextmenu", function(e) {

                e.preventDefault();

            });

        }); 
</script>
<script type="text/JavaScript"> 
function killCopy(e){ return false } 
function reEnable(){ return true } 
document.onselectstart=new Function ("return false"); 
if (window.sidebar)
{ document.onmousedown=killCopy; 
document.onclick=reEnable; } 
</script>

//通过使用上述代码,您的右键将被禁用,同时没有人可以复制您的页面内容

2

使用jQuery可以轻松地禁用网页上的文本选择,复制和右键菜单。以下是一个简单的jQuery代码片段,可以轻松完成此任务:

<script type="text/javascript">
// Disable right click on web page
$("html").on("contextmenu",function(e){
    return false;
});
// Disable cut, copy and paste on web page
$('html').bind('cut copy paste', function (e) {
     e.preventDefault();
});
</script>

来源: 使用jQuery禁用网页上的右键点击、复制和剪切


1
您可以将文本放在一个标记为只读的输入框中,并使用JS阻止用户复制。因此,即使从开发者菜单中,用户也无法复制它。

1
为了实现这一点,您需要在网页上阻止鼠标单击和右键单击。
以下是示例代码:
<script language="JavaScript1.2">
    var msgpopup="COPYING CONTENT IS PROHIBITED";
    function handle(){
          if(toShowMessage== "1") alert(message);
              if(closeSelf== "1") self.close();
              return false;
    }
    function mouseDown() {
         if (event.button == "2" || event.button == "3"){handle();}
    }
    function mouseUp(e) {
         //if (document.layers || (document.getElementById && !document.all)){
              if (e.which == "2" || e.which == "3"){ handle();}
         //}
    }
    document.onmousedown=mouseDown;
    document.onmouseup=mouseUp;
    document.oncontextmenu=new Function("alert(msgpopup);return false")
    </script>

我喜欢这个。问:为什么mouseDown不包括e作为参数? - Phillip Senn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接