Greasy Fork

Greasy Fork is available in English.

释放被网站拦截的浏览器快捷键

取消网站的按键捕获,防止用于切换浏览器标签的快捷「cmd+num」被拦截

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         释放被网站拦截的浏览器快捷键
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  取消网站的按键捕获,防止用于切换浏览器标签的快捷「cmd+num」被拦截
// @author       User
// @match        *://*/*
// @grant        GM_log
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function () {
  'use strict';
  // 添加 document.getEventListeners()
  Document.prototype._addEventListener = Document.prototype.addEventListener;
  Document.prototype._removeEventListener = Document.prototype.removeEventListener;
  Document.prototype.addEventListener = function (type, listener, useCapture = false) {
    this._addEventListener(type, listener, useCapture);
    if (!this.eventListenerList) this.eventListenerList = {};
    if (!this.eventListenerList[type]) this.eventListenerList[type] = [];
    this.eventListenerList[type].push({ type, listener, useCapture });
  };
  Document.prototype.removeEventListener = function (type, listener, useCapture = false) {
    this._removeEventListener(type, listener, useCapture);
    if (!this.eventListenerList) this.eventListenerList = {};
    if (!this.eventListenerList[type]) this.eventListenerList[type] = [];
    for (let i = 0; i < this.eventListenerList[type].length; i++) {
      if (
        this.eventListenerList[type][i].listener === listener &&
        this.eventListenerList[type][i].useCapture === useCapture
      ) {
        this.eventListenerList[type].splice(i, 1);
        break;
      }
    }
    if (this.eventListenerList[type].length == 0) {
      delete this.eventListenerList[type];
    }
  };
  Document.prototype.getEventListeners = function (type) {
    if (!this.eventListenerList) this.eventListenerList = {};
    if (type === undefined) return this.eventListenerList;
    return this.eventListenerList[type];
  };

  // 移除document上的keydown按键事件
  try {
    var delay = 200;
    var cleanTimes = 0;
    var maxCleanTimes = 1000;
    var clean = function () {
      cleanTimes++;
      var events = document.getEventListeners('keydown') || [];
      if (events.length) {
        delay = delay >= 200 ? delay / 2 : 200;
      } else {
        delay *= 2;
      }
      if (events.length) {
        GM_log('[' + cleanTimes + '/' + delay + ']释放被网站拦截的浏览器快捷键:', events);
        for (var i = events.length - 1; i >= 0; i--) {
          document.removeEventListener('keydown', events[i].listener);
          GM_log('已释放被网站拦截的浏览器快捷键:', i);
        }
        // clearInterval(getEventsHandle);
      }
      if (cleanTimes < maxCleanTimes) {
        setTimeout(function () {
          clean();
        }, delay);
      } else {
        GM_log('已放弃释放被网站拦截的浏览器快捷键:', events);
      }
    };
    clean();
  } catch (e) {
    GM_log('释放被网站拦截的浏览器快捷键出错:', e);
  }
})();