【令和最新版】右クリック禁止解除スクリプト(ブックマークレット) TL;DR これを使うと右クリック禁止解除できる javascript:!function() { const d = document; const s = [ "userSelect", "khtmlUserSelect", "MozUserSelect", "MsUserSelect", "WebkitUserSelect" ]; const f = (g) => { if (typeof g !== 'function') { return () => true; } return function(...args) { g.apply(this, args); return true; }; }; d.querySelectorAll('*').forEach(e => { e.style && s.forEach(b => {e.style[b] = "auto"}); e.onmousedown = f(e.onmousedown); e.onmousemove = f(e.onmousemove); e.onmouseup = f(e.onmouseup); e.onselectstart = f(e.onselectstart); e.oncontextmenu = f(e.oncontextmenu); }); d.onmousedown = f(d.onmousedown); d.onmousemove = f(d.onmousemove); d.onmouseup = f(d.onmouseup); d.onselectstart = f(d.onselectstart); d.oncontextmenu = f(d.oncontextmenu); d.body.oncontextmenu = f(d.body.oncontextmenu); }(); 世間では、右クリック禁止を解除するブックマークレットが出回っている。以下のようなものだ。 javascript: ! function() { var a = document, b = ["userSelect", "khtmlUserSelect", "MozUserSelect", "MsUserSelect", "WebkitUserSelect"]; f = function() { return true; }; Array.prototype.forEach.call(a.all, function(a) { a.style && b.forEach(function(b) { a.style[b] = "auto" }), a.onmousedown = a.onmousemove = a.onmouseup = a.onselectstart = "" }), a.onmousedown = a.onmousemove = a.onmouseup = a.onselectstart = a.oncontextmenu = a.body.oncontextmenu = f; obs = document.all; for (i = 0; i true; d.querySelectorAll('*').forEach(e => { e.style && s.forEach(b => {e.style[b] = "auto"}); e.onmousedown = e.onmousemove = e.onmouseup = e.onselectstart = e.oncontextmenu = f; }); d.onmousedown = d.onmousemove = d.onmouseup = d.onselectstart = d.oncontextmenu = d.body.oncontextmenu = f; }(); テストはあまりしていないので、性能が維持されているかどうかはわからない。少なくとも進化はしてないと思う。 もっとうまくできる? 今は全要素のイベントハンドラに() => trueを割り当てているが、これには問題があるかもしれない。アプリケーション固有のイベントハンドラを全て無視するということでもあるからだ。 代わりに、現在の動作をラップして実行し、返り値はtrueであるような関数を作れば、元の動作を保ったまま右クリックを解放できるのではないか? つまりこういうことだ。 javascript:!function() { const d = document; const s = [ "userSelect", "khtmlUserSelect", "MozUserSelect", "MsUserSelect", "WebkitUserSelect" ]; const f = (g) => { if (typeof g !== 'function') { return () => true; } return function(...args) { g.apply(this, args); return true; }; }; d.querySelectorAll('*').forEach(e => { e.style && s.forEach(b => {e.style[b] = "auto"}); e.onmousedown = f(e.onmousedown); e.onmousemove = f(e.onmousemove); e.onmouseup = f(e.onmouseup); e.onselectstart = f(e.onselectstart); e.oncontextmenu = f(e.oncontextmenu); }); d.onmousedown = f(d.onmousedown); d.onmousemove = f(d.onmousemove); d.onmouseup = f(d.onmouseup); d.onselectstart = f(d.onselectstart); d.oncontextmenu = f(d.oncontextmenu); d.body.oncontextmenu = f(d.body.oncontextmenu); }(); このコードは const f = (g) => { if (typeof g !== 'function') { return () => true; } return function(...args) { g.apply(this, args); return true; }; }; この部分がキモで、この関数fは、関数(かもしれない変数)gを受け取り、gを実行しつつもtrueを返す新たな関数を作成する。もしgが関数でなければ、trueを返すだけの関数を作る。 元の動作が失われると問題が出るようなサイトを見たことがないため、果たしてこのコードがうまく動くのかは分かりません。本記事のコードに関してはCC0で自己責任で利用してください。"AS IS"ってやつですね。 ---------------------------------------- - タイトル: 【令和最新版】右クリック禁止解除スクリプト(ブックマークレット) - 著者: 千本槍みなも@ナタクラゲ - 作成年: 2025 - URL: https://blog.natakurage.cc/articles/enable-right-click - ライセンス: CC BY-SA 4.0