您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Callback binding for HTML Node creation events
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/19857/164039/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 = "node-creation-observer";
- 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 {
- 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();
- }
- };
- }();