
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.