您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Updates the price display with VAT based on selected period and supports Livewire updates
当前为
// ==UserScript== // @name Price Update with VAT and Period (Livewire Support) // @namespace http://tampermonkey.net/ // @version 0.8 // @description Updates the price display with VAT based on selected period and supports Livewire updates // @author baluzs // @match https://atw.hu/* // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; const VAT_RATE = 0.27; // VAT rate let debounceTimer; function updatePrices() { const selectedPeriod = document.querySelector('input[name="package_period"]:checked')?.value || 1; console.log("Selected period: " + selectedPeriod); const priceBoxes = document.querySelectorAll('.price-box'); if (priceBoxes.length === 0) { console.log('No price boxes found.'); return; } priceBoxes.forEach((priceBox) => { const priceElement = priceBox.querySelector('.text-3xl'); const detailsElement = priceBox.querySelector('div:not(.text-3xl)'); if (priceElement && detailsElement) { const originalPriceText = priceElement.textContent.trim().replace(/\s+/g, '').replace(/[^\d]/g, ''); const originalPrice = parseInt(originalPriceText, 10); if (!isNaN(originalPrice) && originalPrice > 0) { let adjustedPrice = originalPrice; if (selectedPeriod == 3) { adjustedPrice = Math.round(originalPrice * 3); } else if (selectedPeriod == 12) { adjustedPrice = Math.round(originalPrice * 12); } const priceWithVAT = Math.round(adjustedPrice * (1 + VAT_RATE)); priceElement.textContent = `${priceWithVAT} Ft`; detailsElement.textContent = `${adjustedPrice} Ft + ÁFA / ${selectedPeriod} hónap`; } } }); } function attachPeriodChangeListeners() { const radioButtons = document.querySelectorAll('input[name="package_period"]'); radioButtons.forEach((radioButton) => { radioButton.removeEventListener('change', updatePrices); radioButton.addEventListener('change', updatePrices); }); } function observeDynamicChanges() { const targetNode = document.body; const config = { childList: true, subtree: true }; const callback = (mutationsList) => { // Only proceed if the mutation involves price or period changes if (mutationsList.some((mutation) => Array.from(mutation.addedNodes).some(node => node.querySelector?.('.price-box') || node.querySelector?.('input[name="package_period"]') ) )) { if (debounceTimer) clearTimeout(debounceTimer); debounceTimer = setTimeout(() => { console.log("DOM changed, updating prices and listeners..."); attachPeriodChangeListeners(); updatePrices(); }, 500); // Adjust debounce delay as needed } }; const observer = new MutationObserver(callback); observer.observe(targetNode, config); } function livewireListener() { Livewire.on('modalUpdated', () => { console.log("Livewire modal updated"); updatePrices(); attachPeriodChangeListeners(); }); Livewire.hook('message.processed', () => { console.log("Livewire message processed"); updatePrices(); attachPeriodChangeListeners(); }); } window.addEventListener('load', () => { console.log("Page loaded"); updatePrices(); attachPeriodChangeListeners(); livewireListener(); observeDynamicChanges(); // Observe changes in DOM }); setTimeout(() => { console.log("Backup price update"); updatePrices(); attachPeriodChangeListeners(); }, 2000); })();