プラットフォーム非依存 完全コピペガード
よくあるメールアドレスの再入力フォーム。コピー&ペーストを防ぎたい・・
コントロールキー+Vを防いで右クリックも防いで・・・
そんな方法はたいへんすぎます。
コピーやペーストの方法は、OSによって違うし、方法の数もたくさんあります。
ところが以下のスクリプトを用いれば、プラットフォームに関わらずコピー&ペーストを完全ガードします。
簡単な仕組ですが、2008年2月10日現在見かけたことはないので画期的と思われます。
(2008年5月、ページ外からのコピーを許可するため、ページ内でテキスト選択した時点で文字列を記憶するよう改良しました。)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<title>コピー&ペーストのガード</title>
</head>
<body>
<form>
<p>
メールアドレスを入力<input type="text">
</p>
<p>
確認のためもう一度<input type="text">
</p>
</form>
</style>
<script type="text/javascript">
//@cc_on
var mailForm1 = document.forms[0].elements[0];
var mailForm2 = document.forms[0].elements[1];
var meado1 = "";//外にでてしまった・・
var msg = "";//デバッグ用
var chk_switch1 = true;//フォーカス時にチェック関数を一度だけ呼び出すため。
var chk_switch2 = true;//フォーカスアウト時にチェック関数を止めるため。
var chk_switch3 = true;//入力欄1で選択範囲の取得を止めるため。
//入力欄1の選択範囲を取得。onblurだと選択が解除された後なので人力でチェック。
mailForm1./*@if(@_jscript)attachEvent ('on' + @else@*/
addEventListener (/*@end@*/ 'focus', function () {
if(chk_switch3){
setTimeout(function(){
var newMeado = /*@if (@_jscript) document.selection.createRange().text;@else@*/
mailForm1.value.substr(0,mailForm1.selectionEnd);/*@end@*/
if(!(meado1!="" && newMeado=="")){meado1 = newMeado};
//↑この条件を入れないと【1】タイミングがずれて空白が上書きされることがある。
//【2】選択したあと同フォーム内で選択解除されても問題なくなる。
if(chk_switch3){setTimeout(arguments.callee,100);}
},100)
}
}, false );
//入力欄1からのフォーカスアウトで選択範囲の取得は終了
mailForm1./*@if (@_jscript) attachEvent ('on' + @else@*/
addEventListener (/*@end@*/ 'blur', function () {
chk_switch3 = false;
}, false );
//↓入力欄2にフォーカスがあたった瞬間から、激しくチェック
mailForm2./*@if (@_jscript) attachEvent ('on' + @else@*/
addEventListener (/*@end@*/ 'focus', function () {
chk_switch2 = true;
if(chk_switch1){
setTimeout(function(){
chkMeado2("");
chk_switch1 = false;
},100);
}
}, false );
//↓0.1秒以内に突然一つ目の入力欄と同じになったら警告&削除
function chkMeado2(old_meado2){
var meado2 = mailForm2.value;
if(meado2==meado1 && old_meado2=="" && meado2!=""){
alert("上のフォームからはコピー&ペースト禁止です。");
mailForm2.value = "";
mailForm2.focus(); //アラートでフォーカスが外れるので
chkMeado2(meado2); //そのまま再度ペーストされても防ぐ
}else if(chk_switch2){
setTimeout(function(){
chkMeado2(meado2);
},100);
}
}
//↓フォーカスアウトでチェック解除&再フォーカスに備え初期化
mailForm2./*@if (@_jscript) attachEvent ('on' + @else@*/
addEventListener (/*@end@*/ 'blur', function () {
chk_switch3 = true;
chk_switch2 = false;
chk_switch1 = true;
}, false );
//setTimeout(function(){alert(msg)},8000);
</script>
</body>
</html>
動作確認用