Waits for selectors to match newly added nodes
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/432418/970668/Wait%20For%20Selector.js
// ==UserScript==
// @name Wait For Selector
// @version 0.1.0
// @description Waits for selectors to match newly added nodes
// @author Kumirei
// @include *community.wanikani.com*
// @grant none
// ==/UserScript==
(function($) {
// Create new observer on body to monitor all DOM changes
let observer = new MutationObserver(mutationHandler)
observer.observe(document.getElementsByTagName('body')[0], {childList: true, subtree: true})
// Interface for interacting with the library
let interface = {
version: GM_info.script.version,
observer: observer,
wait: waitForSelector,
unwait: unwaitID,
waits: {},
waitsByID: {},
nextID: 0
}
// Start
installInterface()
// Creates a new entry to search for whenever a new element is added to the DOM
function waitForSelector(preSelector, selector, callback) {
if (selector.match(`${preSelector}$`) === null) throw ('preSelector must match the end of the selector')
if (!interface.waits[selector]) interface.waits[selector] = {}
interface.waits[selector][interface.nextID] = callback
interface.waits[selector].pre = preSelector
interface.waitsByID[interface.nextID] = selector
return interface.nextID++
}
// Deletes a previously registered selector
function unwaitID(ID) {
delete interface.waits[interface.waitsByID[ID]][ID]
}
// Makes sure that the public interface is the newest version and the same as the local one
function installInterface() {
let wfke = window.wkfe
if (!wfke) window.wfke = interface
else if (wfke.version < interface.version) {
wfke.version = interface.version
wfke.observer.disconnect()
wfke.observer = interface.observer
wfke.wait = interface.wait
wfke.unwait = interface.unwait
}
interface = wfke || interface
}
// Searches the added nodes and matches them with the provided selectors. Calls the callback for every match.
function mutationHandler(mutations) {
for (let mutation of mutations) {
let added = mutation.addedNodes
for (let node of added) {
if (node.nodeType === 1) {
let sibling = node.previousElementSibling
let target = sibling ? sibling : node.parentElement
for (let selector in interface.waits) {
let query = (sibling?'+ ':'> ')+interface.waits[selector].pre
$(target).find(query).each((i, e)=>{
$(selector).each((I, E)=>{
if (e.isSameNode(E)) {
for (let callback of Object.values(interface.waits[selector])) {
if (typeof callback === "function") callback(E)
}
}
})
})
}
}
}
}
}
})(window.jQuery);