Event Control

Provides ability to enable/disable specific events (accessible from GM menu) on a site page which are specifically listened by the site and browser extensions. When an event is disabled, event handlers including the web browser's, will be disabled.

  1. // ==UserScript==
  2. // @name Event Control
  3. // @namespace https://greasyfork.org/en/users/85671-jcunews
  4. // @version 1.0.2
  5. // @license AGPL v3
  6. // @author jcunews
  7. // @description Provides ability to enable/disable specific events (accessible from GM menu) on a site page which are specifically listened by the site and browser extensions. When an event is disabled, event handlers including the web browser's, will be disabled.
  8. // @match *://*/*
  9. // @include *:*
  10. // @grant GM_registerMenuCommand
  11. // @run-at document-start
  12. // ==/UserScript==
  13.  
  14. //Note: Since web browsers do not provide an execution order or load order for browser extensions,
  15. // event handlers from browser extensions can not be disabled if their code is run before this script.
  16.  
  17. ((evs, ael) => {
  18. evs = {};
  19. function eventGate(ev) {
  20. if ((!ev.target || !ev.target.closest || !ev.target.closest("#selc_ujs")) && (ev.type in evs) && !evs[ev.type]) {
  21. ev.stopImmediatePropagation();
  22. ev.stopPropagation();
  23. ev.preventDefault()
  24. }
  25. }
  26. ael = EventTarget.prototype.addEventListener;
  27. EventTarget.prototype.addEventListener = function(typ, fn, opts) {
  28. let s = String(typ);
  29. if (s && !(s in evs)) ael.call(this, typ, eventGate, {capture: evs[s] = true, passive: false});
  30. return ael.apply(this, arguments)
  31. };
  32. GM_registerMenuCommand("Event List", () => {
  33. document.documentElement.insertAdjacentHTML("beforeend", `
  34. <div id="selc_ujs"><style>
  35. #selc_ujs, #selc_ujs *{all:revert;box-sizing:border-box;font-family:sans-serif}
  36. #selc_ujs{position:fixed;left:0;top:0;width:100vw;height:100vh;background:#0007;cursor:pointer}
  37. #selc_pop{position:absolute;right:2em;border:.2em solid #007;border-radius:.3em;padding:.3em;max-height:75vh;overflow-y:scroll;background:#fff;cursor:auto}
  38. #selc_pop label{display:block;padding-right:.3em}
  39. #selc_pop label:hover{background:#ddf}
  40. </style><div id="selc_pop">${
  41. Object.keys(evs).sort().map(k => `<label><input ${evs[k] ? "checked" : ""} type="checkbox" data-key="${k}"/> ${k}</label>`).join("")
  42. }</div>`);
  43. selc_ujs.onclick = ev => {
  44. (ev.target === selc_ujs) && selc_ujs.remove()
  45. };
  46. selc_ujs.addEventListener("input", ev => {
  47. evs[ev.target.dataset.key] = ev.target.checked
  48. });
  49. document.activeElement && document.activeElement.blur()
  50. })
  51. })()