NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name CFA Load All // @namespace http://tampermonkey.net/ // @version 0.1 // @description Auto load all topics // @author habla2019 // @match https://study.cfainstitute.org/app/* // @grant none // @require http://code.jquery.com/jquery-3.4.1.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.18.2/babel.js // @require https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.16.0/polyfill.js // @license MIT // ==/UserScript== /* jQuery, $, waitForKeyElements */ const loadAll = jNode => { console.log('Found node "a.load-more"'); for (var i = 0; i < 30; i++) { document.querySelector('a.load-more').click(); } }; /*--- 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. */ const waitForKeyElements = (selectorTxt, actionFunction, bWaitOnce) => { var btargetsFound; var targetNodes = $(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(() => { waitForKeyElements(selectorTxt, actionFunction, bWaitOnce); }, 300); controlObj[controlKey] = timeControl; } } waitForKeyElements.controlObj = controlObj; } (() => { 'use strict'; waitForKeyElements('a.load-more', loadAll, true); })();