我记得在刚开始接触动态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()} } }
二、合理判断要限制的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);
$(':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; });
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; });
1.首先准备我们的HTML <div class="menu"> <ul> <li>春眠不觉晓,处处闻啼鸟。</li> <li>Any <ul> <li>lover</li> <li>Gold
本文向大家介绍C#禁止textbox复制、粘贴、剪切及鼠标右键的方法,包括了C#禁止textbox复制、粘贴、剪切及鼠标右键的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#禁止textbox复制、粘贴、剪切及鼠标右键的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。
本文向大家介绍两种JS实现屏蔽鼠标右键的方法,包括了两种JS实现屏蔽鼠标右键的方法的使用技巧和注意事项,需要的朋友参考一下 JS屏蔽鼠标右键的两种方法,比较常用的一个JS小功能,用上这个代码后,浏览者在访问你网页的时候就不能点击右键了,点了也不会弹出右键菜单,本功能最好不要用的太多哦,有时候用户会反感的。 代码如下: 以上就是本文的全部内容,希望对大家的学习有所帮助。
本文向大家介绍jQuery简单实现禁用右键菜单,包括了jQuery简单实现禁用右键菜单的使用技巧和注意事项,需要的朋友参考一下 代码非常简单,这里就不多废话了,直接上代码: 5行代码搞定,简单吧,当然小伙伴们可以自由扩展下,可以实现屏蔽右键菜单的指定项。
本文向大家介绍JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】,包括了JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS实现屏蔽网页右键复制及ctrl+c复制的方法。分享给大家供大家参考,具体如下: 老是有些网站会屏蔽你的鼠标右键或者用快捷键复制,其实只是一段js代码,解决的方法就是直接把网页保存下来然后删掉下面这段
本文向大家介绍JS实现禁止鼠标右键的功能,包括了JS实现禁止鼠标右键的功能的使用技巧和注意事项,需要的朋友参考一下 遇到网页上有精美图片或者精彩文字想保存时,通常大家都是选中目标后按鼠标右键,在弹出菜单中选择“图片另存为”或“复制”来达到我们的目的。但是,目前有许多网页都屏蔽了鼠标右键,那么用js如何实现禁止鼠标右键的功能呢? 1.与禁止鼠标右键相关的JS说明 2.禁止鼠标右键火狐失灵 3.禁止选
本文向大家介绍javascript实现网页屏蔽Backspace事件,输入框不屏蔽,包括了javascript实现网页屏蔽Backspace事件,输入框不屏蔽的使用技巧和注意事项,需要的朋友参考一下 下面通过javascript代码实现网页屏蔽Backspace事件,输入框不屏蔽,具体代码如下: 希望能够帮助到大家。
本文向大家介绍jQuery EasyUI右键菜单实现关闭标签/选项卡,包括了jQuery EasyUI右键菜单实现关闭标签/选项卡的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了jQuery EasyUI右键菜单可以选择关闭标签/选项卡操作,供大家参考,具体内容如下 目录结构: noContextMenu.js 文件内容如下: 效果图: 方式一: 方式二: 以上就是本文的全部