Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.04.2025, 16:46
osv osv вне форума
Новичок на форуме
Отправить личное сообщение для osv Посмотреть профиль Найти все сообщения от osv
 
Регистрация: 25.07.2009
Сообщений: 8

Создание появляющегося на несколько секунд сообщения
Доброго времени суток!
Пытаюсь создать появляющийся на несколько секунд блок с текстом, со следующими правилами:
На странице будет несколько кнопок, по клику на которые будет создаваться сообщение с тем или иным текстом и CSS классом.
При последующем клике на туже кнопку, сообщение должно продлить показ.
При клике на другую кнопку, сообщение поменяет текст и CSS класс, а так же продлит показ.
Написал такой код:

.EventMessageError {
	background-color: #f43587;
	color: #FFFFFF;
}
.EventMessageNormal {
	background-color: #40bb39;
	color: #FFFFFF;	
}



<button onclick="EventMessage('Текст обычного сообщения', 'EventMessageNormal')"></button>
<button onclick="EventMessage('Текст сообщения об ошибке', 'EventMessageError')"></button>



function EventMessage(MessageText, MessageType) {
	
	function MessageBlockCreate() {
		let NewMessageBlock = `<div class="${MessageType}" id="EventMessage">${MessageText}</div>`;
		let NewMessageBlockPosition = document.querySelector('body');
		NewMessageBlockPosition.insertAdjacentHTML('afterbegin', NewMessageBlock);
		//console.log('Block crested');
	}
	function MessageBlockDestroy(Delay) {
		let MessageBlockDestroyTimer = window.setTimeout(() => {
			document.body.removeChild(document.getElementById('EventMessage'));
			//console.log('Block destroyed');
		}, Delay);
	}
	if (document.getElementById('EventMessage')) {
		document.body.removeChild(document.getElementById('EventMessage'));
	} else {
		MessageBlockDestroy(2500);
	}
	MessageBlockCreate();
}


Все работает так, как предполагалось, за исключением времени показа сообщения, оно равно времени установленному в setTimeout, на все последующие вызовы функции. Понимаю, что нужно сбросить setTimeout, но не понимаю как.

Последний раз редактировалось osv, 06.04.2025 в 17:05.
Ответить с цитированием
  #2 (permalink)  
Старый 06.04.2025, 17:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,144

всплывающее сообщение
osv,
<!DOCTYPE HTML>
<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .EventMessageError {
            background-color: #f43587;
            color: #FFFFFF;
        }

        .EventMessageNormal {
            background-color: #40bb39;
            color: #FFFFFF;
        }
    </style>
    <script>
        let MessageBlockDestroyTimer;

        function EventMessage(MessageText, MessageType, Delay) {
            function MessageBlockRemove() {
                let block = document.getElementById('EventMessage');
                if (block) block.remove();
            }

            function MessageBlockCreate() {
                MessageBlockRemove();
                let NewMessageBlock = `<div class="${MessageType}" id="EventMessage">${MessageText}</div>`;
                let NewMessageBlockPosition = document.querySelector('body');
                NewMessageBlockPosition.insertAdjacentHTML('afterbegin', NewMessageBlock);
                //console.log('Block crested');
            }


            function MessageBlockDestroy(Delay) {
                window.clearTimeout(MessageBlockDestroyTimer);
                MessageBlockDestroyTimer = window.setTimeout(MessageBlockRemove, Delay);
            }

            if (!document.querySelector(`.${MessageType}`)) MessageBlockCreate();
            else document.querySelector(`.${MessageType}`).textContent = MessageText;
            MessageBlockDestroy(Delay);
        }
    </script>
</head>

<body>
    <button onclick="EventMessage('Текст обычного сообщения 1', 'EventMessageNormal', 3000)">Normal 1</button>
    <button onclick="EventMessage('Текст обычного сообщения 2', 'EventMessageNormal', 3000)">Normal 2</button>
    <button onclick="EventMessage('Текст сообщения об ошибке', 'EventMessageError', 5000)">Error</button>
</body>

</html>

Последний раз редактировалось рони, 06.04.2025 в 19:11.
Ответить с цитированием
  #3 (permalink)  
Старый 06.04.2025, 18:33
osv osv вне форума
Новичок на форуме
Отправить личное сообщение для osv Посмотреть профиль Найти все сообщения от osv
 
Регистрация: 25.07.2009
Сообщений: 8

Цитата:
!document.querySelector(`.${MessageType}`) && MessageBlockCreate();
Здесь есть нюанс. Если будет несколько сообщений с одним классом CSS, то создание блока не состоится.
К примеру так:
<button onclick="EventMessage('Текст обычного сообщения 1', 'EventMessageNormal', 3000)">Normal 1</button>
<button onclick="EventMessage('Текст обычного сообщения 2', 'EventMessageNormal', 3000)">Normal 2</button>
<button onclick="EventMessage('Текст сообщения об ошибке', 'EventMessageError', 5000)">Error</button>

При нажатии кнопки Normal 1, а затем Normal 2, сообщение не создается.
Если исправить на

!MessageBlockCreate();


то работает. Спасибо!

Последний раз редактировалось osv, 06.04.2025 в 18:37.
Ответить с цитированием
  #4 (permalink)  
Старый 06.04.2025, 19:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,144

Сообщение от osv
При нажатии кнопки Normal 1, а затем Normal 2, сообщение не создается.
исправлено
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вывести элементы по очереди каждый через несколько секунд? AsceticTr jQuery 3 27.05.2018 16:59
Автоматическое открытие модального окна через несколько секунд Galyanov Элементы интерфейса 2 04.07.2015 14:26
Выполнение кода только один раз в несколько секунд. Threaded_Inquisitor Элементы интерфейса 7 18.10.2013 09:15
Резиновые дивы с прокруткой Java Script Mary-Jay Элементы интерфейса 10 24.07.2013 17:51
как запретить вызов функции чаще n раз в несколько секунд ? linklee Общие вопросы Javascript 2 19.07.2013 14:52