Javascript-форум (https://javascript.ru/forum/)
-   Работа (https://javascript.ru/forum/job/)
-   -   Окно приветствия (https://javascript.ru/forum/job/76727-okno-privetstviya.html)

admiral 07.02.2019 17:48

Окно приветствия
 
Всем привет, нужна помощь по написанию одного скрипта.
Когда человек, вошел на сайт, нужно подгрузить раньше всего, окно приветствия. Его код:
Код:

<div class="hello">
 <div class="hellotext">
        <div align="center" class="logo">
          <img src="/logo.png" alt="" />
          Добро пожаловать!
        </div>
 </div>
</div>

Окно должно появится только один раз, скажем так за сессию. То есть пользователь может переходить по сайту, обновлять его, окно больше появляться не должно. Но как только человек вышел с сайта, закрыл его, не был на нем определенное количество времени, и опять зашел, опять показать окно при первом заходе один раз за сессию.

Я так полагаю что нужно запомнить что сайт показал один раз окно в кеш или куки, а после того как человек вышел, и грубо говоря в течении минуты не заходил на сайт, очистить эти куки или кеш. И так по кругу. Кто поможет готов отблагодарить финансово.

Nexus 07.02.2019 18:21

Какой язык на back-end'е?

admiral 07.02.2019 18:30

php. Сайт на wp.

laimas 07.02.2019 19:11

На JS делайте, если не знаете структуру модулей CMS.

admiral 07.02.2019 19:13

Цитата:

Сообщение от laimas (Сообщение 503302)
На JS делайте, если не знаете структуру модулей CMS.

Так а я что прошу? что бы мне на JS сделали. Написал что даже заплачу за работу.

laimas 07.02.2019 19:18

Nexus, сделает, у меня работы и так ... :) В WP нужно только соблюсти правила подключения пользовательских js-скриптов.

admiral 07.02.2019 19:24

Цитата:

Сообщение от laimas (Сообщение 503304)
Nexus, сделает, у меня работы и так ... :) В WP нужно только соблюсти правила подключения пользовательских js-скриптов.

Буду ему очень благодарен

ksa 08.02.2019 07:55

Цитата:

Сообщение от admiral
Кто поможет готов отблагодарить финансово.

Напугай цифрами! :D

ksa 08.02.2019 08:48

Цитата:

Сообщение от admiral
Буду ему очень благодарен

Вот и проверим. :yes:
Как вариант...

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='https://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function(){
	(function(){
		// Указать лимит по времени задержки в часах
		var limit=0.01;
		var hours=1000*60*60;
		var date = localStorage.getItem('date');
		if (date==null) {
			append();
		} else {
			date=new Date(date);
			date=(new Date()-date)/hours;
			if (date>limit) {
				append();
			};
		};
		function append() {
			var html;
			html='<div class="hello">';
			html+='<div class="hellotext">';
			html+='<div align="center" class="logo">';
			html+='<img src="/logo.png" alt="" />';
			html+='Добро пожаловать!';
			html+='</div>';
			html+='</div>';
			html+='</div>';
			$('body').append(html);
			var date=new Date();
			localStorage.setItem('date',date);
		};
	})();
});
</script>
</head>
<body>
</body>
</html>

Nexus 08.02.2019 09:56

<div class="hello" style="display:none" id="welcome-window">
	<div class="hellotext">
		<div align="center" class="logo">
			<img src="/logo.png" alt="" />
			Добро пожаловать!
		</div>
	</div>
</div>
<script>
(function(){
	const timestamp=new Date().getTime();//miliseconds
	const maxInactivePeriod=2;//hours
	const cookieName='welcome_window';
	let lastVisit;

	try{
		lastVisit=+(localStorage.getItem('lastVisit')||timestamp);
		localStorage.setItem('lastVisit',timestamp);
	}catch(e){
		lastVisit=timestamp;
		console.error(e);
	};

	if(
		lastVisit+maxInactivePeriod*3600*1000>timestamp && 
		document.cookie.indexOf(cookieName)>=0
	)
		return;

	const win=document.getElementById('welcome-window');
	if(!win)
		return;

	win.style.display='block';
	document.cookie='name='+cookieName+'; path=/;';
})();
</script>

