S-JIS[2010-07-18] 変更履歴
ブラウザーの画面(情報)のコピーを禁止する方法について。
|
ブラウザー上で右クリックするとコンテキストメニュー(ポップアップメニュー)が開く。
ここに「コピー」や「切り取り」といったメニューがあるので、コンテキストメニュー自体を禁止すればコピーすることは出来なくなる。
<body onContextmenu="return false"> <h1>onContextMenu</h1> <p>右クリックでコンテキストメニュー(ポップアップ)が出なくなる。</p> </body>
ただしその他の便利なメニューも使えなくなってしまうので、コピーを禁止したいのであれば、コンテキストメニューを禁止するのではなく、コピー自体を禁止する方がいい。
onCopy・onCutでfalseを返すことにより、メニューバーからの「コピー」「切り取り(カット)」やそのキー入力(Ctrl+CやCtrl+X) でのコピー&カットを禁止することが出来る。
ただしメニュー自体が禁止(灰色表示で選択不可)になるわけではないので、ユーザーが操作は出来るけれども、実際にはクリップボードにコピーされない。
エラーメッセージを出す方が親切かも。
onBeforeCopy・onBeforeCutというイベントもあるが、これらはポップアップメニューを表示する時でも呼ばれるようなので、エラーメッセージを出すような使い方には向かない。
ページ内の全ての文章に対してコピー&カットを禁止したい場合は、body要素にonCopy・onCutを記述する。
<body onCopy="return false" onCut="return false"> <form> <h1>onCopy</h1> <p>コピー不可</p> <p><input type="text" value="abc"></p> </form> </body>
<body onCopy="alert('コピー禁止'); return false" onCut ="alert('切り取り禁止');return false" >
禁止したいタグだけにonCopy・onCutを記述すれば、そのタグだけコピー&カットを禁止できる。
ただし、コピー可能領域と合わせて範囲選択されてしまうと、コピー禁止領域もコピーできてしまう。
<body> <form> <h1>onCopy</h1> <p onCopy="alert('コピー不可');return false">コピー不可</p> <p><input type="text" value="abc" onCopy="alert('コピーできません');return false" onCut="alert('カットできません');return false"></p> </form> </body>
pタグにonCutを入れていないのは、表示専用のタグでは元々カットすることは出来ないので、記述しても呼ばれないから。
WebBrowserコントロールでコピーを禁止したい場合は、onbeforecopyでイベントをキャンセルすればいいそうだ。
(JavaScriptで禁止する場合と同様、oncopyでもいいような気はする)
参考: 魔界の仮面弁士さんのWebbrowserでコピー不可にしたい
マウスでドラッグしたりShiftキーを押しながらカーソルを移動したりしてテキストを選択することが出来る。
各要素のunselectable属性をonにすることにより、選択すること自体を禁止することが出来る。
<body> <form> <p unselectable="off">選択可<p> <p unselectable="on">選択不可<p> <p unselectable="on"><input type="text" value="abc">p要素が選択不可</p> <p><input type="text" value="abc" unselectable="on">input要素が選択不可</p> </form> </body>
unselectable属性がonになっている要素内のテキストは選択することが出来ない。
ただし選択可能なテキストと合わせて範囲選択すると、選択できてしまう。
また、unselectableの設定は子要素には引き継がれない。
input要素の場合、マウスクリックによってそのエリアが選択できなくなる(フォーカスが移らない)だけで、Tab移動によってフォーカスが移れば、その中のテキストを選択することは出来る。
子要素にunselectableの設定が伝播しないので、ページ全体を選択不可にしたい場合は、全要素にunselectableを付ける必要がある。
JavaScriptを使って全要素にunselectableを設定することが出来る。
※input要素にまで付けてしまうと操作が面倒になるので、input要素は除外している。
<html>
<head>
<title>unselectable all</title>
<script type="text/javascript">
function unselectAll() {
for (var i = 0; i < document.all.length; i++) {
var obj = document.all[i];
if (obj.tagName != "INPUT") {
obj.unselectable = "on";
}
}
}
</script>
</head>
<body onload="unselectAll()">
<form>
<h1>unselectable</h1>
<p>選択不可<p>
<p><input type="text" value="abc"></p>
</form>
</body>
</html>
全体が選択禁止になると、Ctrl+Aによる全選択も出来なくなる。
body要素のonSelectStartでfalseを返すことによって選択を禁止することも出来る。
この場合、input要素も正しく動作する。(クリックしてフォーカスを与えることが出来て、ドラッグやShiftキーによる範囲選択は出来ない)
<body onselectstart="return false"> <form> <h1>onselectstart</h1> <p>選択不可<p> <p><input type="text" value="abc"></p> </form> </body>
参考: KaZuhiro FuRuhataさんのページ全体の選択を禁止する
カスケーディングスタイル(CSS)を使って、印刷を禁止する、というか、印刷時に何も出力しないことが出来る。
(真っ白な状態で印刷される。印刷プレビューで見ても真っ白になる)
<html> <head> <title>印刷禁止</title> <style type="text/css"> @media print { body { display:none; } } </style> </head> <body> <h1>印刷禁止</h1> <p>印刷プレビューで見ても真っ白</p> </body> </html>
画面キャプチャー(PrintScreenキーによる画面自体のコピー)はWindowsの機能であってブラウザーの機能ではない為、ブラウザー側の設定で画面キャプチャー自体を禁止することは出来ない。
が、JavaScriptでクリップボードを操作することは出来る。画面キャプチャーはクリップボードに画像がコピーされるので、人間が操作できないような短い間隔でクリップボードを消去することにより、結果として画面キャプチャーを阻止できる。
<html> <head> <title>screen capture</title> <script type="text/javascript"> setInterval("window.clipboardData.clearData()", 100); // setInterval("window.clipboardData.setData('Text','')", 100); </script> </head> <body> <h1>画面キャプチャー拒否</h1> </body> </html>
setInterval()を使って、100ミリ秒毎にクリップボードを変更している。
(clearData()の場合はクリップボードの消去、setData()の場合は空文字列のセット)
この画面がブラウザーで表示されている限り、この消去処理は行われる。(ブラウザーがバックグラウンドになったとしても)
つまりこの間、画面キャプチャーだけでなく、通常の文字列のコピー&カットも行うことは出来ない。(このタイマー処理によってクリップボードが消されてしまうから)
この影響はブラウザー内だけでなく、全てのアプリケーションのコピー&カット操作に及ぶので要注意。
画面キャプチャー用のツールとか使えばこの方法を回避して(クリップボードを介さずに)キャプチャーできるし、極端な事を言えば画面をカメラで撮ればコピーしたようなものだし、どこまで対策すればいいのか難しいと思う。
docomo(iモードブラウザ2.0以降)の場合、metaタグでコピーや画面キャプチャーを禁止することが出来るんだそうだ。
記述例 | 内容 |
---|---|
<meta name="prohibition" content="image"> | 画像保存・画面メモ・スクリーンキャプチャー機能の禁止 |
<meta name="prohibition" content="image,text"> | 画像およびテキストコピー機能の禁止 |
参考: MEMORVAさんの携帯サイト作成の便利なタグ