<html lang="it"><head>
<link rel="stylesheet" type="text/css" href="https://ariston.kleecks-cdn.com/static/css/vendors.css">
<link rel="stylesheet" type="text/css" href="https://www.ariston.com/static/css/main.css?v=1771322105653">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v6.4.2/css/all.css" integrity="sha384-blOohCVdhjmtROpu8+CfTnUWham9nkX7P7OZQMst+RUnhtoY/9qemFAkIKOYxDI3" crossorigin="anonymous">
<script type="text/javascript" async="" src="https://matomo-italia1.kleecks-stats.com/matomo.js"></script>
<link rel="preload" href="https://www.ariston.com/_next/static/0RcvIp7nZgmqmekMZPRcZ/pages/default.js" as="script">
<link rel="preload" href="https://www.ariston.com/_next/static/0RcvIp7nZgmqmekMZPRcZ/pages/_app.js" as="script">
<link rel="preload" href="https://www.ariston.com/_next/static/runtime/webpack-4ea8b5295b6d613200bb.js" as="script">
<link rel="preload" href="https://www.ariston.com/_next/static/chunks/commons.12566168a0b389f7d59c.js" as="script">
<link rel="preload" href="https://www.ariston.com/_next/static/runtime/main-2f6b578326f8b87de07d.js" as="script">
<style type="text/css">/*!
* fullPage 3.0.8
* https://github.com/alvarotrigo/fullPage.js
*
* @license GPLv3 for open source use only
* or Fullpage Commercial License for commercial use
* http://alvarotrigo.com/fullPage/pricing/
*
* Copyright (C) 2018 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo
*/.fp-enabled body,html.fp-enabled{margin:0;padding:0;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0)}.fp-section{position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fp-slide{float:left}.fp-slide,.fp-slidesContainer{height:100%;display:block}.fp-slides{z-index:1;height:100%;overflow:hidden;position:relative;-webkit-transition:all .3s ease-out;transition:all .3s ease-out}.fp-section.fp-table,.fp-slide.fp-table{display:table;table-layout:fixed;width:100%}.fp-tableCell{display:table-cell;vertical-align:middle;width:100%;height:100%}.fp-slidesContainer{float:left;position:relative}.fp-controlArrow{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none;position:absolute;z-index:4;top:50%;cursor:pointer;width:0;height:0;border-style:solid;margin-top:-38px;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.fp-controlArrow.fp-prev{left:15px;width:0;border-width:38.5px 34px 38.5px 0;border-color:transparent #fff transparent transparent}.fp-controlArrow.fp-next{right:15px;border-width:38.5px 0 38.5px 34px;border-color:transparent transparent transparent #fff}.fp-scrollable{position:relative}.fp-scrollable,.fp-scroller{overflow:hidden}.iScrollIndicator{border:0!important}.fp-notransition{-webkit-transition:none!important;transition:none!important}#fp-nav{position:fixed;z-index:100;margin-top:-32px;top:50%;opacity:1;-webkit-transform:translateZ(0)}#fp-nav.fp-right{right:17px}#fp-nav.fp-left{left:17px}.fp-slidesNav{position:absolute;z-index:4;opacity:1;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);left:0!important;right:0;margin:0 auto!important}.fp-slidesNav.fp-bottom{bottom:17px}.fp-slidesNav.fp-top{top:17px}#fp-nav ul,.fp-slidesNav ul{margin:0;padding:0}#fp-nav ul li,.fp-slidesNav ul li{display:block;width:14px;height:13px;margin:7px;position:relative}.fp-slidesNav ul li{display:inline-block}#fp-nav ul li a,.fp-slidesNav ul li a{display:block;position:relative;z-index:1;width:100%;height:100%;cursor:pointer;text-decoration:none}#fp-nav ul li:hover a.active span,#fp-nav ul li a.active span,.fp-slidesNav ul li:hover a.active span,.fp-slidesNav ul li a.active span{height:12px;width:12px;margin:-6px 0 0 -6px;border-radius:100%}#fp-nav ul li a span,.fp-slidesNav ul li a span{border-radius:50%;position:absolute;z-index:1;height:4px;width:4px;border:0;background:#333;left:50%;top:50%;margin:-2px 0 0 -2px;-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out;transition:all .1s ease-in-out}#fp-nav ul li:hover a span,.fp-slidesNav ul li:hover a span{width:10px;height:10px;margin:-5px 0 0 -5px}#fp-nav ul li .fp-tooltip{position:absolute;top:-2px;color:#fff;font-size:14px;font-family:arial,helvetica,sans-serif;white-space:nowrap;max-width:220px;overflow:hidden;display:block;opacity:0;width:0;cursor:pointer}#fp-nav.fp-show-active a.active+.fp-tooltip,#fp-nav ul li:hover .fp-tooltip{-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:auto;opacity:1}#fp-nav ul li .fp-tooltip.fp-right{right:20px}#fp-nav ul li .fp-tooltip.fp-left{left:20px}.fp-auto-height.fp-section,.fp-auto-height .fp-slide,.fp-auto-height .fp-tableCell,.fp-responsive .fp-auto-height-responsive.fp-section,.fp-responsive .fp-auto-height-responsive .fp-slide,.fp-responsive .fp-auto-height-responsive .fp-tableCell{height:auto!important}.fp-sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}</style><link rel="stylesheet" type="text/css" href="https://www.ariston.com/static/css/vendors.css" class="next-head"><link rel="stylesheet" type="text/css" href="https://www.ariston.com/static/css/main.css?v=1771327133328" class="next-head"><link rel="stylesheet" href="https://use.fontawesome.com/releases/v6.4.2/css/all.css" integrity="sha384-blOohCVdhjmtROpu8+CfTnUWham9nkX7P7OZQMst+RUnhtoY/9qemFAkIKOYxDI3" crossorigin="anonymous" class="next-head"><script charset="utf-8" src="https://www.ariston.com/_next/static/chunks/02ed.9ad588e651db1a7105b4.js"></script><link href="https://www.ariston.com/landing/sconto-termico/css/style42.css" media="screen" rel="stylesheet" data-react-helmet="true"><script src="https://www.ariston.com/landing/sconto-termico/js/sconto-termico9.js" data-react-helmet="true"></script></head>
<body class="locale-it-it KL-D-2 KL-LANG-it KL-P_URL_1-it-it KL-URL-sconto-termico KL-URL-LEVEL-2 KL-CMS_URL-LEVEL-2 KL-UA-DESKTOP sp-CONTENT">
<div id="__next"><div class="boxedContainer"><div><div id="contotermico">
<section class="fm-Sei-Un-Professionista has-text-centered">Sei un professionista? <a href="https://www.ariston.com/it-it/formula-plus-professionisti">Scopri i vantaggi dedicati a te</a></section>
<section class="fm hero is-halfheight is-fluid mainContent">
<div class="hero-body">
<div class="hero-content">
<p class="title"><strong>(S)CONTO TERMICO</strong> CON ARISTON RINNOVAREIL COMFORT DI CASA CONVIENE.</p>
</div>
<div class="hero-image"><img src="https://www.ariston.com/landing/sconto-termico/images/chiamaci.png" class="loaded" data-was-processed="true" alt="ariston-sostituisci-il-tuo-vecchio-impianto-con-uno-ariston-per-ottenere-massimo-comfort-e-massima-convenienza-grazie-al-servizio-s-conto-termico--1"></div>
</div>
</section>
<section class="fm-Content">
<section class="fm-Cose mainContent">
<h1>Sostituisci il tuo vecchio impianto con uno Ariston per ottenere massimo comfort e massima convenienza grazie al servizio (S)Conto Termico.</h1>
<p class="has-text-centered">Grazie all'innovativo servizio (S)Conto Termico, affidandoti ad un installatore Ariston, potrai usufruire di una consulenza su misura per rinnovare il comfort di casa beneficiando dell'Incentivo Conto Termico.</p>
<p>Il Conto Termico è un contributo economico, erogato dal Gestore dei Servizi Energetici (GSE), <strong>per incentivare interventi di riqualificazione energetica</strong>.</p>
<p><strong>L'installatore Ariston gestirà per te la pratica<sup>1</sup></strong> per l'ottenimento dell’incentivo in totale sicurezza e semplicità. E con il <strong>mandato irrevocabile all'incasso</strong>, potrai ottenere uno <strong>sconto immediato</strong>.</p>
</section>
<section class="fm-Come-Funziona box mainContent hidden">
<div class="has-text-centered">
<h2>COME FUNZIONA</h2>
<div class="container section">
<div class="content-tab">
<p>Esempio: valore fattura 1.600€ IVA inclusa per uno scaldacqua a pompa di calore Ariston</p>
<img class="is-hidden-mobile loaded" src="https://www.ariston.com/landing/sconto-termico/images/come-funziona-conto-termico.png" alt="=COME FUNZIONA" data-was-processed="true"> <img class="is-hidden-desktop is-hidden-tablet" src="https://www.ariston.com/landing/sconto-termico/images/come-funziona-conto-termico-mobile.png" alt="=COME FUNZIONA"></div>
</div>
</div>
</section>
<section class="fm-Come-Accedere has-text-centered">
<h2>CON ARISTON ACCEDERE A (S)CONTO TERMICO È PIÙ SEMPLICE!</h2>
<div class="box">
<div class="box-content">
<p class="titolo">1</p>
<p class="titolo">Consulta un professionista Ariston per individuare la soluzione giusta per te</p>
</div>
</div>
<div class="box">
<div class="box-content">
<p class="titolo">2</p>
<p class="titolo">Seleziona e acquista il prodotto Ariston adatto alle tue esigenze tra quelli incentivati:</p>
</div>
<div class="columns is-full is-mobile">
<div class="column has-text-centered">
<div><img src="https://www.ariston.com/landing/sconto-termico/images/contotermico-pompe-di-calore.png" alt="=POMPE DI CALORE" class="loading" data-was-processed="true"></div>
<p class="has-text-centered">POMPE DI CALORE</p>
</div>
<div class="column has-text-centered">
<div><img src="https://www.ariston.com/landing/sconto-termico/images/contotermico-sistemi-ibridi.png" alt="=SISTEMI IBRIDI" class="loading" data-was-processed="true"></div>
<p class="has-text-centered">SISTEMI IBRIDI</p>
</div>
<div class="column has-text-centered">
<div><img src="https://www.ariston.com/landing/sconto-termico/images/contotermico-scaldacqua.png" alt="=SCALDACQUA A POMPA DI CALORE" class="loading" data-was-processed="true"></div>
<p class="has-text-centered">SCALDACQUA A POMPA DI CALORE</p>
</div>
<div class="column has-text-centered">
<div><img src="https://www.ariston.com/landing/sconto-termico/images/contotermico-climatizzatori.png" alt="=CLIMATIZZATORI" class="loading" data-was-processed="true"></div>
<p class="has-text-centered">CLIMATIZZATORI</p>
</div>
<div class="column has-text-centered">
<div><img src="https://www.ariston.com/landing/sconto-termico/images/contotermico-pannelli-solari.png" alt="=PANNELLI SOLARI" class="loading" data-was-processed="true"></div>
<p class="has-text-centered">PANNELLI SOLARI</p>
</div>
</div>
</div>
<div class="box">
<div class="box-content">
<p class="titolo">3</p>
<p class="titolo">Grazie a (S)Conto Termico ottieni uno sconto immediato<sup>3</sup> fino al 65%</p>
</div>
</div>
<div class="box box-inverted">
<div class="box-content">
<p class="titolo"><img src="https://www.ariston.com/landing/sconto-termico/images/icon-plus.png" width="24" height="24" class="loading" data-was-processed="true" alt="ariston-sostituisci-il-tuo-vecchio-impianto-con-uno-ariston-per-ottenere-massimo-comfort-e-massima-convenienza-grazie-al-servizio-s-conto-termico--2"></p>
<p class="titolo">In aggiunta per te la possibilità di accedere ad un finanziamento su misura con Fiditalia per l’acquisto di un prodotto Ariston.</p>
</div>
</div>
</section>
</section>
<section class="talkwithariston ">
<h3 class="is-darkGrey">CONTATTA ARISTON</h3>
<div class="talkwithariston-container">
<div class="talkwithariston-column"><span class="is-not-uppercase title-xl aristonRed">Chiama i nostri operatori</span>
<p>Dal Lunedì alla Domenica dalle 08.00 alle 20.00 (esclusi i giorni di festività) al seguente numero di telefono verde:</p>
<a class="gtm-callcenter-cta link-button numero-verde" title="800 220 055" href="tel:800 220 055" target="" rel="noopener" type="button"><img src="https://www.ariston.com/landing/sconto-termico/images/icon-telefono.png" class="loaded" data-was-processed="true" alt="ariston-sostituisci-il-tuo-vecchio-impianto-con-uno-ariston-per-ottenere-massimo-comfort-e-massima-convenienza-grazie-al-servizio-s-conto-termico--3"> 800 220 055</a></div>
</div>
</section>
<section class="fm-Cose appendice">
<p class="smaller">1 - Il servizio è a pagamento e varia in base al prodotto installato. Per maggiori informazioni consulta l'installatore Ariston.</p>
<p class="smaller">2 - Messaggio pubblicitario con finalità promozionale. Per le condizioni contrattuali si veda il documento “IEBCC” presso i Punti vendita aderenti all'iniziativa. Ariston SpA opera quale intermediario del credito in regime di non esclusiva con Fiditalia. La valutazione del merito creditizio è soggetta all'approvazione di Fiditalia SpA.</p>
<p class="smaller">3 - In caso di mandato irrevocabile all’incasso. Senza mandato irrevocabile all’incasso, paghi immediatamente l’intero importo e ricevi un rimborso dal GSE in 90 giorni.</p>
</section>
</div></div></div></div>
<script async="" id="__NEXT_PAGE__/default" src="https://www.ariston.com/_next/static/0RcvIp7nZgmqmekMZPRcZ/pages/default.js"></script>
<script async="" id="__NEXT_PAGE__/_app" src="https://www.ariston.com/_next/static/0RcvIp7nZgmqmekMZPRcZ/pages/_app.js"></script>
<script src="https://www.ariston.com/_next/static/runtime/webpack-4ea8b5295b6d613200bb.js" async=""></script>
<script src="https://www.ariston.com/_next/static/chunks/commons.12566168a0b389f7d59c.js" async=""></script>
<script src="https://www.ariston.com/_next/static/runtime/main-2f6b578326f8b87de07d.js" async=""></script>
<script>// Generic Alt Text Setter Script
// Sets alt text for any remaining images/SVGs without alt text using ariston-*h1*-*number* pattern
(function() {
'use strict';
let consecutiveResults = [];
let intervalId;
let observerActive = false;
let imageCounter = 1;
// Configuration
const CONFIG = {
checkInterval: 1000, // Check every second
requiredConsecutiveResults: 5, // Stop after 5 consecutive same results
debug: false // Set to false to disable console logging
};
// Logging function
function log(message, type = 'info') {
if (!CONFIG.debug) return;
const timestamp = new Date().toLocaleTimeString();
const prefix = `[${timestamp}] Generic Alt Setter:`;
switch(type) {
case 'error':
console.error(prefix, message);
break;
case 'warn':
console.warn(prefix, message);
break;
case 'success':
console.log(`%c${prefix} ${message}`, 'color: blue; font-weight: bold;');
break;
default:
console.log(prefix, message);
}
}
// Get the main heading text from the page
function getMainHeading() {
// Try to find h1 first, then h2, then h3
const h1 = document.querySelector('h1');
if (h1 && h1.textContent.trim()) {
return h1.textContent.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
const h2 = document.querySelector('h2');
if (h2 && h2.textContent.trim()) {
return h2.textContent.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
const h3 = document.querySelector('h3');
if (h3 && h3.textContent.trim()) {
return h3.textContent.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
// Fallback to page title or generic
const title = document.title;
if (title && title.trim()) {
return title.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-');
}
return 'page';
}
// Generate alt text using the ariston-*h1*-*number* pattern
function generateAltText(element, index) {
const heading = getMainHeading();
const elementType = element.tagName.toLowerCase();
// Create the pattern: ariston-[heading]-[number]
return `ariston-${heading}-${imageCounter++}`;
}
// Check if element already has alt text or aria-label
function hasAltText(element) {
const alt = element.getAttribute('alt');
const ariaLabel = element.getAttribute('aria-label');
return (alt && alt.trim() !== '') || (ariaLabel && ariaLabel.trim() !== '');
}
// Check if element should be excluded (decorative, hidden, etc.)
function shouldExclude(element) {
// Skip hidden elements
const style = window.getComputedStyle(element);
if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') {
return true;
}
// Skip elements with aria-hidden="true"
if (element.getAttribute('aria-hidden') === 'true') {
return true;
}
// Skip elements with role="presentation" or role="none"
const role = element.getAttribute('role');
if (role === 'presentation' || role === 'none') {
return true;
}
// Skip very small images (likely decorative)
if (element.tagName.toLowerCase() === 'img') {
const width = element.naturalWidth || element.width || 0;
const height = element.naturalHeight || element.height || 0;
if (width <= 1 || height <= 1) {
return true;
}
}
return false;
}
// Process individual image or SVG
function processElement(element, index) {
let altTextSet = false;
let reason = '';
try {
// Skip if element already has alt text
if (hasAltText(element)) {
return { processed: false, reason: 'Already has alt text or aria-label', altText: element.getAttribute('alt') || element.getAttribute('aria-label') };
}
// Skip if element should be excluded
if (shouldExclude(element)) {
return { processed: false, reason: 'Excluded (decorative, hidden, or too small)' };
}
// Generate and set alt text
const altText = generateAltText(element, index);
if (element.tagName.toLowerCase() === 'svg') {
// For SVG, prefer aria-label over alt
element.setAttribute('aria-label', altText);
} else {
// For IMG, use alt attribute
element.setAttribute('alt', altText);
}
altTextSet = true;
reason = `Generated alt text using ariston pattern`;
log(`${element.tagName} ${index + 1}: Set ${element.tagName.toLowerCase() === 'svg' ? 'aria-label' : 'alt'}="${altText}" - ${reason}`, 'success');
} catch (error) {
log(`Error processing ${element.tagName.toLowerCase()} ${index + 1}: ${error.message}`, 'error');
reason = `error: ${error.message}`;
}
return {
processed: altTextSet,
reason: reason,
altText: altTextSet ? (element.getAttribute('alt') || element.getAttribute('aria-label')) : null
};
}
// Main function to process all images and SVGs
function processAllElements() {
const elements = document.querySelectorAll('img, svg');
let processedCount = 0;
let candidateElements = 0; // Elements that need alt text
let totalElements = elements.length;
log(`Found ${totalElements} images and SVGs on page`);
if (totalElements === 0) {
return { processed: 0, candidates: 0 };
}
elements.forEach((element, index) => {
// Check if element needs alt text
const needsAltText = !hasAltText(element) && !shouldExclude(element);
if (needsAltText) {
candidateElements++;
const result = processElement(element, index);
if (result.processed) {
processedCount++;
}
if (CONFIG.debug && !result.processed) {
log(`${element.tagName} ${index + 1}: Not processed - ${result.reason}`);
}
}
});
log(`Processed ${processedCount} out of ${candidateElements} candidate elements (${totalElements} total elements)`);
return { processed: processedCount, candidates: candidateElements };
}
// Check if we should stop based on consecutive results
function shouldStop(result) {
const currentCandidates = result.candidates;
const currentProcessed = result.processed;
consecutiveResults.push(currentCandidates);
// Keep only the last 'requiredConsecutiveResults' results
if (consecutiveResults.length > CONFIG.requiredConsecutiveResults) {
consecutiveResults.shift();
}
// Check if we have enough consecutive results
if (consecutiveResults.length === CONFIG.requiredConsecutiveResults) {
const firstResult = consecutiveResults[0];
const allSame = consecutiveResults.every(result => result === firstResult);
// Stop if we have consistent results and no new processing
if (allSame && currentProcessed === 0) {
if (firstResult === 0) {
log(`Stopping: No candidate elements found for ${CONFIG.requiredConsecutiveResults} consecutive checks`, 'success');
} else {
log(`Stopping: Found ${firstResult} candidate elements with 0 new processed for ${CONFIG.requiredConsecutiveResults} consecutive checks`, 'success');
}
return true;
}
}
return false;
}
// Main checking function
function runCheck() {
log('Running generic alt text check...');
const result = processAllElements();
log(`Check result: ${result.processed} elements processed, ${result.candidates} candidates found`);
if (shouldStop(result)) {
stopMonitoring();
log('Generic monitoring stopped - consistent results achieved', 'success');
}
}
// Start monitoring function
function startMonitoring() {
if (intervalId) {
log('Generic monitoring already active');
return;
}
log('Starting generic alt text monitoring...', 'success');
log(`Configuration: Check every ${CONFIG.checkInterval}ms, stop after ${CONFIG.requiredConsecutiveResults} consecutive same results`);
// Reset state
consecutiveResults = [];
imageCounter = 1; // Reset counter
// Run initial check
runCheck();
// Set up interval for continuous checking
intervalId = setInterval(runCheck, CONFIG.checkInterval);
// Set up MutationObserver to detect DOM changes
if (!observerActive && window.MutationObserver) {
const observer = new MutationObserver((mutations) => {
let hasElementChanges = false;
mutations.forEach((mutation) => {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === Node.ELEMENT_NODE) {
if (node.tagName === 'IMG' || node.tagName === 'SVG' || node.querySelector('img, svg')) {
hasElementChanges = true;
}
}
});
}
});
if (hasElementChanges) {
log('DOM changes detected with new images/SVGs');
// Reset consecutive results when DOM changes
consecutiveResults = [];
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
observerActive = true;
log('MutationObserver activated for generic alt text');
}
}
// Stop monitoring function
function stopMonitoring() {
if (intervalId) {
clearInterval(intervalId);
intervalId = null;
log('Generic monitoring stopped', 'success');
}
}
// Expose control functions to global scope for manual control
window.genericAltTextSetter = {
start: startMonitoring,
stop: stopMonitoring,
runOnce: () => processAllElements(),
getStatus: () => ({
active: !!intervalId,
consecutiveResults: [...consecutiveResults],
currentCounter: imageCounter,
config: { ...CONFIG }
}),
setCounter: (newCounter) => {
imageCounter = newCounter;
log(`Counter reset to ${newCounter}`);
}
};
// Auto-start when DOM is ready (with a slight delay to let specific script run first)
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => {
setTimeout(startMonitoring, 2000); // Wait 2 seconds after DOM ready
});
} else {
// DOM is already ready
setTimeout(startMonitoring, 2000); // Wait 2 seconds
}
log('Generic Alt Text Setter script loaded successfully', 'success');
log('Use window.genericAltTextSetter.start(), .stop(), .runOnce(), .setCounter(n), or .getStatus() for manual control');
})();</script>
<script>// Image Alt Text Auto-Setter Script
// Continuously monitors and sets alt text for images based on specific parent conditions
(function() {
'use strict';
let consecutiveResults = [];
let intervalId;
let observerActive = false;
// Configuration
const CONFIG = {
checkInterval: 1000, // Check every second
requiredConsecutiveResults: 5, // Stop after 5 consecutive same results
debug: false // Set to false to disable console logging
};
// Logging function
function log(message, type = 'info') {
if (!CONFIG.debug) return;
const timestamp = new Date().toLocaleTimeString();
const prefix = `[${timestamp}] Alt Text Setter:`;
switch(type) {
case 'error':
console.error(prefix, message);
break;
case 'warn':
console.warn(prefix, message);
break;
case 'success':
console.log(`%c${prefix} ${message}`, 'color: green; font-weight: bold;');
break;
default:
console.log(prefix, message);
}
}
// Check if element has specific class
function hasClass(element, className) {
return element && element.classList && element.classList.contains(className);
}
// Get ancestor element by tag name
function getAncestorByTag(element, tagName, maxLevels = 10) {
let current = element.parentElement;
let level = 0;
while (current && level < maxLevels) {
if (current.tagName && current.tagName.toLowerCase() === tagName.toLowerCase()) {
return current;
}
current = current.parentElement;
level++;
}
return null;
}
// Get parent with specific class
function getParentWithClass(element, className, maxLevels = 10) {
let current = element.parentElement;
let level = 0;
while (current && level < maxLevels) {
if (hasClass(current, className)) {
return current;
}
current = current.parentElement;
level++;
}
return null;
}
// Get second parent (grandparent)
function getSecondParent(element) {
return element.parentElement && element.parentElement.parentElement;
}
// Process individual image
function processImage(img, index) {
let altTextSet = false;
let reason = '';
// Skip if image already has alt text
if (img.getAttribute('alt') && img.getAttribute('alt').trim() !== '') {
return { processed: false, reason: 'Already has alt text', altText: img.getAttribute('alt') };
}
try {
// Case 1: Image has class "trigger-banner-image"
if (hasClass(img, 'trigger-banner-image')) {
img.setAttribute('alt', 'background-banner-image');
altTextSet = true;
reason = 'trigger-banner-image class detected';
log(`Image ${index + 1}: Set alt="background-banner-image" - ${reason}`, 'success');
}
// Case 2: Image has parent with class "mega-menu__col"
else if (getParentWithClass(img, 'mega-menu__col')) {
img.setAttribute('alt', 'menu-background-image');
altTextSet = true;
reason = 'parent with mega-menu__col class detected';
log(`Image ${index + 1}: Set alt="menu-background-image" - ${reason}`, 'success');
}
// Case 3: Image has anchor as second parent
else {
const secondParent = getSecondParent(img);
if (secondParent && secondParent.tagName && secondParent.tagName.toLowerCase() === 'a') {
const titleAttr = secondParent.getAttribute('title');
if (titleAttr && titleAttr.trim() !== '') {
img.setAttribute('alt', titleAttr.trim());
altTextSet = true;
reason = `anchor second parent with title="${titleAttr}"`;
log(`Image ${index + 1}: Set alt="${titleAttr}" - ${reason}`, 'success');
} else {
reason = 'anchor second parent found but no title attribute';
log(`Image ${index + 1}: ${reason}`, 'warn');
}
} else {
reason = 'no matching conditions found';
}
}
} catch (error) {
log(`Error processing image ${index + 1}: ${error.message}`, 'error');
reason = `error: ${error.message}`;
}
return {
processed: altTextSet,
reason: reason,
altText: altTextSet ? img.getAttribute('alt') : null
};
}
// Main function to process all images
function processAllImages() {
const images = document.querySelectorAll('img');
let processedCount = 0;
let candidateImages = 0; // Images that match our criteria
let totalImages = images.length;
log(`Found ${totalImages} images on page`);
if (totalImages === 0) {
return { processed: 0, candidates: 0 };
}
images.forEach((img, index) => {
// Check if image matches any of our criteria first
const matchesCriteria = hasClass(img, 'trigger-banner-image') ||
getParentWithClass(img, 'mega-menu__col') ||
(getSecondParent(img) && getSecondParent(img).tagName && getSecondParent(img).tagName.toLowerCase() === 'a');
if (matchesCriteria) {
candidateImages++;
const result = processImage(img, index);
if (result.processed) {
processedCount++;
}
if (CONFIG.debug && !result.processed && result.reason !== 'Already has alt text') {
log(`Image ${index + 1}: Not processed - ${result.reason}`);
}
}
});
log(`Processed ${processedCount} out of ${candidateImages} candidate images (${totalImages} total images)`);
return { processed: processedCount, candidates: candidateImages };
}
// Check if we should stop based on consecutive results
function shouldStop(result) {
const currentCandidates = result.candidates;
const currentProcessed = result.processed;
consecutiveResults.push(currentCandidates);
// Keep only the last 'requiredConsecutiveResults' results
if (consecutiveResults.length > CONFIG.requiredConsecutiveResults) {
consecutiveResults.shift();
}
// Check if we have enough consecutive results and they're all the same non-zero value
if (consecutiveResults.length === CONFIG.requiredConsecutiveResults) {
const firstResult = consecutiveResults[0];
const allSame = consecutiveResults.every(result => result === firstResult);
const isNonZero = firstResult > 0;
if (allSame && isNonZero && currentProcessed === 0) {
log(`Stopping: Found ${firstResult} candidate images with 0 new processed for ${CONFIG.requiredConsecutiveResults} consecutive checks`, 'success');
return true;
}
}
return false;
}
// Main checking function
function runCheck() {
log('Running image alt text check...');
const result = processAllImages();
log(`Check result: ${result.processed} images processed, ${result.candidates} candidates found`);
if (shouldStop(result)) {
stopMonitoring();
log('Monitoring stopped - consistent results achieved', 'success');
}
}
// Start monitoring function
function startMonitoring() {
if (intervalId) {
log('Monitoring already active');
return;
}
log('Starting image alt text monitoring...', 'success');
log(`Configuration: Check every ${CONFIG.checkInterval}ms, stop after ${CONFIG.requiredConsecutiveResults} consecutive same results`);
// Reset state
consecutiveResults = [];
// Run initial check
runCheck();
// Set up interval for continuous checking
intervalId = setInterval(runCheck, CONFIG.checkInterval);
// Set up MutationObserver to detect DOM changes
if (!observerActive && window.MutationObserver) {
const observer = new MutationObserver((mutations) => {
let hasImageChanges = false;
mutations.forEach((mutation) => {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach((node) => {
if (node.nodeType === Node.ELEMENT_NODE) {
if (node.tagName === 'IMG' || node.querySelector('img')) {
hasImageChanges = true;
}
}
});
}
});
if (hasImageChanges) {
log('DOM changes detected with new images');
// Reset consecutive results when DOM changes
consecutiveResults = [];
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
observerActive = true;
log('MutationObserver activated');
}
}
// Stop monitoring function
function stopMonitoring() {
if (intervalId) {
clearInterval(intervalId);
intervalId = null;
log('Monitoring stopped', 'success');
}
}
// Expose control functions to global scope for manual control
window.imageAltTextSetter = {
start: startMonitoring,
stop: stopMonitoring,
runOnce: () => processAllImages(),
getStatus: () => ({
active: !!intervalId,
consecutiveResults: [...consecutiveResults],
config: { ...CONFIG }
})
};
// Auto-start when DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', startMonitoring);
} else {
// DOM is already ready
startMonitoring();
}
log('Image Alt Text Setter script loaded successfully', 'success');
log('Use window.imageAltTextSetter.start(), .stop(), .runOnce(), or .getStatus() for manual control');
})();</script>
<script type="text/javascript">
var _paq = window._paq = window._paq || [];
// tracker methods like "setCustomDimension" should be called before "trackPageView"
_paq.push(["trackPageView"]);
_paq.push(["enableLinkTracking"]);
(function () {
var u = "https://matomo-italia1.kleecks-stats.com/";
_paq.push(["setTrackerUrl", u + "matomo.php"]);
_paq.push(["setSiteId", "www-ariston-com"]);
var d = document, g = d.createElement("script"), s = d.getElementsByTagName("script")[0];
g.type = "text/javascript"; g.async = true; g.src = u + "matomo.js"; s.parentNode.insertBefore(g, s);
})();
</script>
<noscript>
<p><img src="https://matomo-italia1.kleecks-stats.com/matomo.php?idsite=www-ariston-com&rec=1" style="border:0;" alt=""></p>
</noscript>
<div class="ReactModalPortal"></div><div class="ReactModalPortal"></div><div class="ReactModalPortal"></div><div class="ReactModalPortal"></div><style>.hero-body, .section {padding: 0;}.footer{padding:0;}#contotermico{top:0;}.pre-footer-overlay span{font-size:16px;}a.announcement-banner-link:hover{color: inherit;font-weight: 600;}</style></body></html>