【jQuery】右クリックを禁止する方法

Webサイトの画像や文章を無断コピーされたくない――そんなときに使われるのが「右クリック禁止」です。jQueryでは数行のコードで実装できますが、どこまで有効で、どこから無意味になるかを理解した上で使うことが大切です。

この記事では、ページ全体への適用・特定要素のみの制限・カスタムコンテキストメニューの実装まで、実用レベルのコードと共に解説します。

この記事でわかること

  • ページ全体・特定要素のみの右クリック禁止方法
  • 画像・テキスト選択を個別に禁止する方法
  • カスタムコンテキストメニューに差し替える方法
  • キーボードショートカット(Ctrl+U / F12)の無効化
  • 右クリック禁止の限界と正しい使い方の考え方
スポンサーリンク

ページ全体の右クリックを禁止する

最もシンプルな実装です。contextmenu イベントで e.preventDefault() を呼ぶだけです。

<script src="https://code.jquery.com/jquery-3.7.1.min.js"
  integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
  crossorigin="anonymous"></script>
$(function () {
  $(document).on("contextmenu", function (e) {
    e.preventDefault();
    return false;
  });
});

return falsee.preventDefault()e.stopPropagation() を両方呼ぶ短縮形です。どちらでも動作は同じです。

特定の要素だけ右クリックを禁止する

ページ全体を禁止するとユーザーの利便性を大きく損ねます。画像や特定のコンテナに限定するのがより現実的な対応です。

画像のみ禁止

$(function () {
  // すべての img 要素の右クリックを禁止
  $("img").on("contextmenu", function (e) {
    e.preventDefault();
  });
});

特定クラスを持つ要素のみ禁止

$(function () {
  // .no-rightclick クラスが付いた要素のみ禁止
  $(".no-rightclick").on("contextmenu", function (e) {
    e.preventDefault();
  });
});
<!-- 右クリックを禁止したい要素に no-rightclick クラスを付ける -->
<img src="photo.jpg" alt="サンプル画像" class="no-rightclick">
<div class="no-rightclick">
  <p>このコンテンツはコピー禁止エリアです</p>
</div>

動的に追加された要素にも対応する(イベント委譲)

JavaScript で後から追加した要素には通常のon()が効きません。イベント委譲を使うと動的要素にも対応できます。

$(function () {
  // document(または親コンテナ)に委譲して動的要素にも対応
  $(document).on("contextmenu", ".no-rightclick", function (e) {
    e.preventDefault();
  });
});

テキスト選択を禁止する

右クリック禁止だけではテキストのドラッグ選択→コピーは防げません。テキスト選択も制限する場合はCSSと組み合わせます。

.no-select {
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
}

jQueryでも同等のことができます。

$(function () {
  $(".no-select")
    .on("selectstart", function (e) { e.preventDefault(); })  // IE対応
    .css({
      "-webkit-user-select": "none",
      "-moz-user-select":    "none",
      "user-select":         "none"
    });
});

注意: user-select: none<input><textarea> にも影響する場合があります。フォーム要素には適用しないよう注意してください。

カスタムコンテキストメニューに差し替える

標準メニューを完全に禁止するのではなく、独自メニューに差し替えるのがUX的に優れた方法です。「保存禁止」と「シェアする」など独自の選択肢を提供できます。

HTML

<!-- カスタムメニュー -->
<ul id="customMenu">
  <li id="menu-info">ℹ️ 画像情報</li>
  <li id="menu-share">? URLをコピー</li>
</ul>

<img src="photo.jpg" alt="サンプル" id="targetImage">

CSS

#customMenu {
  display: none;
  position: fixed;
  background: #fff;
  border: 1px solid #ccc;
  border-radius: 6px;
  padding: .4rem 0;
  min-width: 160px;
  box-shadow: 0 4px 12px rgba(0,0,0,.15);
  z-index: 9999;
  list-style: none;
  margin: 0;
}
#customMenu li {
  padding: .5rem 1rem;
  cursor: pointer;
  font-size: .9rem;
}
#customMenu li:hover {
  background: #f0f7ff;
}

JavaScript

$(function () {
  const $menu = $("#customMenu");

  // 右クリックでカスタムメニューを表示
  $("#targetImage").on("contextmenu", function (e) {
    e.preventDefault();
    $menu.css({ top: e.clientY, left: e.clientX }).show();
  });

  // 他の場所をクリックしたらメニューを閉じる
  $(document).on("click", function () {
    $menu.hide();
  });

  // Escキーでも閉じる
  $(document).on("keydown", function (e) {
    if (e.key === "Escape") $menu.hide();
  });

  // メニュー項目の処理
  $("#menu-info").on("click", function () {
    alert("画像サイズ: 1200x800px");
  });
  $("#menu-share").on("click", function () {
    navigator.clipboard.writeText(location.href).then(function () {
      alert("URLをコピーしました");
    });
  });
});

スマートフォン(iOS)の長押しメニューを無効化する

iOSのSafariでは画像を長押しすると「写真に追加」などのメニューが表示されます。これをCSSで無効化できます。

/* iOS の長押しメニュー(callout)を無効化 */
img.no-save {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  pointer-events: none;  /* ドラッグ保存も防ぐ */
}

