您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Replace specified texts on the Torn Racing page
// ==UserScript== // @name Car Specification for Torn Races // @namespace http://tampermonkey.net/ // @version 1.11 // @description Replace specified texts on the Torn Racing page // @author HangingLow // @match https://www.torn.com/loader.php?sid=racing* // @match https://www.torn.com/page.php?sid=racing* // @grant none // @license GNU GPLv3 // ==/UserScript== (function() { 'use strict'; //////////////////////////////////////////////////////////////////////////////////// // Change here to false, if you want to use old car names e.g. Ford, Lexus etc... // //////////////////////////////////////////////////////////////////////////////////// const useNewCarNames = true // Function to replace specified texts in the webpage function replaceMultipleOccurrences(targetTexts, replacementTexts) { // Check for valid input arrays if (targetTexts.length !== replacementTexts.length) { console.error("Target texts and replacement texts arrays must have the same length."); return; } // Create a regular expression for all target texts const regex = new RegExp(targetTexts.join('|'), 'g'); // Function to replace text in the body function recursiveReplace(node) { if (node.nodeType === Node.TEXT_NODE) { // Check if the text node contains any of the target texts if (regex.test(node.textContent)) { const originalText = node.textContent; // Keep original text for debug node.textContent = node.textContent.replace(regex, (matched) => { const index = targetTexts.indexOf(matched); return index !== -1 ? replacementTexts[index] : matched; }); console.log(`Replaced "${originalText}" with "${node.textContent}"`); // Debug log } } else { node.childNodes.forEach(recursiveReplace); } } // Start the replacement process from the body of the webpage const targetDivs = document.querySelectorAll('.title-black.top-round.t-overflow, .enlisted-btn-wrap'); targetDivs.forEach(div => { recursiveReplace(div); }); } // Arrays of texts to find and their replacements const targetTexts = [ 'Withdrawal', 'Uptown', 'Underdog', 'Parkland', 'Docks', 'Commerce', 'Two Islands', 'Industrial', 'Vector', 'Mudpit', 'Hammerhead', 'Sewage', 'Meltdown', 'Speedway', 'Stone Park', 'Convict' ]; // Replace with actual target texts const originalCarNames = [ 'Withdrawl - (T) Lexus LFA (LR) (T3)', 'Uptown - (T) Lamborghini Gallardo (LR) (T3)', 'Underdog - (T) Honda NSX (SR) (T2)', 'Parkland - (D) Honda NSX (SR) (T3)', 'Docks - (T) Ford GT (LR) (T3)', 'Commerce - (T) Honda NSX (SR) (T2)', 'Two Islands - (D) Honda NSX (LR) (T3)', 'Industrial - (T) Honda NSX (SR) (T3)', 'Vector - (T) Honda NSX (SR) (T3)', 'Mudpit - (D) Sierra Cosworth (LR) (T3)', 'Hammerhead - (D) Honda NSX (SR) (T2)', 'Sewage - (T) Honda NSX (SR) (T2)', 'Meltdown - (T) Honda NSX (SR) (T3)', 'Speedway - (T) Lexus LFA (LR) (T3)', 'Stone Park - (D) Audi R8 (SR) (T3)', 'Convict - (T) Mercedes SLR (LR) (T3)' ]; // Replace with actual replacement texts const newCarNames = [ 'Withdrawl - (T) Veloria LFA (LR) (T3)', 'Uptown - (T) Lambrini Torobravo (LR) (T3)', 'Underdog - (T) Edomondo NSX (SR) (T2)', 'Parkland - (D) Edomondo NSX (SR) (T3)', 'Docks - (T) Volt GT40 (LR) (T3)', 'Commerce - (T) Edomondo NSX (SR) (T2)', 'Two Islands - (D) Edomondo NSX (LR) (T3)', 'Industrial - (T) Edomondo NSX (SR) (T3)', 'Vector - (T) Edomondo NSX (SR) (T3)', 'Mudpit - (D) Colina Tanprice (LR) (T3)', 'Hammerhead - (D) Edomondo NSX (SR) (T2)', 'Sewage - (T) Edomondo NSX (SR) (T2)', 'Meltdown - (T) Edomondo NSX (SR) (T3)', 'Speedway - (T) Veloria LFA (LR) (T3)', 'Stone Park - (D) Echo R8 (SR) (T3)', 'Convict - (T) Mercia SLR (LR) (T3)' ]; // Replace with actual replacement texts let replacementTexts; if (useNewCarNames) { replacementTexts = newCarNames; } else { replacementTexts = originalCarNames; } // Function to initialize the text replacement on load function init() { //console.log('Script initialized.'); // Log initialization replaceMultipleOccurrences(targetTexts, replacementTexts); // Set up MutationObserver to handle dynamic content changes const observer = new MutationObserver(() => { // Replace only if the text has not already been replaced const currentTexts = Array.from(document.body.childNodes).map(node => node.textContent); const hasAlreadyReplaced = currentTexts.some(text => replacementTexts.some(replacement => text.includes(replacement))); if (!hasAlreadyReplaced) { replaceMultipleOccurrences(targetTexts, replacementTexts); } }); // Start observing the body for changes observer.observe(document.body, { childList: true, subtree: true }); //console.log('MutationObserver is active.'); // Log observer activation } // Check if the DOM is fully loaded before running the script if (document.readyState === 'loading') { //console.log('Document is loading. Waiting for DOM to be ready...'); document.addEventListener('DOMContentLoaded', init); } else { // DOM is ready, run the init function directly //console.log('Document is already loaded. Initializing...'); init(); } })();