Skip to content

Instantly share code, notes, and snippets.

@richard512
Created July 7, 2017 01:55
Show Gist options
  • Save richard512/accd9b489c655bf159fcd9be9e099b7f to your computer and use it in GitHub Desktop.
Save richard512/accd9b489c655bf159fcd9be9e099b7f to your computer and use it in GitHub Desktop.
re-enable right click (bookmarklet)
javascript:(function(w){
var arr = ['contextmenu','copy','cut','paste','mousedown','mouseup','beforeunload','beforeprint'];
for(var i = 0, x; x = arr[i]; i++){
if(w['on' + x])w['on' + x] = null;
w.addEventListener(x, function(e){e.stopPropagation()}, true);
};
for(var j = 0, f; f = w.frames[j]; j++){try{arguments.callee(f)}catch(e){}}})(window);
@cusco
Copy link

cusco commented Feb 21, 2025

javascript:function enableContextMenu(aggressive = true) { void(document.ondragstart=null); void(document.onselectstart=null); void(document.onclick=null); void(document.onmousedown=null); void(document.onmouseup=null); void(document.body.oncontextmenu=null); enableRightClickLight(document); if (aggressive) { enableRightClick(document); removeContextMenuOnAll('body'); removeContextMenuOnAll('img'); removeContextMenuOnAll('td'); } } function removeContextMenuOnAll(tagName) { var elements = document.getElementsByTagName(tagName); for (var i = 0; i < elements.length; i++) { enableRightClick(elements[i]); enablePointerEvents(elements[i]); } } function enableRightClickLight(el) { el || (el = document); el.addEventListener('contextmenu', bringBackDefault, true); } function enableRightClick(el) { el || (el = document); el.addEventListener('contextmenu', bringBackDefault, true); el.addEventListener('dragstart', bringBackDefault, true); el.addEventListener('selectstart', bringBackDefault, true); el.addEventListener('click', bringBackDefault, true); el.addEventListener('mousedown', bringBackDefault, true); el.addEventListener('mouseup', bringBackDefault, true); } function restoreRightClick(el) { el || (el = document); el.removeEventListener('contextmenu', bringBackDefault, true); el.removeEventListener('dragstart', bringBackDefault, true); el.removeEventListener('selectstart', bringBackDefault, true); el.removeEventListener('click', bringBackDefault, true); el.removeEventListener('mousedown', bringBackDefault, true); el.removeEventListener('mouseup', bringBackDefault, true); } function bringBackDefault(event) { event.returnValue = true; (typeof event.stopPropagation === 'function') && event.stopPropagation(); (typeof event.cancelBubble === 'function') && event.cancelBubble(); } function enablePointerEvents(el) { if (!el) return; el.style.pointerEvents='auto'; el.style.webkitTouchCallout='default'; el.style.webkitUserSelect='auto'; el.style.MozUserSelect='auto'; el.style.msUserSelect='auto'; el.style.userSelect='auto'; enablePointerEvents(el.parentElement); } enableContextMenu();

@Maritornez
Copy link

It's re-enable default context menu toggle script for bookmarklet: one click for activate, and one to deactivate.

javascript:(function(){
    window._ctxEnabled = !window._ctxEnabled;

    function walk(win, cb) {
        cb(win);
        for (let i = 0; i < win.frames.length; i++) {
            try {
                walk(win.frames[i], cb);
            } catch(e) {}
        }
    }

    function disable(win) {
        win._ctxHandlers = win._ctxHandlers || {};
        ['contextmenu','mousedown','mouseup'].forEach(evt => {
            if (!win._ctxHandlers[evt]) {
                const handler = e => e.stopImmediatePropagation();
                win.addEventListener(evt, handler, true);
                win._ctxHandlers[evt] = handler;
            }
        });
    }

    function enable(win) {
        const h = win._ctxHandlers || {};
        Object.keys(h).forEach(evt => {
            win.removeEventListener(evt, h[evt], true);
        });
        win._ctxHandlers = {};
    }

    walk(window, win => {
        if (window._ctxEnabled) {
            disable(win);
        } else {
            enable(win);
        }
    });
})();

@cusco
Copy link

cusco commented May 14, 2025

javascript:function enableContextMenu(aggressive = true) {
  void(document.ondragstart = null);
  void(document.onselectstart = null);
  void(document.onclick = null);
  void(document.onmousedown = null);
  void(document.onmouseup = null);
  void(document.body.oncontextmenu = null);
  enableRightClickLight(document);
  if (aggressive) {
    enableRightClick(document);
    removeContextMenuOnAll('body');
    removeContextMenuOnAll('img');
    removeContextMenuOnAll('td');
  }
}

function removeContextMenuOnAll(tagName) {
  var elements = document.getElementsByTagName(tagName);
  for (var i = 0; i < elements.length; i++) {
    enableRightClick(elements[i]);
    enablePointerEvents(elements[i]);
  }
}

function enableRightClickLight(el) {
  el || (el = document);
  el.addEventListener('contextmenu', bringBackDefault, true);
}

function enableRightClick(el) {
  el || (el = document);
  el.addEventListener('contextmenu', bringBackDefault, true);
  el.addEventListener('dragstart', bringBackDefault, true);
  el.addEventListener('selectstart', bringBackDefault, true);
  el.addEventListener('click', bringBackDefault, true);
  el.addEventListener('mousedown', bringBackDefault, true);
  el.addEventListener('mouseup', bringBackDefault, true);
}

function restoreRightClick(el) {
  el || (el = document);
  el.removeEventListener('contextmenu', bringBackDefault, true);
  el.removeEventListener('dragstart', bringBackDefault, true);
  el.removeEventListener('selectstart', bringBackDefault, true);
  el.removeEventListener('click', bringBackDefault, true);
  el.removeEventListener('mousedown', bringBackDefault, true);
  el.removeEventListener('mouseup', bringBackDefault, true);
}

function bringBackDefault(event) {
  event.returnValue = true;
  (typeof event.stopPropagation === 'function') && event.stopPropagation();
  (typeof event.cancelBubble === 'function') && event.cancelBubble();
}

function enablePointerEvents(el) {
  if (!el) return;
  el.style.pointerEvents = 'auto';
  el.style.webkitTouchCallout = 'default';
  el.style.webkitUserSelect = 'auto';
  el.style.MozUserSelect = 'auto';
  el.style.msUserSelect = 'auto';
  el.style.userSelect = 'auto';
  enablePointerEvents(el.parentElement);
}

enableContextMenu();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment