<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="" charset="utf-8" src="https://static.revechat.com/widget/scripts/new-livechat.js?1771327858327"></script><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=1771327858096" 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 rel="canonical" href="https://www.ariston.com/it-it/formula-plus/" class="next-head"><link href="https://www.ariston.com/landing/formula-plus/styles/style4.css" media="screen" rel="stylesheet" data-react-helmet="true"><script src="https://www.ariston.com/landing/formula-plus/scripts/scripts.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-formula-plus KL-URL-LEVEL-2 KL-CMS_URL-LEVEL-2 KL-UA-DESKTOP sp-CONTENT">
<div id="__next"><div class="boxedContainer"><div><div id="lp202424">
<div id="formulamutuo">
<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">
<div class="hero-body" style="padding: 40px">
<div class="hero-content">
<p class="title">
Da oggi il risparmio ha una <strong>nuova Formula</strong>
</p>
<p class="subtitle">
Scopri <strong>Ariston Formula Plus</strong>, l'alternativa
allo sconto in fattura che ti garantisce altissima efficienza e massimo comfort.
</p>
</div>
<div class="hero-image">
<img src=" https://www.ariston.com/landing/formula-plus/images/chiamaci.png" class="loaded" data-was-processed="true" alt="ariston-formula-plus-l-alternativa-di-ariston-allo-sconto-in-fattura-1">
</div>
</div>
</section>
<section class="fm-Content">
<section class="fm-Cose">
<h1><span>FORMULA PLUS</span> è l'alternativa di Ariston allo sconto in fattura</h1>
<p class="has-text-centered">Con <strong>Formula Plus</strong> puoi usufruire di tutti i vantaggi degli <strong>incentivi statali</strong> - dall'<strong>Ecobonus</strong> al <strong>Conto Termico</strong> - per ottenere il massimo comfort a condizioni imperdibili!</p>
<p class="has-text-centered">Ti supportiamo a partire dalla scelta del prodotto più adatto alle tue esigenze fino a occuparci delle pratiche burocratiche per consentirti di ottenere gli incentivi statali. E non solo! Grazie al nostro <strong>partner Fiditalia</strong> potrai richiedere un <strong>finanziamento su misura</strong> per rendere la tua casa ancora più sostenibile.</p>
</section>
<section class="fm-Come-Funziona box">
<div class="has-text-centered">
<h2>COME FUNZIONA FORMULA PLUS</h2>
<div class="container tabs is-fullwidth">
<ul>
<li class="tab is-active" onclick="openTab(event,'contotermico')"><a>Conto Termico</a></li>
<li class="tab" onclick="openTab(event,'ecobonus')"><a>ECOBONUS 65%</a></li>
</ul>
</div>
<div class="container section">
<div id="contotermico" class="content-tab">
<p>Con <b>Formula Plus</b>, per un intervento di incremento dell'efficienza energetica con un prodotto Ariston, è possibile usufruire dell'incentivo Conto Termico in massima semplicità e sicurezza per recuperare fino al 65% della spesa sostenuta. In più, grazie al <strong>mandato irrevocabile all'incasso</strong> puoi ottenere uno sconto immediato fino al 65%.</p>
<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/formula-plus/images/come-funziona-formula-plus.png" alt="=COME FUNZIONA FORMULA PLUS" data-was-processed="true">
<img class="is-hidden-desktop is-hidden-tablet" src="https://www.ariston.com/landing/formula-plus/images/come-funziona-formula-plus-mobile.png" width="334" height="753" alt="=COME FUNZIONA FORMULA PLUS">
<p class="smaller">1 - 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>
<a class="cta" href="https://www.ariston.com/it-it/sconto-termico" target="_self" rel="noopener">SCOPRI DI PIÙ</a>
</div>
<div id="ecobonus" class="content-tab" style="display:none">
<p>Con <strong>Formula Plus</strong>, per un intervento di riqualificazione energetica con un prodotto Ariston che accede all'Ecobonus, <strong>recuperi il 65% del valore della fattura</strong> grazie alla detrazione fiscale e puoi decidere di <strong>accedere a un finanziamento personalizzato</strong>.</p>
<p>Esempio: valore fattura 4.000€ IVA inclusa</p>
<img class="is-hidden-mobile" src="https://www.ariston.com/landing/formula-plus/images/come-funziona-formula-plus-2.png" alt="=COME FUNZIONA FORMULA PLUS">
<img class="is-hidden-desktop is-hidden-tablet" src="https://www.ariston.com/landing/formula-plus/images/come-funziona-formula-plus-mobile-2.png" width="241" height="636" alt="=COME FUNZIONA FORMULA PLUS">
</div>
</div>
<p>Per te, sempre la massima <strong>flessibilità</strong> con piani personalizzabili: la partnership con Fiditalia garantisce finanziamenti su misura, sia dal punto di vista degli importi, sia della tipologia e della durata.</p>
<p class="mt-3"><strong>E i vantaggi non finiscono qui!</strong> Con Formula Plus ricevi anche il set documentale necessario per ottenere gli incentivi statali e il finanziamento con Fiditalia. Il tutto, verificato da <strong>un team di consulenti qualificati</strong>.</p>
<h3><span>FORMULA PLUS</span>: UN SERVIZIO SENZA PENSIERI</h3>
</div>
</section>
<section class="fm-Come-Accedere has-text-centered">
<h2>COME ACCEDERE A FORMULA PLUS</h2>
<div class="box">
<p class="titolo"><span>1</span> Troviamo insieme la soluzione adatta a te, scegliendo tra i nostri
prodotti:</p>
<div class="columns is-full is-mobile">
<div class="column has-text-centered">
<div><img src="https://www.ariston.com/landing/formula-plus/images/condizionatori.png" alt="=CONDIZIONATORI"></div>
<p class="has-text-centered">CONDIZIONATORI</p>
</div>
<div class="column has-text-centered">
<div><img src="https://www.ariston.com/landing/formula-plus/images/pompe-di-calore-e-sistemi-ibridi.png" alt="=POMPE DI CALORE E SISTEMI IBRIDI"></div>
<p class="has-text-centered">POMPE DI CALORE E SISTEMI IBRIDI</p>
</div>
<div class="column has-text-centered">
<div><img src="https://www.ariston.com/landing/formula-plus/images/scaldacqua-a-pompa-di-calore.png" alt="=SCALDACQUA A POMPA DI CALORE"></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/formula-plus/images/solare-termico.png" alt="=SOLARE TERMICO"></div>
<p class="has-text-centered">SOLARE TERMICO</p>
</div>
</div>
</div>
<div class="box">
<p class="titolo"><span>2</span> Un professionista Ariston installa il prodotto prescelto.</p>
</div>
<div class="box">
<p class="titolo"><span>3</span> Noi ci occupiamo della burocrazia, tu ottieni condizioni paragonabili allo sconto in fattura.</p>
</div>
</section>
<section class="fm-Prodotti">
<div class="columns is-full columns-reverse">
<div class="column is-half"><img src="https://www.ariston.com/landing/formula-plus/images/condizionatori.jpg" alt="=CONDIZIONATORI"></div>
<div class="column is-half fm-Prodotto">
<h3>CONDIZIONATORI</h3>
<ul>
<li>Pacchetto chiavi in mano</li>
<li>Gas refrigerante R32</li>
<li>Classe energetica fino ad A+++</li>
<li>Tecnologia 2D INVERTER</li>
<li>Compatibile con Kit Wi-Fi</li>
<li>Funzione Auto-Pulente</li>
</ul>
<p>Configura subito la tua caldaia a condensazione e organizza un sopralluogo gratuito.</p>
<a href="https://www.configuratore.ariston.com/configurator/answers.html?questionId=1.1" target="_self" rel="noopener">Vai al configuratore</a>
</div>
</div>
</section>
<h1>CERCHI SOLUZIONI ALTERNATIVE?</h1>
<section class="fm-Prodotti">
<div class="columns is-full">
<div class="column is-half"><img src="https://www.ariston.com/landing/formula-plus/images/pompe-di-calore-e-sistemi-ibridi.jpg" alt="=POMPE DI CALORE E SISTEMI IBRIDI"></div>
<div class="column is-half fm-Prodotto">
<h3>POMPE DI CALORE E SISTEMI IBRIDI</h3>
<ul>
<li>Installazione sicura da parte di un tecnico esperto Ariston</li>
<li>Gas ecologico R32</li>
<li>Classe energetica A+</li>
<li>Semplicità di installazione con i kit accessori</li>
<li>Wi-Fi integrato per controllo a distanza e vocale</li>
<li>Bassa rumorosità</li>
</ul>
<a href="https://www.ariston.com/it-it/prodotti/pompe-di-calore" target="_self" rel="noopener">SCOPRI DI PIÙ</a>
</div>
</div>
<div class="columns is-full columns-reverse">
<div class="column is-half"><img src="https://www.ariston.com/landing/formula-plus/images/scaldacqua-a-pompa-di-calore.jpg" alt="=SCALDACQUA A POMPA DI CALORE"></div>
<div class="column is-half fm-Prodotto">
<h3>SCALDACQUA A POMPA DI CALORE</h3>
<ul>
<li>Installazione sicura da parte di un tecnico esperto Ariston</li>
<li>Classe energetica fino ad A+</li>
<li>Soluzione compatta e facile da installare</li>
<li>Bassa rumorosità</li>
</ul>
<a href="https://www.ariston.com/it-it/prodotti/scaldacqua/pompa-di-calore" target="_self" rel="noopener">SCOPRI DI PIÙ</a>
</div>
</div>
<div class="columns is-full">
<div class="column is-half"><img src="https://www.ariston.com/landing/formula-plus/images/solare-termico.jpg" alt="=SOLARE TERMICO"></div>
<div class="column is-half fm-Prodotto">
<h3>SOLARE TERMICO</h3>
<ul>
<li>Installazione sicura da parte di un tecnico esperto Ariston</li>
<li>Performance elevate per garantire la temperatura ideale dell'acqua calda</li>
<li>Soluzione compatta e facile da installare</li>
<li>Elevata resistenza alle infiltrazioni</li>
</ul>
<a href="https://www.ariston.com/it-it/prodotti/solare-termico/circolazione-naturale" target="_self" rel="noopener">SCOPRI DI PIÙ</a>
</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à)<br> al seguente numero di telefono verde:</p>
<a title="800 220 055" type="button" class="gtm-callcenter-cta link-button numero-verde" target="" href="tel:800 220 055" rel="noopener"><img src="https://www.ariston.com/landing/formula-plus/images/icon-telefono.png" alt="ariston-formula-plus-l-alternativa-di-ariston-allo-sconto-in-fattura-2"> 800 220 055</a>
</div>
</div>
</section>
</div>
</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>
<script defer="" src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon="{"version":"2024.11.0","token":"88aee7e3881c4bdbb754a69fe7cf203e","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}" crossorigin="anonymous"></script>
<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;}#formulamutuo{top:0;}.pre-footer-overlay span{font-size:16px;}a.announcement-banner-link:hover{color: inherit;font-weight: 600;}</style></body></html>