您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Ensure all Shadow DOM nodes are open. Includes workarounds for broken functionality due to Shadow DOM restriction. Intented for research use.
// ==UserScript== // @name Open Source Shadow DOM // @namespace https://greasyfork.org/en/users/85671-jcunews // @version 1.1.3 // @license AGPLv3 // @author jcunews // @description Ensure all Shadow DOM nodes are open. Includes workarounds for broken functionality due to Shadow DOM restriction. Intented for research use. // @match *://*/* // @grant none // @inject-into page // @run-at document-start // ==/UserScript== (d => { //fix document.activeElement not able to get element in Shadow DOM var dac = (d = Object.getOwnPropertyDescriptor(Document.prototype, "activeElement")).get; d.get = function() { var p = dac.call(this), n; while (n = p.shadowRoot?.activeElement) p = n; return p }; Object.defineProperty(Document.prototype, "activeElement", d); //make sure Shadow DOMs are open var as = Element.prototype.attachShadow; Element.prototype.attachShadow = function(opts) { var o = {}, m = opts?.mode, r; Array.from(Object.entries(opts)).forEach(a => o[a[0]] = a[1]); o.mode = "open"; opts = o; r = as.apply(this, arguments); if (m === "closed") { Object.defineProperty(r, "realMode", {value: "open"}); Object.defineProperty(r, "mode", { get: () => "closed", set: v => v }) } return r }; //fix event not dispatching if it came from element in Shadow DOM var dael = Document.addEventListener; Document.addEventListener = function(typ, fn) { function f(e) { if (e.shadowRoot) { e.shadowRoot.addEventListener.apply(e.shadowRoot, arguments); e.shadowRoot.querySelectorAll('*').forEach(f) } } document.querySelectorAll('body,body *').forEach(f); return dael.apply(this, arguments) }; })()