亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入探討JavaScript、JQuery屏蔽網頁鼠標右鍵菜單及禁止選擇復制

2019-11-20 14:30:49
字體:
來源:轉載
供稿:網友

我記得在剛開始接觸動態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的特性應用到所有元素上了?,F在轉換一下思路,結合剛才我提出的方案,判斷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;
});

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人在线观看| 欧美巨乳在线观看| 国产一区二区久久精品| 欧美日韩一区二区免费视频| 久久视频在线视频| 黑人巨大精品欧美一区二区免费| 美女视频黄免费的亚洲男人天堂| 92福利视频午夜1000合集在线观看| 国产精品高潮在线| 26uuu国产精品视频| 久久久国产精品x99av| 久热在线中文字幕色999舞| 17婷婷久久www| 亚洲一区二区精品| 国产精品丝袜一区二区三区| 欧美成人亚洲成人日韩成人| 97碰碰碰免费色视频| 欧美成人精品h版在线观看| 日韩中文字幕欧美| 久久久久久91香蕉国产| 黄色一区二区在线| 亚洲第一色中文字幕| 欧美成人中文字幕在线| 狠狠久久五月精品中文字幕| 国产欧美一区二区三区视频| 欧美一区二区大胆人体摄影专业网站| 国产成人精品日本亚洲专区61| 国产精品久久久久久久av电影| 国产精品激情av电影在线观看| 日本精品一区二区三区在线播放视频| 久久久久免费视频| 91丝袜美腿美女视频网站| 91嫩草在线视频| 中文字幕欧美精品在线| 久久成人av网站| 久久久久久com| 亚洲欧美制服另类日韩| 一区二区三区四区在线观看视频| 国产精品r级在线| 日韩av在线网站| 亚洲午夜久久久影院| 欧美乱人伦中文字幕在线| 国产精品激情av电影在线观看| 亚洲精品小视频在线观看| 日韩av在线网| 欧美华人在线视频| 亚洲国产欧美一区二区丝袜黑人| 国产日产亚洲精品| 国产精品视频网站| 精品美女久久久久久免费| 国产精品视频自拍| 亚洲黄色在线看| 97视频在线观看免费| 日韩欧美国产视频| 日韩成人中文字幕| 欧美激情视频在线| 国产精品电影在线观看| 国产精品第10页| 亚洲欧美日韩网| 91成人在线观看国产| 成人午夜黄色影院| 国产精品露脸av在线| 日韩精品在线观看视频| 国产精品露脸自拍| 亚洲欧美激情一区| 亚洲va久久久噜噜噜| 精品国产一区二区三区四区在线观看| 欧美激情va永久在线播放| 成人情趣片在线观看免费| 亚洲精品国精品久久99热| 国产成人高清激情视频在线观看| 黄色一区二区在线观看| 国产精品久久久久久av| 色中色综合影院手机版在线观看| 亚洲精品免费网站| 国产精品劲爆视频| 久久精品国产欧美亚洲人人爽| 一区二区亚洲欧洲国产日韩| 国模精品一区二区三区色天香| 精品福利在线看| 日日摸夜夜添一区| 热久久这里只有精品| 欧美精品18videosex性欧美| 日韩电影中文字幕一区| 韩日欧美一区二区| 午夜精品一区二区三区视频免费看| 亚洲free嫩bbb| 国产精品视频专区| 日本精品一区二区三区在线| 久久久久久久久久久国产| 国产精品日韩欧美综合| 久久综合久久美利坚合众国| 欧美亚洲成人网| 国产va免费精品高清在线| 国产精品极品在线| 日韩在线免费视频观看| 亚洲qvod图片区电影| 国产精品久久久久久久久借妻| 国内偷自视频区视频综合| 国产成人福利夜色影视| 国产精品黄视频| 日韩黄色在线免费观看| 欧美精品一区三区| 久久成人国产精品| 精品成人69xx.xyz| 欧美一区三区三区高中清蜜桃| 久久伊人精品视频| 亚洲欧洲av一区二区| 97精品免费视频| 欧美激情一区二区三区久久久| 91九色精品视频| 欧美日韩国产成人在线观看| 成人午夜一级二级三级| 国产精品偷伦免费视频观看的| 韩国精品美女www爽爽爽视频| 伊人男人综合视频网| 在线精品视频视频中文字幕| 久久久久国产精品免费网站| 久久久99久久精品女同性| 亚洲高清久久久久久| 欧美视频一区二区三区…| 国产精品久久久久999| 亚洲一区二区黄| 最近的2019中文字幕免费一页| 日韩欧美中文第一页| 色av吧综合网| 国产在线高清精品| 91午夜理伦私人影院| 日韩有码片在线观看| 国产噜噜噜噜噜久久久久久久久| 日韩精品免费电影| 国产欧美精品日韩精品| 久久影院中文字幕| 一区二区三区国产视频| 韩国欧美亚洲国产| 国产视频综合在线| 国产精品偷伦一区二区| 国产精品午夜国产小视频| 久久久91精品| 国产精品久久网| 91人人爽人人爽人人精88v| 91高清免费在线观看| 欧美激情视频播放| 国产精品久久久久久久午夜| www.欧美精品| 欧美激情视频给我| 国产成人综合久久| 亚洲黄色av网站| 欧美性猛交xxxx偷拍洗澡| 欧美极品在线播放| 欧美日韩一区二区在线| 欧美激情视频在线观看| 亚洲人a成www在线影院| 久久在线免费观看视频| 日韩视频一区在线| 国产69精品久久久久久| 亚洲精品美女久久| 国产精品久久久久久久7电影| 国产精品视频色| 这里只有精品在线观看| 国产精品久久久亚洲| 亚洲精品aⅴ中文字幕乱码| 亚洲美女中文字幕| 国产美女久久精品香蕉69|