Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Перезагрузить страницу один раз скриптом при первой загрузке страницы (https://javascript.ru/forum/events/83909-perezagruzit-stranicu-odin-raz-skriptom-pri-pervojj-zagruzke-stranicy.html)

Vaska 18.04.2022 19:34

Перезагрузить страницу один раз скриптом при первой загрузке страницы
 
Приветствую!
Применяю такой код, для перезагрузки страницы 1 раз, после первой загрузки страницы в браузере.
if (window.location.href.indexOf("reload")==-1) {
		window.location.replace(window.location.href+"?reload");
	}

Однако, этот код, добавляя в адресную строку ?reload, мешает выполнению поискового запроса, по ключевому слову, на странице поиска, делая поиск ошибочным.
https://mysite.com/Search/index.html?keyword=apple?reload


Можете предложить другой код, который не имеет такого недостатка?

Заранее, спасибо.

рони 18.04.2022 19:41

Vaska,
window.location.reload(true);

Vaska 18.04.2022 20:08

рони,
Нет, это не работает, страница безконечно перезагружается раз, а нужно 1 раз.

Vaska 18.04.2022 20:27

Вот такой вариант нашел в сети и он работает для меня:
/* if my var reload isn't set locally.. in the first time it will be true */
if (!localStorage.getItem("reload")) {
    /* set reload locally and then reload the page */
    localStorage.setItem("reload", "true");
    location.reload();
}
/* after reload clear the localStorage */
else {
    localStorage.removeItem("reload");
    // localStorage.clear(); // an option
}

рони 18.04.2022 20:31

Vaska,
if (!sessionStorage.getItem('reload')) {
        sessionStorage.setItem('reload', 1);
        window.location.reload(true);
    }

Vaska 18.04.2022 20:44

рони,
Ошибся, не там посмотрел.

рони 18.04.2022 20:45

Vaska,
:victory:

Vaska 18.04.2022 20:49

рони,
Нет, страницу не перезагружает.

рони 18.04.2022 21:00

Vaska,
открытая в новой вкладке страница, должна перезагрузится 1раз.

Vaska 18.04.2022 21:05

Дело в том, что этот скрипт должен перезагружать страницу 1 раз, если устарел токен.
Один раз действительно страница перезагружается, но если на странице токен снова устарел и PHP код подсовывает ваш скрипт, чтобы снова перезагрузить страницу, то страница не перезагружается.
Я сначала не понял этого, а потом проверил ещё раз и это обнаружилось.

На одной странице несколько блоков, в которых подсовывается скрипт, чтобы перезагрузить страницу, если токен устарел. Эти блоки подгружает Ajax.

рони 18.04.2022 21:36

Vaska,
не понимаю.
так проверяйте токен, и запоминайте что-то типа

if (sessionStorage.getItem('token')  !== token) {
       sessionStorage.setItem('token', token);
       window.location.reload(true);
    }

Vaska 18.04.2022 21:57

рони,
На одной странице есть три блока, каждый из которого подгружает свою страницу .html с помощью Ajax.
Функция PHP, при подгрузке страницы в блок, проверяет не протух ли токен. Если протух, то подставляет скрипт, чтобы перезагрузить страницу и обновить токен.
Вот этот код:
if (!localStorage.getItem("reload")) {
    localStorage.setItem("reload", "true");
    location.reload();
}
else {
    localStorage.removeItem("reload");
}

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

Не знаю как лучше объяснить.

рони 18.04.2022 22:12

Vaska,
все токены посылайте в эту функцию, если в массиве такого токена нет, страница перезагрузится.
function saveT(token)
{
  let arT = sessionStorage.getItem('token') || "[]";
  arT = JSON.parse(arT);
  if (!arT.includes(token)) {
       arT.push(token)
       sessionStorage.setItem('token', JSON.stringify(arT));
       window.location.reload(true);
    }
}

Vaska 18.04.2022 23:04

Честно говоря не понял вашу задумку.
Для каждого блока есть запрос Ajax, который вызывает контент в блок.
Например, для одного из блоков, на странице, есть код вызова:
$(function() {
//вызывает файл qrcode_tools.html
$('.qrcode_tools_user').mouseover(function(event){
	setTimeout(function() {
		$("#qrcode_tools_html").load(HOMESITEURL + '/Index/qrcode_tools.html');
	}, 50);
	$(this).unbind('mouseover');
});
});


В хедере страницы есть код для токена:
$.ajaxSetup({
				headers: {
					'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
				},
				data: {
					'__token__': $('meta[name="csrf-token"]').attr('content')
				},
				//cache: false,
			});
			$.ajaxPrefilter('script', function(options) {
				options.data = ''; // -токен
				options.cache = true; // -таймстэмп
			});


В файле PHP я проверяю не протух ли токен и если не протух, то подгружаю контент:

public function qrcode_tools() {			
			//Проверка общего одноразового токена __token__      и токена для страницы /home/Store/index.html?store_id=1     __token_index__ {:indexToken()}
			$csrf_token = input('get.__token__');
			//Если $csrf_token пустой, тогда блокировать, чтобы в отдельной странице не открывали без токена в ссылке
			if (empty($csrf_token)) {
				header("HTTP/1.1 404 Not Found");
				echo "Not Found";
				exit;				
					  //Проверка токена в ссылке страницы, чтобы совпадал с актуальным токеном и токеном в сессии
			} elseif ($csrf_token != session('__token__') && $csrf_token != session('__token_index__')) {
				echo '' . lang('page_outdated') . '<br>
						<div class="img-loader" style="height:82px;"></div>
						<em class="tips_arrow"></em>
						<script>
							setTimeout(function() {
								if (!localStorage.getItem("reload")) {
									localStorage.setItem("reload", "true");
									location.reload();
								} else {
									localStorage.removeItem("reload");
								}
							}, 2000);
						</script>
					';			
				exit;
			}
			//Загружает контент
			echo '' . lang('ds_mobile_shopping_better') . '<br>
					<img class="img-loader" src="' . HOME_SITE_URL . '/qrcode?url=' . config('ds_config.h5_site_url') . '" width="110" height="110" />
					<em class="tips_arrow"></em>';
		}


Куда добавить ваш код и что убрать из моего кода?

рони 18.04.2022 23:11

Vaska,
не понимаю, и зачем перезагрузка и в целом,не подскажу, нужен другой специалист.

Vaska 18.04.2022 23:27

рони,
Перезагрузка нужна, чтобы обновить токен, если он протух.
Токен нужен актуальный для защиты контента от открытия контента вне нужной страницы.

рони 18.04.2022 23:56

Vaska,
возможно, вместо строк 15 - 22 надо что-то типа

function saveT(token)
{
  let arT = sessionStorage.getItem('token') || "[]";
  arT = JSON.parse(arT);
  if (!arT.includes(token)) {
       arT.push(token)
       sessionStorage.setItem('token', JSON.stringify(arT));
       window.location.reload(true);
    }
}
saveT($csrf_token<!-- или session('__token__')-->)

Vaska 19.04.2022 00:38

рони,
Сейчас всё правильно работает!
Большое спасибо!
Можете мне в личку скинуть куда и сколько отблагодарить за помощь?

рони 19.04.2022 00:50

Vaska,
Вашего спасибо, достаточно! :)


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