pointer-events: none を設定すると画像へのクリックやドラッグも無効になります。リンクを画像に重ねている場合など、クリックが必要なケースでは外してください。

ドラッグによる画像保存を禁止する

画像をデスクトップにドラッグ&ドロップすると保存できてしまいます。dragstart イベントで防ぎましょう。

$(function () {
  // 画像のドラッグ保存を禁止
  $("img.no-save").on("dragstart", function (e) {
    e.preventDefault();
  });
});

CSSと組み合わせた完全版:

$(function () {
  const $protectedImgs = $("img.no-save");

  // 右クリック禁止
  $protectedImgs.on("contextmenu", function (e) { e.preventDefault(); });
  // ドラッグ禁止
  $protectedImgs.on("dragstart",   function (e) { e.preventDefault(); });
  // 長押し対策(touchstart で選択を抑制)
  $protectedImgs.on("touchstart",  function (e) { e.preventDefault(); });
});

注意: touchstart の preventDefault はスクロールも妨げる場合があります。画像コンテナ全体ではなく img 要素のみに適用してください。

キーボードショートカットも無効化する

右クリック禁止だけでは、Ctrl+U(ソース表示)や F12(DevTools)などで内容を確認できます。これらも合わせて無効化したい場合のコードです。

強く非推奨: F12やCtrl+Uを無効化しても開発者ツールは別の方法で開けます(詳細は後述)。またデバッグ作業の妨げにもなるため、本番サイトへの適用は避けることを強く推奨します。参考情報として掲載します。

$(function () {
  $(document).on("keydown", function (e) {
    // F12(DevTools)
    if (e.key === "F12") {
      e.preventDefault();
      return false;
    }
    // Ctrl+U(ソース表示)
    if (e.ctrlKey && e.key === "u") {
      e.preventDefault();
      return false;
    }
    // Ctrl+Shift+I(DevTools)
    if (e.ctrlKey && e.shiftKey && e.key === "I") {
      e.preventDefault();
      return false;
    }
    // Ctrl+S(保存)
    if (e.ctrlKey && e.key === "s") {
      e.preventDefault();
      return false;
    }
  });
});

右クリック禁止の限界と正しい理解

右クリック禁止は「コンテンツ保護」として広く使われていますが、実際には以下の方法で簡単に回避できます。

回避方法 説明
JavaScriptを無効化 ブラウザの設定でJSをオフにすれば右クリックは通常通り動作する
デベロッパーツール F12を別の方法で開き(例: メニューバーから)、ソースを確認できる
URLバーに view-source:// を入力 HTMLソースを直接表示できる
スクリーンショット PrintScreenやOSの機能で画面をキャプチャできる
キャッシュを直接参照 ブラウザキャッシュのファイルをOSのファイルマネージャーで確認できる

右クリック禁止の正しい位置づけ: 右クリック禁止は「著作権の意思表示」「カジュアルなコピー防止」に留まります。本格的な著作権保護には電子透かしや法的対処が必要です。UXコストと効果を天秤にかけて判断してください。

よくある質問(FAQ)

Q. 右クリック禁止はWordPressでも使えますか?
A. はい。functions.phpでjQueryを読み込み、カスタムJSファイルにコードを書くか、プラグイン(例: WP Content Copy Protection)を使う方法があります。ただしSEO・UEの観点から必要最小限に留めることを推奨します。
Q. スマートフォンでも右クリック禁止は有効ですか?
A. スマホには右クリックがないため、通常の contextmenu 禁止は効果がありません。iOSでは長押しメニューが表示されますが、これを禁止するには CSS の -webkit-touch-callout: none と -webkit-user-select: none を組み合わせる必要があります。
Q. Vanilla JS(jQueryなし)でも実装できますか?
A. はい。document.addEventListener(“contextmenu”, function(e){ e.preventDefault(); }) で同等の処理ができます。jQueryは不要なので、jQueryを使っていないプロジェクトではVanilla JSを推奨します。
Q. 特定のユーザー(管理者)には右クリックを許可したい
A. 完全にクライアントサイドのJSでは制御できません。サーバーサイドでログイン状態を判定し、管理者の場合はJSファイル自体を出力しない(または別の処理をする)実装が必要です。
Q. 右クリック禁止をすると検索エンジンに影響しますか?
A. Googlebotは通常右クリックを使わないため、SEOへの直接的な影響はありません。ただし、ユーザーのUXを損なうことで直帰率が上がり間接的に影響する可能性があります。

あわせて読みたい

まとめ

jQueryで右クリックを禁止するポイント

  • contextmenu イベントで e.preventDefault() を呼ぶだけで実装できる
  • ページ全体より特定要素のみに絞るのがUX的に良い
  • テキスト選択まで防ぎたい場合は CSS user-select: none を組み合わせる
  • 標準メニューを禁止する代わりにカスタムコンテキストメニューに差し替えると価値が上がる
  • 右クリック禁止はJSオフ・DevTools・スクショで容易に回避できる。過信せず「意思表示」と割り切る

「コンテンツを守りたい」という目的は理解できますが、UXへの影響を考えると必要最小限の範囲での適用が現実的です。カスタムメニューの実装など、ユーザーへの付加価値と組み合わせた使い方を検討してみてください。