2008年2月11日月曜日

右クリック禁止を解除するProxomitronフィルタ

右クリックメニューの表示を禁止しているサイトで右クリックメニューを表示させます。
以下の3つのフィルタで実現している機能全てを含んでおり、それ以上の対策も施してあります。

  • Allow right mouse click
  • Allow right mouse click 2
  • Allow right mouse click plus
[Patterns]
Name = "Allow contextmenu event [js] [2008/02/11] test2"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^</head>))$STOP()"
Replace = "\r\n<script type='text/javascript'>\r\n"
          "function addLoadEvent(func) {"
          " if(typeof window.addEventListener == 'function'){"
          "  window.addEventListener('load', func, false);"
          "  return true;"
          " } else if(typeof window.attachEvent == 'object'){"
          "  window.attachEvent('onload', func);"
          "  return true;"
          " }"
          ""
          " var oldonload = window.onload;"
          " if (typeof window.onload != 'function') {"
          "  window.onload = func;"
          " } else {"
          "  window.onload = function() {"
          "   oldonload();"
          "   func();"
          "  }"
          " }"
          "}"
          "function killContextmenuEvent(){"
          " if(typeof document.oncontextmenu == 'function'){"
          "  document.oncontextmenu = null;"
          " }"
          ""
          " if(typeof document.onmousedown == 'function'){"
          "  document.onmousedown = null;"
          " }"
          ""
          " var tag = document.getElementsByTagName('*');"
          ""
          " for(i = 0, L = tag.length; i < L ; i++){"
          "  tag[i].oncontextmenu = null;"
          "  if(navigator.appName == 'Microsoft Internet Explorer'){"
          "   tag[i].onmousedown = null;"
          "  }"
          " }"
          "}"
          "addLoadEvent(killContextmenuEvent);"
          "\r\n</script>\r\n"

動作検証

実際に動作しているか確認するためのテストページも作ってみました。

onmousedown について

onmousedown はマウスボタンが押されたときに発動します。
このことから、onmousedown は右クリック禁止以外の用途で使われる事があると想像でき、onmousedownに関する処理を無効化すると、右クリック禁止以外の場面で使用している重要な機能を失ってしまう可能性があります。
私の検証した範囲ではonmousedown が右クリックに反応するのはIEのみという結果だったので、このフィルタではonmousedown の無効化処理をIE限定にしています。
(マウスイベントが右クリックによるものかの判定できなかったので、やむなくブラウザの名前で判定しました)

ただし、通常の使い方で表示領域全体を監視する document.onmousedown を使用する必要性はまずないと思いますので、こちらは機能が使えれる環境であれば有効になる処理にしてあります。
もっとも、documentオブジェクトからonmousedownへのアクセスはIEの独自拡張っぽいです。

addEventListenerへの対策

addEventListenerにどうやって対策したものか、考えあぐねています。
addEventListener で追加したイベントハンドラはremoveEventListenerで解除できるようですが、メソッド名がわからなければ手が出せません。
悩んだ末に考えついた対策は次の2通り。どちらも形になるところまで進んでいません。

  • addEventListener でデフォルトアクションを発生させる処理を追加する
  • removeEventListener ですべてのイベントハンドラを削除する

attachEvent対応

IE対応を謳うならattachEventにも対応しなくてはなりませんが、力尽きたのでいずれ。
希望があれば、声をかけてください。

ラベル: ,

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

<< ホーム