深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

我记得在刚开始接触动态HTML及JavaScript时就接触过关于鼠标右键屏蔽的脚本代码,当时这些代码很多会用在防止浏览者未经允许的复制网页上的文字或者其他内容,后来的实际应用证明这种做法是不符合用户体验的,而且破解的方法也有很多,比如我曾经写过一篇文章讲解如何解除网页禁止复制的办法。

由此可见,限制右键及复制是不明智的做法,但是今天我仍然要谈谈关于禁止网页复制、右键菜单的事儿,因为随着网页APP技术的发展,网页应用和桌面应用之间的界限越来越模糊,有一些桌面程序实际上是由网页配合JavaScript实现的,另外一些手机应用也可以是由HTML5+JavaScript实现的,在这种情形下,限制右键就是有必要的了,因为作为APP来说,网页的右键选择文字及弹出菜单在大多数情况下显得没有必要了。


接下来介绍的可能只包含某一方面的代码,但是我相信大家一定能够举一反三:-)


一、粗暴版的限制选择复制或者禁止鼠标右键

我们先谈谈如何粗暴的限制或者禁止浏览者复制网页上的文字,正常的防止浏览者复制文字,我们肯定是想到禁用用户的某些特定的操作,比如鼠标右键,选择,复制等等,而这些操作对应了相应的脚本事件,只要给这些事件加上一个方法,让其返回false就可以“吃”掉这个操作了,一般粗暴的禁止复制的脚本代码如下:

window.onload = function() {
    with(document.body) {
      oncontextmenu=function(){return false}
      ondragstart=function(){return false}
      onselectstart=function(){return false}
      onbeforecopy=function(){return false}
      onselect=function(){document.selection.empty()}
      oncopy=function(){document.selection.empty()}
    }
}
为什么称这个方法为粗暴版的呢?因为使用这个方法禁止鼠标右键后你会发现网页上任何控件都无法右击或者选择了,网页似乎成了死板的图片,也许你会觉得无所谓,但是对于input、textarea文本框这类字符输入控件就有很大的关系了,这些地方不能限制用户的右键及选择复制操作。

二、合理判断要限制的HTML标签元素

如何判断当前处理的层所在的元素标签呢,也就是说得到鼠标当前所在的HTML Tag,这里我们以oncontextmenu为例,其实在document.body.oncontextmenu传入的函数有一个参数我们略去了,完整的写法应该是document.body.oncontextmenu=function(e){}这里的e是JavaScript中的Event事件对象,在IE中可能是通过window.event获取的。通过这个事件对象可以获取触发事件时鼠标所在的HTML Tag,我们可以判断是不是我们要忽略处理元素标签,这里我提供一个函数如下:

var isTagName = function(e, whitelists) {
      e = e || window.event;
      var target = e.target || e.srcElement;
      Array.prototype.contains = function(elem)
        {
           for (var i in this)
           {
               if (this[i].toString().toUpperCase() == elem.toString().toUpperCase()) return true;
           }
           return false;
        }
      if (whitelists && !whitelists.contains(target.tagName)) {
        return false;
      }
      return true;
};
这里的e是事件对象event,target是事件对象所引用的元素对象,当然这里两个变量都采取了兼容IE的写法,具体可以参考《How can I make event.srcElement work in Firefox and what does it mean?》;这里的whitelists是白名单HTML元素标签Tag名,比如['INPUT', 'TEXTAREA'],表示将输入文本框input和textarea加入判断,如果当前事件元素是的话就返回true,这样我们通过下面的代码可以选择性的屏蔽鼠标右键了:

document.body.oncontextmenu=function(e){
     return isTagName(e, ['A', 'TEXTAREA']);
}
三、JQuery版的选择性屏蔽禁止文本选择
同样的对于其他的操作也可以选择性的屏蔽,在JQuery支持的环境中我在StackOverflow找到了这么一篇文章《How to disable text selection using jQuery?》,虽然是讲解的禁止选择的,不过可以借鉴一下,具体代码如下:

(function($){

  $.fn.ctrlCmd = function(key) {

    var allowDefault = true;

    if (!$.isArray(key)) {
       key = [key];
    }

    return this.keydown(function(e) {
        for (var i = 0, l = key.length; i < l; i++) {
            if(e.keyCode === key[i].toUpperCase().charCodeAt(0) && e.metaKey) {
                allowDefault = false;
            }
        };
        return allowDefault;
    });
};

 
$.fn.disableSelection = function() {

    this.ctrlCmd(['a', 'c']);

    return this.attr('unselectable', 'on')
               .css({'-moz-user-select':'-moz-none',
                     '-moz-user-select':'none',
                     '-o-user-select':'none',
                     '-khtml-user-select':'none',
                     '-webkit-user-select':'none',
                     '-ms-user-select':'none',
                     'user-select':'none'})
               .bind('selectstart', false);
};

})(jQuery);
在使用上采取下面的代码:

