Просмотр полной версии : Время выполнения
Сергей Ракипов
01.02.2024, 10:32
Друзья мне уже стыдно смотреть в глаза GPT но мы ни как не можем понять друг друга.
Есть код который случайно показывает блоки присваивает стили и с ним все нормально. То есть обновил страницу он показал случайный блок, обновил показал и пока все блоки не покажет будет показывать, но это не суть он работает и молодец.
Но нужно что бы возможность увидеть случайный блок была раз в 10 часов. То есть человек зашел на сайт ему показали случайный блок и если он зайдет еще раз или обновит страницу а 10 часов не прошло ему код не отрабатывал свои функции. Прошло 10 часов можно будет показать ему новый случайный блок (ну то есть что бы функции кода отработали) если он зашел или обновил страницу и вот такой интервал так сказать должен блокировать показы, один раз в 10 часов
Плюс если он попытается обновить или зайти в промежуток этих "запрещеных" 10 часов то ему показывали другой блок, а именно блокус классом limitation добавился класс show
вот сам код
// Получаем все блоки и сохраняем их в массив
const blocks = Array.from(document.querySelectorAll('.fact_block' ));
// Функция для получения уже показанных блоков из localStorage
function getShownBlocks() {
const shownBlocks = localStorage.getItem('shownBlocks');
return shownBlocks ? JSON.parse(shownBlocks) : [];
}
// Функция для сохранения ID показанного блока
function saveShownBlock(blockId) {
const shownBlocks = getShownBlocks();
shownBlocks.push(blockId);
localStorage.setItem('shownBlocks', JSON.stringify(shownBlocks));
// Проверяем, есть ли у блока класс 'fact_picture_mini_curr'
if (document.getElementById(blockId).classList.contai ns('fact_picture_mini_curr')) {
// Если есть, то сохраняем его в localStorage
const factPictureMiniCurrIds = JSON.parse(localStorage.getItem('fact_picture_mini _curr')) || [];
localStorage.setItem('fact_picture_mini_curr', JSON.stringify([...new Set([...factPictureMiniCurrIds, blockId])]));
}
}
// Функция для удаления класса 'show' у всех блоков
function removeShowClass() {
blocks.forEach(block => block.classList.remove('show'));
}
// Функция для выбора и показа случайного блока
function showRandomBlock() {
const shownBlocks = getShownBlocks();
const availableBlocks = blocks.filter(block => !shownBlocks.includes(block.id) && block.id.includes('fact_'));
if (availableBlocks.length === 0) {
// Показываем последний блок, если все остальные уже показаны
const lastBlock = blocks.find(block => block.id === 'full_collection');
lastBlock.classList.add('show');
} else {
// Выбираем случайный блок из доступных
const randomBlock = availableBlocks[Math.floor(Math.random() * availableBlocks.length)];
randomBlock.classList.add('show');
saveShownBlock(randomBlock.id);
// Добавляем класс 'fact_picture_mini_curr' к соответствующему блоку с id 'mini_'
const miniBlock = document.getElementById(`mini_${randomBlock.id.rep lace('fact_', '')}`);
if (miniBlock) {
miniBlock.classList.add('fact_picture_mini_curr');
saveShownBlock(`mini_${randomBlock.id.replace('fac t_', '')}`);
}
}
}
// Удаляем класс 'show' у всех блоков и показываем новый блок
removeShowClass();
showRandomBlock();
// Проверяем, есть ли id блока с классом 'fact_picture_mini_curr' в localStorage
const factPictureMiniCurrIds = JSON.parse(localStorage.getItem('fact_picture_mini _curr')) || [];
// Если есть, то добавляем класс 'fact_picture_mini_curr' этим блокам
factPictureMiniCurrIds.forEach(id => {
document.getElementById(id).classList.add('fact_pi cture_mini_curr');
});
люди ) помогите если сможете )
ruslan_mart
01.02.2024, 12:23
Не проверял, но должно сработать:
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
const blockList = Array.from(document.querySelectorAll('.fact_block' ));
const limitationBlock = document.querySelector('.limitation');
const INTERVAL = 1000 * 60 * 60 * 10; // 10 часов
const STORAGE_KEY = 'random-block';
const currentStorageValue = Number(window.localStorage.getItem(STORAGE_KEY));
if (Number.isNaN(currentStorageValue) || currentStorageValue < Date.now() - INTERVAL) {
const randomBlockItem = blockList[getRandomInt(0, getRandomInt.length - 1)];
window.localStorage.setItem(STORAGE_KEY, String(Date.now()));
randomBlockItem.classList.add('show');
} else {
limitationBlock.classList.add('show');
}
Сергей Ракипов
01.02.2024, 12:28
Не проверял, но должно сработать:
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
const blockList = Array.from(document.querySelectorAll('.fact_block' ));
const limitationBlock = document.querySelector('.limitation');
const INTERVAL = 1000 * 60 * 60 * 10; // 10 часов
const STORAGE_KEY = 'random-block';
const currentStorageValue = Number(window.localStorage.getItem(STORAGE_KEY));
if (Number.isNaN(currentStorageValue) || currentStorageValue < Date.now() - INTERVAL) {
const randomBlockItem = blockList[getRandomInt(0, getRandomInt.length - 1)];
window.localStorage.setItem(STORAGE_KEY, String(Date.now()));
randomBlockItem.classList.add('show');
} else {
limitationBlock.classList.add('show');
}
не работает
ruslan_mart,
Вот это не понятно, что означает (стр 14)
const randomBlockItem = blockList[getRandomInt(0, getRandomInt.length - 1)];
люди ) помогите если сможете )
А что конкретно не работает?
Ну там нет никакого учета времени.
По коду, я не могу понять, что означают классы 'fact_picture_mini_curr', что означает префикс 'mini_' у id?
Как вообще верстка сделана? Какие классы у показываемых блоков, какие у них id? Какие классы у финального блока?
Сергей Ракипов
01.02.2024, 13:45
А что конкретно не работает?
Ну там нет никакого учета времени.
Да просто не работает, даже ошибки нет
Вот код кусками весь не влазит
<main>
<header>
<div class="limitation">
Достигнуто суточное ограничение
</div>
</header>
<section class="block">
<div class="fact_block" id="fact_0000">
<div class="fact_title">
<p>1 факт</p>
<p>Лобовое стекло кабины Boeing 747-400</p>
</div>
<div class="fact_content">
Одно лобовое стекло или оконная рама кабины Boeing 747-400 стоят столько же, сколько автомобиль BMW
</div>
<div class="fact_picture">
<img src="picture/plane_0.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
<div class="fact_block" id="fact_0001">
<div class="fact_title">
<p>2 факт</p>
<p>Инверсионный след</p>
</div>
<div class="fact_content">
Инверсионный след, который самолеты оставляют позади себя, состоит из водяного пара. Тонкий след говорит о том, что сейчас низкая влажность воздуха и ясная погода. А толстый, более длинный след может являться ранним признаком шторма.
</div>
<div class="fact_picture">
<img src="picture/plane_1.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
<div class="fact_block" id="fact_0002">
<div class="fact_title">
<p>3 факт</p>
<p>Сброс топлива</p>
</div>
<div class="fact_content">
Если самолет должен совершить аварийную посадку, то пилот может принять решение сбросить топливо из баков в крыльях. Хотя это случается не очень часто, подобное делается для того, чтобы уменьшить вес самолета. Топливо обычно испаряется, прежде чем достигнет земли.
</div>
<div class="fact_picture">
<img src="picture/plane_2.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
<div class="fact_block" id="fact_0003">
<div class="fact_title">
<p>4 факт</p>
<p>Airbus A380</p>
</div>
<div class="fact_content">
Самый большой в мире пассажирский самолет - Airbus A380. Этот двухэтажный реактивный лайнер с четырьмя двигателями совершил свой первый полет 27 апреля 2005 года.
</div>
<div class="fact_picture">
<img src="picture/plane_3.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
<div class="fact_block" id="fact_0004">
<div class="fact_title">
<p>5 факт</p>
<p>BD-5 Micro</p>
</div>
<div class="fact_content">
Самый маленький в мире реактивный самолет - BD-5 Micro. Его размах крыльев составляет от 4 до 6,5 метров, а весит самолет всего 160 кг
</div>
<div class="fact_picture">
<img src="picture/plane_4.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
<div class="fact_block" id="full_collection">
<div class="fact_title">
<p>Полная коллекция</p>
</div>
<div class="fact_content">
Коллекция фактов собрана
</div>
<div class="fact_picture">
<img src="picture/plane_5.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
</section>
<section class="current">
<div class="fact_block" id="curr_0000">
<div class="fact_title">
<p>1 факт</p>
<p>Лобовое стекло кабины Boeing 747-400</p>
</div>
<div class="fact_content">
Одно лобовое стекло или оконная рама кабины Boeing 747-400 стоят столько же, сколько автомобиль BMW
</div>
<div class="fact_picture">
<img src="picture/plane_0.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
<div class="fact_block" id="curr_0001">
<div class="fact_title">
<p>2 факт</p>
<p>Инверсионный след</p>
</div>
<div class="fact_content">
Инверсионный след, который самолеты оставляют позади себя, состоит из водяного пара. Тонкий след говорит о том, что сейчас низкая влажность воздуха и ясная погода. А толстый, более длинный след может являться ранним признаком шторма.
</div>
<div class="fact_picture">
<img src="picture/plane_1.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
<div class="fact_block" id="curr_0002">
<div class="fact_title">
<p>3 факт</p>
<p>Сброс топлива</p>
</div>
<div class="fact_content">
Если самолет должен совершить аварийную посадку, то пилот может принять решение сбросить топливо из баков в крыльях. Хотя это случается не очень часто, подобное делается для того, чтобы уменьшить вес самолета. Топливо обычно испаряется, прежде чем достигнет земли.
</div>
<div class="fact_picture">
<img src="picture/plane_2.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
<div class="fact_block" id="curr_0003">
<div class="fact_title">
<p>4 факт</p>
<p>Airbus A380</p>
</div>
<div class="fact_content">
Самый большой в мире пассажирский самолет - Airbus A380. Этот двухэтажный реактивный лайнер с четырьмя двигателями совершил свой первый полет 27 апреля 2005 года.
</div>
<div class="fact_picture">
<img src="picture/plane_3.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
<div class="fact_block" id="curr_0004">
<div class="fact_title">
<p>5 факт</p>
<p>BD-5 Micro</p>
</div>
<div class="fact_content">
Самый маленький в мире реактивный самолет - BD-5 Micro. Его размах крыльев составляет от 4 до 6,5 метров, а весит самолет всего 160 кг
</div>
<div class="fact_picture">
<img src="picture/plane_4.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
</section>
<section class="mini">
<div class="fact_picture_mini" id="mini_0000" >
<img src="picture/plane_0.jpg" width="100%" alt="">
</div>
<div class="fact_picture_mini" id="mini_0001">
<img src="picture/plane_1.jpg" width="100%" alt="">
</div>
<div class="fact_picture_mini" id="mini_0002">
<img src="picture/plane_2.jpg" width="100%" alt="">
</div>
<div class="fact_picture_mini" id="mini_0003">
<img src="picture/plane_3.jpg" width="100%" alt="">
</div>
<div class="fact_picture_mini" id="mini_0004">
<img src="picture/plane_4.jpg" width="100%" alt="">
</div>
</section>
<footer></footer>
</main>
Сергей Ракипов
01.02.2024, 13:46
main{
width: 100%;
}
header{
height: 60px;
margin: 0px auto 0px;
max-width: 640px;
min-width: 320px;
}
footer{
height: 60px;
}
section{
margin: 0px auto 0px;
max-width: 640px;
min-width: 320px;
position: static;
}
section.block{
margin: 0px auto 0px;
max-width: 640px;
min-width: 320px;
position: relative;
}
.fact_block {
display: none;
position: relative;
margin: 20px 0px 20px 0px;
padding: 0px 20px 0px 20px;
}
.fact_title {
margin: 20px 0px 20px 0px;
height: 60px;
}
.fact_content {
margin: 20px 0px 20px 0px;
height: 180px;
height: auto;
}
.fact_source {
margin: 20px 0px 20px 0px;
}
.fact_source > a {
}
.fact_picture {
margin: 20px 0px 20px 0px;
}
.fact_picture > img {
width: 100%;
}
.show{
display: block;
}
.limitation{
text-align: center;
padding: 40px 0px 0px 0px;
display: none;
}
.mini{
display: flex;
justify-content: center;
align-items: center;
}
.fact_picture_mini{
width: 80px;
padding: 0px 10px 0px 10px;
filter: grayscale(100%);
pointer-events: none;
}
.fact_picture_mini_curr{
filter: grayscale(0%);
cursor: pointer;
pointer-events: auto;
}
ruslan_mart
01.02.2024, 14:25
Сорян, торопился и опечатался. Работает:
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
const blockList = Array.from(document.querySelectorAll('.fact_block' ));
const limitationBlock = document.querySelector('.limitation');
const INTERVAL = 1000 * 60 * 60 * 10; // 10 часов
const STORAGE_KEY = 'random-block';
const currentStorageValue = Number(window.localStorage.getItem(STORAGE_KEY));
if (blockList.length > 0 && ((Number.isNaN(currentStorageValue) || currentStorageValue < Date.now() - INTERVAL))) {
const randomBlockItem = blockList[getRandomInt(0, blockList.length - 1)];
window.localStorage.setItem(STORAGE_KEY, String(Date.now()));
randomBlockItem.classList.add('show');
} else {
limitationBlock.classList.add('show');
}
<div>
<div class="fact_block">1</div>
<div class="fact_block">2</div>
<div class="fact_block">3</div>
<div class="fact_block">4</div>
<div class="fact_block">5</div>
</div>
<div class="limitation">limitation</div>
.fact_block, .limitation {
display: none;
}
.fact_block.show, .limitation.show {
display: block;
}
Ну вот такой работающий вариант. Просто, как пример. Ваш код слишком большой для изучения
(Интервал установлен в 15 сек
<!DOCTYPE html>
<html lang="ru">
<head>
<title>Блоки</title>
<style>
.fact_block {
position: relative;
width: 300px;
height: 200px;
border: 1px solid blue;
display: none;
}
.final_block {
border: 1px solid red;
}
.show {
display: block;
}
</style>
</head>
<body>
<div id="f1" class="fact_block">Block 1</div>
<div id="f2" class="fact_block">Block 2</div>
<div id="f3" class="fact_block">Block 3</div>
<div id="f4" class="fact_block">Block 4</div>
<div id="f5" class="fact_block">Block 5</div>
<div id="f6" class="fact_block">Block 6</div>
<div id="f7" class="fact_block">Block 7</div>
<div id="f8" class="fact_block">Block 8</div>
<div id="f9" class="fact_block">Block 9</div>
<div id="final" class="fact_block final_block">Final Block</div>
<script>
function showRandomBlock() {
const INTERVAL = 15 * 1000; // 15s; 10 * 60 * 60 * 1000 = 10h
const KEY_SHOWNBLOCKS = 'key-shown-blocks';
const KEY_LASTTIMESHOW = 'last-tyme-show';
const getShownBlocks = () => {
let s = window.localStorage.getItem(KEY_SHOWNBLOCKS);
return s ? JSON.parse(s) : [];
};
const addShownBlocks = (idblock) => {
const blocks = getShownBlocks();
blocks.push(idblock);
window.localStorage.setItem(
KEY_SHOWNBLOCKS,
JSON.stringify(blocks)
);
};
const getLastTime = () => {
let s = window.localStorage.getItem(KEY_LASTTIMESHOW);
return s ? Number(s) : 0;
};
const setLastTime = () => {
const time = Date.now();
window.localStorage.setItem(KEY_LASTTIMESHOW, time);
};
const showBlock = (id) => {
document.getElementById(id).classList.add('show');
};
const showLastBlock = () => {
const shownBlocks = getShownBlocks();
const id = shownBlocks.at(-1);
showBlock(id);
};
const getRandomInt = (min, max) => {
return Math.floor(Math.random() * (max - min) + min);
};
const showNewBlock = () => {
const factBlocks = [
...document.querySelectorAll(
'.fact_block:not(.final_block)'
),
].map((block) => block.id);
const shownBlocks = getShownBlocks();
const availableBlocks = factBlocks.filter(
(id) => !shownBlocks.includes(id)
);
if (availableBlocks.length === 0) {
const idlast = document.querySelector('.final_block').id
showBlock(idlast)
} else {
const index = getRandomInt(0, availableBlocks.length);
const idblock = availableBlocks[index];
showBlock(idblock);
addShownBlocks(idblock);
setLastTime();
}
};
const lastTime = getLastTime();
if (lastTime + INTERVAL < Date.now()) {
showNewBlock();
} else {
showLastBlock();
}
}
showRandomBlock();
</script>
</body>
</html>
Блоки, которые могут показываться должны иметь класс 'fact_block'. Заключительный блок, кроме этого должен иметь класс 'final_block'. Для показа блока, ему добавляется класс 'show'
Я видно не так понял эту задачу.
Я показываю, какой то блок в течении все заданного интервала. Интервал закончился, начался новый я показываю другой блок. Когда все блоки закончатся показываю все время последний.
Сейчас переделаю
Как то так
<!DOCTYPE html>
<html lang="ru">
<head>
<title>Блоки</title>
<style>
.limitation,
.fact_block {
position: relative;
width: 300px;
height: 200px;
border: 1px solid blue;
display: none;
}
.limitation {
border: 1px solid red;
}
.show {
display: block;
}
</style>
</head>
<body>
<div id="f1" class="fact_block">Block 1</div>
<div id="f2" class="fact_block">Block 2</div>
<div id="f3" class="fact_block">Block 3</div>
<div id="f4" class="fact_block">Block 4</div>
<div id="f5" class="fact_block">Block 5</div>
<div id="f6" class="fact_block">Block 6</div>
<div id="f7" class="fact_block">Block 7</div>
<div id="f8" class="fact_block">Block 8</div>
<div id="f9" class="fact_block">Block 9</div>
<div id="Limit" class="limitation">Limit Block</div>
<script>
function showRandomBlock() {
const INTERVAL = 15 * 1000; // 15s; 10 * 60 * 60 * 1000 = 10h
const KEY_SHOWNBLOCKS = 'key-shown-blocks';
const KEY_LASTTIMESHOW = 'last-tyme-show';
const getShownBlocks = () => {
let s = window.localStorage.getItem(KEY_SHOWNBLOCKS);
return s ? JSON.parse(s) : [];
};
const addShownBlocks = (idblock) => {
const blocks = getShownBlocks();
blocks.push(idblock);
window.localStorage.setItem(
KEY_SHOWNBLOCKS,
JSON.stringify(blocks)
);
};
const getLastTime = () => {
let s = window.localStorage.getItem(KEY_LASTTIMESHOW);
return s ? Number(s) : 0;
};
const setLastTime = () => {
const time = Date.now();
window.localStorage.setItem(KEY_LASTTIMESHOW, time);
};
const showBlock = (id) => {
document.getElementById(id).classList.add('show');
};
const showLimitationBlock = () => {
const idlimit = document.querySelector('.limitation').id
showBlock(idlimit);
};
const getRandomInt = (min, max) => {
return Math.floor(Math.random() * (max - min) + min);
};
const showNewBlock = () => {
const factBlocks = [
...document.querySelectorAll(
'.fact_block:not(.final_block)'
),
].map((block) => block.id);
const shownBlocks = getShownBlocks();
const availableBlocks = factBlocks.filter(
(id) => !shownBlocks.includes(id)
);
if (availableBlocks.length) {
const index = getRandomInt(0, availableBlocks.length);
const idblock = availableBlocks[index];
showBlock(idblock);
addShownBlocks(idblock);
setLastTime();
}
};
const lastTime = getLastTime();
if (lastTime + INTERVAL < Date.now()) {
showNewBlock();
} else {
showLimitationBlock();
}
}
showRandomBlock();
</script>
</body>
</html>
Сергей Ракипов
02.02.2024, 14:37
voraa,
Спасибо это не совсем то, но думаю что из этого я под себя подгоню
Сергей Ракипов
02.02.2024, 16:00
Что то не очень получается
Ну вот если кто то сможет вникнуть https://youtu.be/J6Tzqn9GrX0
видео 2 минуты
И вот не посредственно если кому то будет интересно посмотреть что за код https://rakipov.ru/web/fact/
ruslan_mart
02.02.2024, 19:11
Сергей Ракипов, то что я скидывал в своём сообщении - тоже не то?
это не совсем то,
А вы четко напишите (можно с примерами), что должно быть "тем"
Сергей Ракипов
06.02.2024, 17:37
Не получается.
Есть блоки с фактами, я хочу показывать их раз в сутки.
Факты должны показываться в случайно порядке и два раза один и тот же факт показывать не нужно.
Когда человеку показали один факт у него одни сутки запрет на показ случайных фактов. Но то что ему уже было показано прятать от него не нужно. А просто сказать ему что типа пока не покажу.
Вот тут факты class="fact_block"
Вот тут блок с ограничением
<div class="limitation">
Достигнуто суточное ограничение
</div>
НО не прятать от него последний факт, просто прекратить случайного показа.
Сергей Ракипов
06.02.2024, 17:40
вот показан показан факт и показано что идет суточное ограничение
Сергей Ракипов
07.02.2024, 11:38
Техническое задание для скрипта показа случайного блока:
1. Описание задачи:
Необходимо разработать скрипт, который будет отображать случайный блок из массива блоков на веб-странице. Каждый блок имеет класс "fact_block". При показе блока также должен быть сохранен его ID в localStorage. Если блок имеет класс "fact_picture_mini_curr", его ID также должен быть сохранен в отдельный массив "fact_picture_mini_curr" в localStorage.
2. Входные данные:
- Массив блоков с классом "fact_block"
- localStorage для сохранения показанных блоков и блоков с классом "fact_picture_mini_curr"
3. Выходные данные:
- Отображение случайного блока на веб-странице
- Сохранение ID показанного блока в localStorage
- Сохранение ID блока с классом "fact_picture_mini_curr" в отдельный массив в localStorage
4. Описание функций:
- getShownBlocks(): функция для получения уже показанных блоков из localStorage. Если такие блоки есть, возвращает массив ID блоков. Если таких блоков нет, возвращает пустой массив.
- saveShownBlock(blockId): функция для сохранения ID показанного блока. Получает ID блока и добавляет его в массив показанных блоков в localStorage. Если блок имеет класс "fact_picture_mini_curr", также сохраняет его ID в отдельный массив в localStorage.
- removeShowClass(): функция для удаления класса "show" у всех блоков. Проходит по массиву блоков и удаляет класс "show" у каждого блока.
- showRandomBlock(): функция для выбора и показа случайного блока. Получает массив показанных блоков и фильтрует массив блоков, оставляя только доступные блоки (которые еще не показаны и имеют ID, содержащий "fact_"). Если доступных блоков нет, показывает последний блок с ID "full_collection". Иначе, выбирает случайный блок из доступных, добавляет ему класс "show" и сохраняет его ID с помощью функции saveShownBlock(). Если у выбранного блока есть соответствующий блок с ID, начинающимся с "mini_", добавляет ему класс "fact_picture_mini_curr" и сохраняет его ID в отдельный массив в localStorage.
5. Шаги выполнения:
- Получить все блоки с классом "fact_block" и сохранить их в массив "blocks".
- Вызвать функцию removeShowClass() для удаления класса "show" у всех блоков.
- Вызвать функцию showRandomBlock() для выбора и показа случайного блока.
- Проверить наличие ID блоков с классом "fact_picture_mini_curr" в массиве "factPictureMiniCurrIds" из localStorage. Если такие ID есть, добавить класс "fact_picture_mini_curr" этим блокам.
6. Требования к localStorage:
- Ключ "shownBlocks" для хранения массива ID показанных блоков.
- Ключ "fact_picture_mini_curr" для хранения массива ID блоков с классом "fact_picture_mini_curr".
7. Тестирование:
- Убедиться, что случайный блок отображается на веб-странице при каждом обновлении страницы.
- Убедиться, что ID показанного блока сохраняется в localStorage.
- Убедиться, что блоки с классом "fact_picture_mini_curr" также сохраняются и отображаются правильно.
8. Ограничение показа случайного блока:
- Предусмотреть ограничение показа случайного блока один раз в 10 минут.
- Проверять время последнего показа случайного блока в localStorage.
- Если время последнего показа блока меньше 10 минут назад, не показывать новый случайный блок и продолжать отображать предыдущий блок.
- Если время последнего показа блока больше или равно 10 минут назад, показывать новый случайный блок и обновлять время последнего показа в localStorage.
9. Дополнительные функции:
- getLastShownTime(): функция для получения времени последнего показа случайного блока из localStorage. Возвращает время в миллисекундах или 0, если время не сохранено.
- saveLastShownTime(): функция
Вряд ли, кто такое будет делать. Тем более, что иногда написана чушь.
Типа- Вызвать функцию removeShowClass() для удаления класса "show" у всех блоков.
А он у них есть этот класс?
Иногда просто непонятно.Если у выбранного блока есть соответствующий блок с ID, начинающимся с "mini_", добавляет ему класс "fact_picture_mini_curr" и сохраняет его ID в отдельный массив в localStorage.
Я такого в вашем html не нашел. Или чего то не понял.
Допустим мы как то нашли такой блок и присвоили ему класс fact_picture_mini_curr
Читаем далее- Проверить наличие ID блоков с классом "fact_picture_mini_curr" в массиве "factPictureMiniCurrIds" из localStorage. Если такие ID есть, добавить класс "fact_picture_mini_curr" этим блокам.
Он один такой блок с таким классом. И кому опять добавляется этот класс, если у этого одного блока он уже есть?
Ну еще не понятно. Есть блоки с классом fact_block. Некоторые из них имеют id типа "fact_0004", а некоторые "curr_0004". С последними как быть? Вы пишете только про id имеющий "fact_"
Вообще можно было бы ограничиться п.8 Только четче его описать. Там непонятно, какую картинку показывать вместе с блоком. Что быдет после показа "full_collection". Всегда, сколько бы дальше человек не заходил показывать только это? (Странное решение)
А как писать, в какие массивы, какими функциями - это дело программера
Сергей Ракипов
09.02.2024, 10:53
voraa,
понимаю это, я пошел другим путем
Сергей Ракипов
09.02.2024, 16:23
Ну может кто поймет
const factBlocks = document.querySelectorAll('.fact_block');
const limitationElement = document.querySelector('.limitation');
const endBlock = document.querySelector('.fact_end');
const blocks = Array.from(factBlocks);
function getShownBlocksData() {
const shownBlocksData = localStorage.getItem('shownBlocks');
return shownBlocksData ? JSON.parse(shownBlocksData) : { blocks: [], lastGenerationTime: null };
}
function saveShownBlock(blockId) {
const shownBlocksData = getShownBlocksData();
shownBlocksData.blocks.push(blockId);
shownBlocksData.lastGenerationTime = new Date().toISOString();
localStorage.setItem('shownBlocks', JSON.stringify(shownBlocksData));
}
function removeShowClass() {
blocks.forEach(block => block.classList.remove('show'));
limitationElement.classList.remove('show');
}
function shouldShowLimitation() {
const shownBlocksData = getShownBlocksData();
if (shownBlocksData.lastGenerationTime) {
const lastUpdateTime = new Date(shownBlocksData.lastGenerationTime);
const currentTime = new Date();
const timeDiff = currentTime - lastUpdateTime;
return timeDiff < 2000;
}
return false;
}
function showRandomBlock() {
const shownBlocksData = getShownBlocksData();
const shownBlocks = shownBlocksData.blocks;
const availableBlocks = blocks.filter(block => !shownBlocks.includes(block.id));
if (shouldShowLimitation()) {
limitationElement.classList.add('show');
if (shownBlocks.length > 0) {
const lastShownBlockId = shownBlocks[shownBlocks.length - 1];
const lastShownBlock = blocks.find(block => block.id === lastShownBlockId);
if (lastShownBlock) {
lastShownBlock.classList.add('show');
}
}
return;
}
if (availableBlocks.length === 0) {
endBlock.classList.add('show');
} else {
const randomBlock = availableBlocks[Math.floor(Math.random() * availableBlocks.length)];
randomBlock.classList.add('show');
saveShownBlock(randomBlock.id);
}
}
removeShowClass();
showRandomBlock();
function updateMiniPicturesClass() {
// Получаем уже показанные номера из localStorage
const shownBlocksData = getShownBlocksData();
const shownBlocks = shownBlocksData.blocks;
// Перебираем все миниатюры
shownBlocks.forEach(index => {
// Форматируем ID, добавляя ведущие нули к номеру
const miniId = `mini_${index.toString().padStart(4, '0')}`;
const miniElement = document.getElementById(miniId);
// Если элемент найден, меняем его класс
if (miniElement) {
miniElement.classList.remove('fact_picture_mini');
miniElement.classList.add('fact_picture_mini_curr' );
}
});
}
updateMiniPicturesClass();
function changeClass() {
let currentBlock = document.querySelector('.current');
currentBlock.classList.add('close');
}
let closeButton = document.querySelector('.close_curr');
closeButton.addEventListener('click', changeClass);
Он вот как работает
1. const factBlocks = document.querySelectorAll('.fact\_block'); - Этот код выбирает все элементы с классом 'fact_block' на веб-странице.
2. const limitationElement = document.querySelector('.limitation'); - Этот код выбирает элемент с классом 'limitation'.
3. const endBlock = document.querySelector('.fact\_end'); - Этот код выбирает элемент с классом 'fact_end'.
4. const blocks = Array.from(factBlocks); - Этот код преобразует выбранные элементы в массив.
5. function getShownBlocksData() { - Эта функция получает данные о показанных блоках из localStorage. Если данные не найдены, она возвращает пустой объект.
6. function saveShownBlock(blockId) { - Эта функция сохраняет id текущего блока в localStorage.
7. function removeShowClass() { - Эта функция удаляет класс 'show' со всех блоков и элемента 'limitation'.
8. function shouldShowLimitation() { - Эта функция определяет, следует ли показывать элемент 'limitation'. Она проверяет, прошло ли более 2 секунд с момента последнего обновления.
9. function showRandomBlock() { - Эта функция показывает случайный блок, который еще не был показан. Если элемент 'limitation' должен быть показан, он также добавляется в класс 'show'.
10. removeShowClass(); - Эта строка кода вызывает функцию removeShowClass(), чтобы удалить класс 'show' со всех блоков и элемента 'limitation'.
11. showRandomBlock(); - Эта строка кода вызывает функцию showRandomBlock(), чтобы показать случайный блок.
12. function updateMiniPicturesClass() { - Эта функция обновляет классы миниатюр, чтобы показать, какие блоки уже были показаны.
13. updateMiniPicturesClass(); - Эта строка кода вызывает функцию updateMiniPicturesClass(), чтобы обновить классы миниатюр.
14. function changeClass() { - Эта функция меняет класс текущего блока на 'close'.
15. let closeButton = document.querySelector('.close\_curr'); - Эта строка кода выбирает элемент с классом 'close_curr'.
16. closeButton.addEventListener('click', changeClass); - Эта строка кода добавляет обработчик событий на элемент 'close_curr', который вызывает функцию changeClass() при клике
Сергей Ракипов
09.02.2024, 16:24
И нужно
У меня есть несколько блоков с классом fact_picture_mini и несколько блоков с классом нужно fact_curr. Нужно чтобы при клике на блок с классом fact_picture_mini нужно чтобы к блоку с классом fact_curr присвоился класс show.
... ВОТ ТУТ НАДО КАК ТО НАХОДИТЬ ПО ИДЕНТИЧНОМУ АЙДИ
Если пользователь кликает на другой блок fact_picture_mini то тому что было присвоен класс show, удалить этот класс show.
Сергей Ракипов
09.02.2024, 16:26
Кликнув куда то сюда
<div class="fact_picture_mini" id="mini_fact_0000">
<img src="picture/plane_0.jpg" width="100%" alt="">
</div>
<div class="fact_picture_mini" id="mini_fact_0001">
<img src="picture/plane_1.jpg" width="100%" alt="">
</div>
открылся какой то из этих
<div class="fact_curr" id="curr_0000">
<div class="fact_title">
<p>1 факт</p>
<p>Лобовое стекло кабины Boeing 747-400</p>
</div>
<div class="fact_content">
Одно лобовое стекло или оконная рама кабины Boeing 747-400 стоят столько же, сколько автомобиль BMW
</div>
<div class="fact_picture">
<img src="picture/plane_0.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
<div class="fact_curr" id="curr_0001">
<div class="fact_title">
<p>2 факт</p>
<p>Инверсионный след</p>
</div>
<div class="fact_content">
Инверсионный след, который самолеты оставляют позади себя, состоит из водяного пара. Тонкий след говорит о
том, что сейчас низкая влажность воздуха и ясная погода. А толстый, более длинный след может являться ранним
признаком шторма.
</div>
<div class="fact_picture">
<img src="picture/plane_1.jpg" alt="">
</div>
<div class="fact_source">
<a href="https://novate.ru/blogs/180316/35535/" target="_parent">Источник</a>
</div>
</div>
то есть по айди где цифры 0000, 0001 идентичны друг другу
Сергей Ракипов
10.02.2024, 10:22
Решил задачу
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot