コピー禁止用のjQueryプログラム JavaScript
写真家の方のサイトを作る際に画像をコピーできないようにしてもらえないか・・・と言われ、コピー禁止用のJavaScriptを書いてみました。HTMLがクライアント側で解釈されるので完全にコピー禁止にすることはできませんが、一手間かけないとコピーできないようになってます。
なるべく簡単に導入できるよう書いてみました。
サンプルページ
今回のプログラムでは以下の機能を実装しました。
- 文字や画像を選択させない
- 右クリックででてくるコンテキストメニューを表示しない
- Ctrl+A,Ctrl+Cによるコピーをさせない
- 画像には透明画像のカバーをつけて直接選択できないようにする
入力系パーツに影響がないようにしたり、ショートカットキーを使ったコピーをさせないようにしたり、いろいろ組み込んでみました。IE6とIE7で「display:inline-block」が効かないためある条件でレイアウト崩れが起きるけど、来月でXPのサポート切れるからひとまず放置してます。いい方法あったら教えてください。
ダウンロード
フォルダ構成は以下のとおり
- cpguard.css:デザインファイル
- cpguard.js:JavaScriptファイル
- image.gif:サンプルで使用している画像
- spacer.gif:画像カバー用の透明GIF
- spacer.png:デバッグ用画像カバー半透明PNG
jQuery本体の読み込み(CDN)
今回のプログラムはjQueryを使用しているので、jQuery本体(CDN)を読み込みます。
<!--[if lt IE 9]> <script src="http://code.jquery.com/jquery-1.9.1.min.js" type="text/javascript"></script> <![endif]--> <!--[if gte IE 9]><!--> <script src="http://code.jquery.com/jquery-2.0.0.js" type="text/javascript"></script> <!--<![endif]-->
CSSの読み込み
コピー禁止用のCSSファイルを読み込みます。
※「cpguard.css」のディレクトリを変更した場合はパスを書き換えてください
<link href="js/cpguard.css" rel="stylesheet" type="text/css" />
CSSの中身は主に選択禁止用プロパティの指定。またJavaScriptでコピー禁止させるので、JavaScriptが無効になっていたらコピー禁止対象を非表示にします。
@charser 'utf-8'; .body { user-select: none; /* 選択制御 */ -moz-user-select: none; /* Firefox */ -webkit-user-select: none; /* Safari、Chromeなど */ -ms-user-select: none; /* IE10から */ cursor: default; } .cpguard { display: none; }
JavaScriptの読み込み
コピー禁止用のJavaScriptプログラムを読み込みます。
※「cpguard.js」のディレクトリを変更した場合はパスを書き換えてください
<script id="cpguard" src="js/cpguard.js" type="text/javascript"></script>
コピー禁止用のプログラムの内部はこんな感じ。もうちょっといい感じのプログラムがあったら教えてください。
$(function(){ $('.cpguard').removeClass('cpguard');//JS有効時表示 $('body').on('contextmenu selectstart copy cut', false);//右クリックメニュー、選択、コピー、カット禁止 $('p:not(p:has(:input))').mousedown(function(){return false;}); //入力パーツ除く段落内マウスボタン押下時イベント却下 //画像保護 //画像カバーパス取得 var src = $('#cpguard').attr('src'); var srcArray = src.split('/'); srcArray[srcArray.length-1] = 'spacer.gif';//「spacer.png」にするとカバー画像がデバッグ用半透明赤画像に src = srcArray.join('/') //画像カバー装着 $('img').wrap('<div style="position:relative;display:inline-block;" />').parent("div") .append('<img class="spacer" src="' + src + '" alt="*" />'); $('img.spacer').bind('load',function(){ $(this).css({ 'position':'absolute', 'top':0, 'left':0, 'width':$(this).prev().width(), 'height':$(this).prev().height() }) }); // ctrl+a,ctrl+c 禁止呼び出し $(document).keydown(key_down_event); $(document).keyup(key_up_event); }); // ctrl+a,ctrl+c 禁止関数 var ctrl_key = false; // ctrlキーが押されてるか判断する変数 function key_down_event(event) { console.log(event.keyCode);//キーコードをコンソールに表示(デバッグ用) if (event.keyCode == 224) {//ctrlキー取得(224) ctrl_key = true; } if (ctrl_key && (event.keyCode == 65 || event.keyCode == 67)) { //ctrl + aキー(65) cキー(67)押下時 return false;//キー操作無効 } return true; } function key_up_event(event) { //ctrlキーアップ時、判定を戻す if (event.keyCode == 224) { ctrl_key = false; }; }
HTMLにclass属性を記述
コピー禁止したい要素に「class="cpguard"」を記述します。JavaScriptが無効になっていると対象要素が非表示になります。
<div class="cpguard"> : </div>