From 00bb89af1d7d4db0a3b653b1034af44630a9d511 Mon Sep 17 00:00:00 2001 From: Zenny <78681533+ZennDev1337@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:22:08 +0100 Subject: [PATCH] first commit --- jquery-version.js | 84 +++++++++++++++++++++++++++++++++++++++++++ waitForKeyElements.js | 82 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 jquery-version.js create mode 100644 waitForKeyElements.js diff --git a/jquery-version.js b/jquery-version.js new file mode 100644 index 0000000..09c01e7 --- /dev/null +++ b/jquery-version.js @@ -0,0 +1,84 @@ +/*--- waitForKeyElements(): A utility function, for Greasemonkey scripts, + that detects and handles AJAXed content. + + Usage example: + + waitForKeyElements ( + "div.comments" + , commentCallbackFunction + ); + + //--- Page-specific function to do what we want when the node is found. + function commentCallbackFunction (jNode) { + jNode.text ("This comment changed by waitForKeyElements()."); + } + + IMPORTANT: This function requires your script to have loaded jQuery. +*/ +function waitForKeyElements( + selectorTxt /* Required: The jQuery selector string that + specifies the desired element(s). + */, + actionFunction /* Required: The code to run when elements are + found. It is passed a jNode to the matched + element. + */, + bWaitOnce /* Optional: If false, will continue to scan for + new elements even after the first match is + found. + */, + iframeSelector /* Optional: If set, identifies the iframe to + search. + */ +) { + var targetNodes, btargetsFound; + + if (typeof iframeSelector == "undefined") targetNodes = $(selectorTxt); + else targetNodes = $(iframeSelector).contents().find(selectorTxt); + + if (targetNodes && targetNodes.length > 0) { + btargetsFound = true; + /*--- Found target node(s). Go through each and act if they + are new. + */ + targetNodes.each(function () { + var jThis = $(this); + var alreadyFound = jThis.data("alreadyFound") || false; + + if (!alreadyFound) { + //--- Call the payload function. + var cancelFound = actionFunction(jThis); + if (cancelFound) btargetsFound = false; + else jThis.data("alreadyFound", true); + } + }); + } else { + btargetsFound = false; + } + + //--- Get the timer-control variable for this selector. + var controlObj = waitForKeyElements.controlObj || {}; + var controlKey = selectorTxt.replace(/[^\w]/g, "_"); + var timeControl = controlObj[controlKey]; + + //--- Now set or clear the timer as appropriate. + if (btargetsFound && bWaitOnce && timeControl) { + //--- The only condition where we need to clear the timer. + clearInterval(timeControl); + delete controlObj[controlKey]; + } else { + //--- Set a timer, if needed. + if (!timeControl) { + timeControl = setInterval(function () { + waitForKeyElements( + selectorTxt, + actionFunction, + bWaitOnce, + iframeSelector + ); + }, 300); + controlObj[controlKey] = timeControl; + } + } + waitForKeyElements.controlObj = controlObj; +} diff --git a/waitForKeyElements.js b/waitForKeyElements.js new file mode 100644 index 0000000..97cba3c --- /dev/null +++ b/waitForKeyElements.js @@ -0,0 +1,82 @@ +/*--- waitForKeyElements(): A utility function, for Greasemonkey scripts, + that detects and handles AJAXed content. + + Usage example: + + waitForKeyElements ( + "div.comments" + , commentCallbackFunction + ); + + //--- Page-specific function to do what we want when the node is found. + function commentCallbackFunction (jNode) { + jNode.text ("This comment changed by waitForKeyElements()."); + } + + IMPORTANT: This function requires your script to have loaded jQuery. +*/ +function waitForKeyElements( + selectorTxt /* Required: The jQuery selector string that + specifies the desired element(s). + */, + actionFunction /* Required: The code to run when elements are + found. It is passed a jNode to the matched + element. + */, + bWaitOnce /* Optional: If false, will continue to scan for + new elements even after the first match is + found. + */, + iframeSelector /* Optional: If set, identifies the iframe to + search. + */ +) { + let targetNodes, btargetsFound; + + if (typeof iframeSelector == "undefined") targetNodes = selectorTxt; + else targetNodes = iframeSelector.contents().find(selectorTxt); + + if (targetNodes && targetNodes.length > 0) { + btargetsFound = true; + /*--- Found target node(s). Go through each and act if they + are new. + */ + targetNodes.each(function () { + let jThis = this; + let alreadyFound = jThis.data("alreadyFound") || false; + + if (!alreadyFound) { + //--- Call the payload function. + let cancelFound = actionFunction(jThis); + if (cancelFound) btargetsFound = false; + else jThis.data("alreadyFound", true); + } + }); + } else { + btargetsFound = false; + } + //--- Get the timer-control variable for this selector. + let controlObj = waitForKeyElements.controlObj || {}; + let controlKey = selectorTxt.replace(/[^\w]/g, "_"); + let timeControl = controlObj[controlKey]; + + //--- Now set or clear the timer as appropriate. + if (btargetsFound && bWaitOnce && timeControl) { + clearInterval(timeControl); + delete controlObj[controlKey]; + } else { + //--- Set a timer, if needed. + if (!timeControl) { + timeControl = setInterval(function () { + waitForKeyElements( + selectorTxt, + actionFunction, + bWaitOnce, + iframeSelector + ); + }, 300); + controlObj[controlKey] = timeControl; + } + } + waitForKeyElements.controlObj = controlObj; +}