$(':not(input,select,textarea)').disableSelection();

这样就可以除去input、select、textarea外禁止选择了,这段代码的技巧是除了采取selectstart外还给相关元素添加了某些特殊浏览器支持的CSS特性,这样基本可以实现大多数浏览器的兼容,同时这段代码还屏蔽了键盘按键选择Ctrl+A和Ctrl+C,不得不佩服作者周到的考虑。

四、进一步完善:屏蔽鼠标点击操作

我在测试这段代码时遇到一个问题就是点击除input、select、textarea外的元素时会全部选择页面,原文作者给出一个简单的方法就是在使用代码上附加.on('mousedown', false),这样就屏蔽了鼠标的单击,使用代码变成如下:

$(':not(input,select,textarea)').disableSelection().on('mousedown', false);
但是问题又来了,我发现采取上述代码后,input,select,textarea也开始变得不正常起来,看样子屏蔽mousedown的特性应用到所有元素上了。现在转换一下思路,结合刚才我提出的方案,判断event对象来实现选择性屏蔽,我将代码修正如下:

$(':not(input,select,textarea)').disableSelection().on('mousedown', function(e) {
    var event = $.event.fix(e);
    var elem = event.target || e.srcElement;
    if (elem.tagName.toUpperCase() != 'TEXTAREA' && elem.tagName.toUpperCase() != 'INPUT') {
        e.preventDefault();
        return false;
    }
    return true;
});
这样textarea和input就不会限制mousedown了,我们将这段代码抽出为函数:
function jQuery_isTagName(e, whitelists) {
      e = $.event.fix(e);
      var target = e.target || e.srcElement;
      if (whitelists && $.inArray(target.tagName.toString().toUpperCase(), whitelists) == -1) {
        return false;
      }
      return true;
}

$(':not(input,select,textarea)').disableSelection().on('mousedown', function(e) {
    if (!jQuery_isTagName(e, ['INPUT', 'TEXTAREA'])) {
        e.preventDefault();
        return false;
    }
    return true;
});

五、JQuery版的选择性屏蔽禁止鼠标右键

对于右键菜单,我们可以这样处理:

$(document).bind("contextmenu",function(e){
    if (!jQuery_isTagName(e, ['INPUT', 'TEXTAREA'])) {
        e.preventDefault();
        return false;
    }
    return true;
});



jQuery屏蔽快捷键F1-F12 屏蔽快捷键 立即下载

相关推荐

基于jquery的禁用右键、文本选择功能、复制按键的实现代码

同时适合IE、firefox、谷歌浏览器下适用,经过筛选代码如下: 代码如下://禁用右键、文本选择功能、复制按键$(document).bind(“contextmenu”,function(){return false;});$(document).bind(“selectstart”,function(){return false;});$(document).keydown(function(){return key(arguments[0])}); //按键时提示警告function key(e){var keynum;if(window.event){keynum = e.ke

js 实现 禁用用户浏览器选中,复制,剪切 ,粘贴功能

公司做的项目有的需要发布到网上,但是内容又不想被复制,那么久可以加上这样的代码 第一种 1 <script language=javascript type=text/javascript> <!-- document.οncοntextmenu=new Function('event.returnValue=false;'); document.onselectstart=new Function('event.returnValue=false;'); --> </

lzfengquan的博客 2290

利用js和css,页面如何实现禁止复制禁止调试等限制操作

在我们开发系统的时候,可能会接到这样的需求:不要让用户复制页面上的文字或者图片,不要让用户调试我们的页面,更甚至也不要让用户进行打印操作等等。我们可以通过css来控制,也能够监听用户打开控制台的操作,从而达到我们想要的目的

zhang_hai_cheng的博客 4712

JS小技巧 ----- 在onmousedown事件下避免文本选取

场景 在浏览器中,当我们长按鼠标左键后会开始选取文段,松开鼠标后再对着文本长按左键,就可以移动文本的副本到浏览器搜索栏中了。现在我们要通过JS实现长按元素来拖拽一个元素,但是当无意间选中文本只后,再来拖拽这个元素,会引起文本和元素一起移动,还会发生一些不合逻辑的拖拽异常。 解决方式 对拖拽元素的事件 onmousedown 的响应函数最后一行加上return false; 即可解决这个问题。 ...

k909397116的博客 624

解除网页屏蔽鼠标右键方法

