您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Find the specified element and execute subsequent code after finding it. This code is rewritten by BrockA's waitForKeyElements.js and uses the native js environment.
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/523085/1519645/waitForKeyElements3.js
- // ==UserScript==
- // @name WaitForKeyElements3
- // @namespace http://tampermonkey.net/
- // @version 1.0
- // @description Find the specified element and execute subsequent code after finding it.
- // @author Zero
- // @grant none
- // ==/UserScript==
- // Example usage:
- // waitForKeyElements("div.comments", {"textContent":"xxx"}, commentCallbackFunction);
- // function commentCallbackFunction(node) {
- // node.textContent = "This comment changed by waitForKeyElements().";
- // }
- function waitForKeyElements(
- selectorTxt, // Required: The CSS selector string that specifies the desired element(s).
- actionFunction, // Required: The code to run when elements are found. It is passed the matched element.
- attributeFilter,// Optional: Filter the element by target attribute(s).
- 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 = false;
- function querySelectorAllInIframe(iframe, selector) {
- var doc = iframe.contentDocument || iframe.contentWindow.document;
- return doc.querySelectorAll(selector);
- }
- if (typeof iframeSelector !== "undefined") {
- var iframe = document.querySelector(iframeSelector);
- if (iframe) {
- targetNodes = querySelectorAllInIframe(iframe, selectorTxt);
- }
- } else {
- targetNodes = document.querySelectorAll(selectorTxt);
- }
- if (targetNodes && targetNodes.length > 0) {
- btargetsFound = true;
- // Found target node(s). Go through each and act if they are new.
- targetNodes.forEach(function (node) {
- if (attributeFilter){
- for (let attr of Object.keys(attributeFilter)){
- if(node[attr] != attributeFilter[attr]){
- return ;
- }
- }
- }
- var alreadyFound = node.dataset.alreadyFound || false;
- if (!alreadyFound) {
- // Call the payload function.
- var cancelFound = actionFunction ? actionFunction(node) : console.log(node);
- if (cancelFound) {
- btargetsFound = false;
- } else {
- node.dataset.alreadyFound = true;
- }
- }
- });
- }
- // 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, attributeFilter, bWaitOnce, iframeSelector);
- }, 300);
- controlObj[controlKey] = timeControl;
- }
- }
- waitForKeyElements.controlObj = controlObj;
- };