您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Callback binding for HTML Node creation events
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/19857/174436/node-creation-observer.js
/** * https://github.com/soufianesakhi/node-creation-observer-js * MIT licensed * Copyright (c) 2016 Soufiane Sakhi */ var NodeCreationObserver = function () { var mutationObserver = null; var observedNodeAttribute = "observed"; var listeners = {}; var options = { childList: true, subtree: true }; var ListenerContext = (function () { function ListenerContext(removeOnFirstMatch) { this.callbacks = []; this.removeOnFirstMatch = removeOnFirstMatch == undefined ? false : removeOnFirstMatch; } return ListenerContext; }()); function onMutationCallback() { Object.keys(listeners).forEach(function (selector) { invokeCallbacks(selector); }); } function invokeCallbacks(selector) { var callbacks = listeners[selector].callbacks; var elements = document.querySelectorAll(selector); var newElements = filterNewElements(elements); if (newElements.length > 0) { if (listeners[selector].removeOnFirstMatch) { removeListener(selector); } newElements.forEach(function (element) { callbacks.forEach(function (callback) { callback.call(element, element); }); }); } } function filterNewElements(elements) { var newElements = []; for (var i = 0; i < elements.length; i++) { var element = elements[i]; var attr = element.getAttribute(observedNodeAttribute); if (attr == null) { element.setAttribute(observedNodeAttribute, "1"); newElements.push(element); } } ; return newElements; } function observe() { if (mutationObserver == null) { mutationObserver = new MutationObserver(onMutationCallback); mutationObserver.observe(document.documentElement, options); } } function removeListener(selector) { delete listeners[selector]; if (Object.keys(listeners).length == 0) { stopObserving(); } } function stopObserving() { if (mutationObserver != null) { mutationObserver.disconnect(); mutationObserver = null; } } return { init: function (customObservedNodeAttribute) { observedNodeAttribute = customObservedNodeAttribute; }, onCreation: function (selector, callback, removeOnFirstMatch) { if (!listeners[selector]) { listeners[selector] = new ListenerContext(removeOnFirstMatch); } listeners[selector].callbacks.push(callback); observe(); if (document.querySelector(selector) != null) { invokeCallbacks(selector); } }, remove: removeListener, stop: function () { listeners = {}; stopObserving(); } }; }();