Malleys 08.02.2019 12:20

<div class="hello" style="display:none" id="welcome-window">
	<div class="hellotext">
		<div align="center" class="logo">
			<img src="/logo.png" alt="" />
			Добро пожаловать!
		</div>
	</div>
</div>
<script>
(function(){
	var win = document.getElementById("welcome-window");
	if(win && "visited" in sessionStorage === false) {
		win.style.display = "block";
		sessionStorage.visited = true;
	}
})();
</script>

рони 08.02.2019 12:47

Malleys,
:) :thanks:

SuperZen 08.02.2019 13:15

Если как у Malleys, если открыть в другом табе, приветствие будут отображено в каждом табе... и чтобы от этого избавиться надо завязываться на сессию php, или делать финт ушами ) через service workers + localStorage на стороне клиента... но можно и так, если не платить денег %)

рони 08.02.2019 13:19

SuperZen,
спасибо за уточнение!

SuperZen 08.02.2019 13:41

рони, не за что, в общем сессия php живет до закрытия браузера, sessionStorage живет до закрытия таба... надо хранить кол-во открытых табов, те при загрузке в localStorage сделать tab + 1, при закрытии таба делать tab -1, и если tab = 0 или пусто, то показываем приветствие... но тут появляется другая проблема, с точки перфекционизма, что будет если закрыть браузер, и потом его открыть, что показывать в открытых табах... только в одном табе показывать приветствие или во всех... задача из серии сделать "Remember Me" на "Login" странице, на стороне клиента... :)

SuperZen 08.02.2019 16:02

Цитата:

Сообщение от Malleys (Сообщение 503353)
Было бы странно, если бы оно не отобразилось. А то какой-смысл открывать новую вкладку, если в ней всё восстановится, что уже есть в открытой вкладке.

Здесь не про то, что там что-то надо восстановить, а то что sessionStorage работает только для одного таба... И чтобы показывать приветствие только для первого открытого таба, и чтобы не показывать приветствие в других табах, если его показали для первого таба... да, таких условий не было озвучено, и возможно потому что это не явно ясно, видим сессию и все понеслась душа в рай... :D

Malleys 08.02.2019 16:48

Цитата:

Сообщение от SuperZen
если открыть в другом табе, приветствие будут отображено в каждом табе...

Было бы странно, если бы оно не отобразилось. А то какой-смысл открывать новую вкладку, если в ней всё восстановится, что уже есть в открытой вкладке.

Для сайта без регистрации/привязки к человеку это идеальное решение, а так оно должно показываться в зависимости от активности пользователя, т. е. посмотрел на компьютере, ему показали приветствие, потом решил смотреть на телефоне, ему приветствие уже не показывается, т. к. пару минут назад его приветствовали на компьютере.

UPD

Цитата:

Сообщение от SuperZen
видим сессию и все

Цитата:

Сообщение от SuperZen
sessionStorage работает только для одного таба

Ведь вы можете учитывать, откуда появилась вкладка... Если пользователи нашли на странице ссылку и в контекстном меню выбрали открыть в новой вкладке или нажали на вкладке дублировать, то тогда приветствие не нужно, а если отдельно ввели адрес в новой вкладке, то тогда нужно! Если вы позволяете такое мнение, то можно посмотреть на document.referrer

<div class="hello" style="display:none" id="welcome-window">
	<div class="hellotext">
		<div align="center" class="logo">
			<img src="/logo.png" alt="" />
			Добро пожаловать!
		</div>
	</div>
</div>
<script>
(function(){
	var win = document.getElementById("welcome-window");
	if(
		win && "visited" in sessionStorage === false &&
		new URL(document.referrer, "file:///").host !== location.host
	) {
		win.style.display = "block";
		sessionStorage.visited = true;
	}
})();
</script>

<a href="?test">Link</a>

ksa 09.02.2019 11:19

Ну теперь бабосов точно не увидим... :D


Часовой пояс GMT +3, время: 14:51.