
 Originariamente inviata da 
KillerWorm
					
				 
				Ci sono alcuni punti che non tornano nella logica che hai usato.
Andiamo per ordine.
1 - Prima di tutto, come già ti ho indicato, va spostata la variabile 
prevTrigger fuori dalla funzione 
addHoverListenersWithDelay per definirla invece nel livello principale.
2 - Anche Le funzioni 
addclassin e 
addclassout puoi spostarle fuori dalla funzione 
addHoverListenersWithDelay, così da evitare ridondanze e spreco di risorse durante l'esecuzione stessa dello script. Infatti non serve che tali funzioni siano create localmente, e quindi definite nuovamente per ogni chiamata della funzione 
addHoverListenersWithDelay. Basta invece che siano definite una sola volta nel livello principale e magari organizzate in modo che i relativi elementi, su cui agiscono, siano passati come argomenti.
3 - Dentro la gestione dell'evento 
mouseenter vai a chiamare addclassout passando un argomento in questo modo:
	codice:
	addclassout(prevTrigger);
 
Ma nella definizione della funzione non hai previsto alcun argomento:
	codice:
	function addclassout () {...}
 
Come pensi di passare 
prevTrigger a questa funzione?
4 - In qualunque caso, anche se tu definissi opportunamente quell'argomento per ricevere quell'elemento, non vedo come lo hai utilizzato dentro la funzione. Vedi invece che vai ad agire su due elementi in particolare:
function addclassout() {
  mask.classList.add("fadeout");
  mask.classList.remove("fadein");
  maskmain.classList.remove("hovered");
  line.classList.remove("hovered");
  setTimeout(function () {
    mask.classList.remove("fadeout");
  }, 400);
}
Gli elementi 
mask e 
line sono quelli relativi al presunto 
prevTrigger che dovrebbero essere passati in modo parametrico a questa funzione; diversamente come pensi che possa funzionare?
Ciò che potresti fare è passare un oggetto che contenga questi due elementi, quindi impostare la funzione in questo modo:
	codice:
	function addclassout(el) {
  el.mask.classList.add("fadeout");
  el.mask.classList.remove("fadein");
  maskmain.classList.remove("hovered");
  el.line.classList.remove("hovered");
  setTimeout(function () {
    el.mask.classList.remove("fadeout");
  }, 400);
}
 
Ora la funzione ha un argomento. Questo è un oggetto che deve contenere le due proprietà (
mask e 
line). Sotto vediamo come definire questo oggetto per passarlo alla funzione.
5 - Direi che anche la funzione 
addclassin può essere impostata allo stesso modo:
	codice:
	function addclassin(el) {
  el.mask.classList.add("fadein");
  maskmain.classList.add("hovered");
  el.line.classList.add("hovered");
}
 
Quando chiami queste funzioni dovrai quindi passargli un oggetto che contenga quei due elementi:
	codice:
	addclassin({mask, line});
...
addclassout({mask, line});
 
6 - Dentro 
mouseenter , dopo aver eseguito il tutto, dovrai popolare la variabile 
prevTrigger in questo modo:
	codice:
	prevTrigger = {mask, line};
 
per cui potrai richiamare la funzione 
addclassout in questo modo:
	codice:
	addclassout(prevTrigger);
 
7 - Hai infatti questa condizione:
	codice:
	if (prevTrigger != trigger) {  // Se c'è un trigger precedente, applica addclassout
  addclassout(prevTrigger);
}
 
ma non è sufficiente per controllare se effettivamente ci sia un trigger precedente. Infatti 
prevTrigger inizialmente è 
null, per cui è, sì, diverso da trigger, ma ancora non esiste, quindi verrebbe generato un errore quando la funzione 
addclassout è richiamata passando quell'argomento nullo.
Dovrai quindi verificare anche se prevTrigger esiste. Puoi fare così:
	codice:
	if (prevTrigger && prevTrigger != trigger) {
  // Se c'è un trigger precedente, applica addclassout
  addclassout(prevTrigger);
}
 
---
Non voglio postare la minestra pronta ma ti invito intanto a provare ad apportare le modifiche come ho indicato.
Fai sapere e se trovi difficoltà cerchiamo di capire come procedere.