Я пытаюсь создать свой собственный веб-сайт, где в центре стоит начальная цитата:
"Добро пожаловать на мой сайт", а при наведении курсора на опции меню котировка должна измениться.
Например: если я наведу курсор на О, он может сказать: "Это моя страница" Обо мне ". (Пример явно упрощен).
HTML-фрагмент:
<a href = "#" class = "titleAbout">About</a>
<a href = "#" class = "titleContact">Contact</a>
<a href = "#" class = "titleHome">Home</a>
<div>
<p>
Welcome to my Website!
</p>
</div>
Фрагмент CSS:
.fade {
animation: fadein 2s;
}
@keyframes fadein {
from {
opacity:1;
}
50% {
opacity: 0;
}
to {
opacity:1;
}
}
Фрагмент JS
let myP = document.querySelector('p');
let titleWords = document.querySelector('a.titleAbout');
titleWords.addEventListener('mouseenter', function(){
myP.classList.add("fade");
setTimeout(function(){
myP.innerHTML = "This is my about Me page";
}, 1000);
setTimeout(function(){
text.classList.toggle("fade");
}, 2000);
});
titleWords = document.querySelector('a.titleContact');
titleWords.addEventListener('mouseenter', function(){
myP.classList.add("fade");
setTimeout(function(){
myP.innerHTML = "This is my Contact page";
}, 1000);
setTimeout(function(){
text.classList.toggle("fade");
}, 2000);
});
Однако - он правильно затухает только при первом наведении курсора на пункт меню, в других случаях он меняет innerHTML, но не затухает и не появляется.
Почему именно это происходит и как это исправить?
Я предполагаю, что у вас есть несколько проблем: 1. setTimeouts уродливы: сделайте первый setTimeout с css (более длинная непрозрачность 0), второй тайм-аут должен перейти в onMouseOut, чтобы удалить класс fade 2. если у вас все еще есть проблемы, вместо обновления ваших контейнеров, но удалите их и добавьте заново.
Можете ли вы предоставить демонстрационную ссылку на jsFiddle?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


вы не определили переменную text в своем javascript. Я думаю вы имеете ввиду myP.classList.toggle("fade");
let myP = document.querySelector('p');
let titleWords = document.querySelector('a.titleAbout');
titleWords.addEventListener('mouseenter', function(){
myP.classList.add("fade");
setTimeout(function(){
myP.innerHTML = "This is my about Me page";
}, 1000);
setTimeout(function(){
myP.classList.toggle("fade");
}, 2000);
});
titleWords = document.querySelector('a.titleContact');
titleWords.addEventListener('mouseenter', function(){
myP.classList.add("fade");
setTimeout(function(){
myP.innerHTML = "This is my Contact page";
}, 1000);
setTimeout(function(){
myP.classList.toggle("fade");
}, 2000);
});.fade {
animation: fadein 2s;
}
@keyframes fadein {
from {
opacity:1;
}
50% {
opacity: 0;
}
to {
opacity:1;
}
}<a href = "#" class = "titleAbout">About</a>
<a href = "#" class = "titleContact">Contact</a>
<a href = "#" class = "titleHome">Home</a>
<div>
<p>
Welcome to my Website!
</p>
</div>Можно короче и без setTimeout:
let myP = document.querySelector('p');
function show(textToShow){
myP.innerHTML = textToShow;
myP.classList.add("fade");
}
function hide(){
myP.classList.remove("fade");
}.fade {
animation: fadein 3s;
}
@keyframes fadein {
from {
opacity:1;
}
50% {
opacity: 0;
}
to {
opacity:1;
}
}<a href = "#" class = "titleAbout" onmouseenter = "show('This is my about Me page')" onmouseout = "hide()">About</a>
<a href = "#" class = "titleContact" onmouseenter = "show('This is my contact Me page')" onmouseout = "hide()">Contact</a>
<a href = "#" class = "titleHome">Home</a>
<div>
<p>
Welcome to my Website!
</p>
</div>что ты имеешь в виду?
Я реорганизовал ваш код до более общей версии, поэтому вы можете иметь столько ссылок, сколько хотите, и вам не нужно повторять свой код. Он принимает атрибут заголовка из тега в виде текста. Возможно, это больше похоже на то, что вы планировали, вы можете поиграть, раскомментировав этот тайм-аут.
const myPContainer = document.getElementById('pContainer');
const titleWords = document.querySelectorAll('a');
let i;
function attachHandlers(i, elem) {
let timeoutHandle;
const pElem = document.createElement('p');
pElem.innerHTML = elem.getAttribute('title');
myPContainer.appendChild(pElem);
elem.addEventListener('mouseenter', function(){
timeoutHandle = null;
pElem.classList.add("fadein");
});
elem.addEventListener('mouseleave', function(){
// timeoutHandle = setTimeout(() => {
pElem.classList.remove("fadein");
// }, 2000);
});
}
for (i = 0; i < titleWords.length; ++i) {
attachHandlers(i, titleWords[i]);
}#pContainer {
position: relative;
height: 20px;
}
#pContainer p {
position: absolute;
display: block;
opacity: 0;
}
.fadein {
animation: fadein 2s;
display: block;
}
@keyframes fadein {
from {
opacity: 0;
}
50% {
opacity: 1;
}
to {
opacity: 0;
}
}<a href = "#" class = "titleAbout" title = "This is my about Me page">About</a>
<a href = "#" class = "titleContact" title = "This is my Contact page">Contact</a>
<a href = "#" class = "titleHome" title = "This is my Home page">Home</a>
<div id = "pContainer"></div>
Два основных момента: 1) Приведенный мной пример упрощен, поскольку я еще не решил, какой именно должна быть новая цитата, но мне нужна возможность изменить все предложение. 2) Это по-прежнему не меняет того факта, что затухание происходит только один раз.