这是一段JS代码,本人一直在用的,感觉还不错;百度搜索有很多都是无效或者是错误无法使用的;最近几天在公司在用,没百度出正确的代码,就决定分享出这个代码;完整代码如下:登录后复制 javascript:(function() { function R(a){ona = "on"+a; if(window.addEventL...

weixin_40506570的博客 126

【JQ】禁止右键点击事件

//禁用右键、文本选择功能、复制按键 $(document).bind("contextmenu",function(){return false;}); $(document).bind("selectstart",function(){return false;}); $(document).keydown(function(){return key(arguments[0])}...

南朋友的博客 347

js屏蔽鼠标右键菜单&键盘ctrl+c,ctrl+v等

js屏蔽鼠标右键菜单以及屏蔽键盘ctrl+c,ctrl+v,ctrl+a,ctrl+s,ctrl+p

; 2075

jQuery禁止鼠标右键

jQuery屏蔽鼠标右键: $(document).ready(function(){       $(document).bind("contextmenu",function(e){              return false;        }); }); ----------------------------------------------------------

jzz111的专栏 1082

html禁用鼠标右键复制代码,禁止鼠标右键禁止查看源代码及防复制代码

众所周知网页禁止用户右键 ,禁止复制文字,禁止查看源代码这些都是一些基本的访问外人盗用站内信息的基本步骤。小编今天教大家如何操作。现在网页上用得最多的是function click(),点击右键弹出提示信息function click() {if (event.button==2) {alert('欢迎访问本站,站点禁止右键属性哦 !')}}document.onmousedown=click小...

weixin_42515687的博客 715

html 右键按钮复制,HTML,JS禁止鼠标右键禁止全选、复制、粘贴的方法

禁止鼠标右键禁止全选、复制、粘贴;oncontextmenu事件禁用右键菜单;js代码:document.oncontextmenu = function(){event.returnValue = false;}// 或者直接返回整个事件document.oncontextmenu = function(){return false;}onselectstart事件禁用网页上选取的内容;js代...

weixin_33514163的博客 504

html屏蔽右键禁止复制(转载)

如何在网页屏蔽右键 众所周知,要保护一个页面,最基础的就是要屏蔽右键。而现在网页上用得最多的是function click(),即下面这段代码: <script> function click(){   if(event.button==2){     alert( '本网站欢迎您 !!');   } } document.onmousedown=cli......

zgphacker2010的专栏 289

JQuery禁用右键、文本选择功能、复制按键的实现(转载)

网址:http://caodong.net/Article/7186.html 同时适合IE、firefox、谷歌浏览器下适用,经过筛选代码如下://禁用右键、文本选择功能、复制按键$(document).bind(“contextmenu”,function(){return

georgejg的专栏 2830

禁止查看元素 禁F12 禁鼠标右键复制

日常笔记: 页面自我保护

jasonlsammy的博客 3019

jquery禁止复制、禁用右键、文本选择功能、复制按键

//禁用右键、文本选择功能、复制按键 $(document).bind("contextmenu",function(){return false;}); $(document).bind("selectstart",function(){return false;}); $(document).keydown(function(){return key(arguments[0])}); //按键时提示警告 function key(e){ var keynum; if(window.ev

我执,是痛苦的根源 757

JQ禁止右键点击事件

//禁用右键、文本选择功能、复制按键 $(document).bind("contextmenu",function(){return false;}); $(document).bind("selectstart",function(){return false;}); $(document).keydown(function(){return key(arguments[0])})...

架构师亮哥的博客 323

jquery屏蔽鼠标右键,屏蔽F5刷新,屏蔽Alt+方向键←,屏蔽Alt+方向键→,屏蔽退格键

//屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键 //屏蔽鼠标右键 window.document.oncontextmenu = function(){ return false;} //屏蔽F5刷新,屏蔽Alt+方向键←,屏蔽Alt+方向键→,屏蔽退格键 window.onload=function() {  window.onkeydown=fun

xingqianqian12的专栏 1299

JS屏蔽鼠标右键(仅支持IE浏览器)

注意:只在IE浏览器下有效 $(document).ready(function () { $(document).bind("contextmenu", function () { return false; }) .bind('dragstart', function () { return false;

semanwmj的专栏 2005

jquery禁用右键、文本选择功能、复制按键的实现

//禁用右键、文本选择功能、复制按键 $(document).bind(“contextmenu”,function(){return false;}); $(document).bind(“selectstart”,function(){return false;}); $(document).keydown(function(){return key(arguments[0])})

1313

web屏蔽右键

New Document               $(document).ready(function() {                  // 禁止右键         $(document).bind("contextmenu", function(){return  false;});         // 禁止选择         $(doc

zhangjinling900412的专栏 602
上一篇: git使用教程
下一篇: 前端踩的一些坑
leadn
博客等级 码龄10年 13粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值