Единый форум поддержки

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Единый форум поддержки » Форум для новичков » Общие вопросы от новичков (63) #3


Общие вопросы от новичков (63) #3

Сообщений 341 страница 360 из 463

1

В этой теме задаём простые вопросы по функционалу форумов

В этой теме новички могут задать свои вопросы о том, как устроен форум, какие у него есть функции, как пользоваться различными возможностями, какие существуют технические нюансы и ограничения и прочие простые вопросы, не относящиеся к оформлению, наполнению и раскрутке форума.
Если у вас возникли вопросы по оформлению форума, их можете задать в теме Общие вопросы по оформлению (65) #2
Для опытных администраторов форумов добро пожаловать в тему Общие вопросы по администрированию (7)

Важная информация перед тем, как задать вопрос:

  • Ответы дают другие участники форума по собственному желанию.

  • Администрация не может гарантировать моментальное решение или абсолютную корректность каждого ответа.

  • Пожалуйста, уважайте чужое время и усилия других пользователей, старайтесь писать грамотно и доходчиво.

  • Грубое или требовательное отношение к участникам форума неприемлемо и может привести к отказу в помощи на всём форуме.

Подробно сформулируйте свой вопрос, чтобы повысить вероятность отклика помощи:

  • Укажите ссылку на форум: Если ваш вопрос касается конкретного форума, обязательно укажите прямую ссылку на него. Это позволит нам увидеть проблему и предложить наиболее точное решение, не тратя время на догадки.

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

Избегайте излишней навязчивости. В данной теме дают ответы на вопросы, не требующие особого вникания в проблему. Например, для нахождения того или иного функционала в административной части форума и последующей настройки этого функционала, вероятно, вам следовало бы обратиться в тему Общие вопросы по администрированию (7)

Инструменты для поиска и редактирования стиля (скриптов).

Как с помощью браузера можно определить элемент дизайна.

Каталог скриптов/CSS

Полезные скрипты, необходимые темы для новичков, а также ссылки на сайты рассказывающие что такое HTML и CSS.

Типовые Вопросы (ЧаВо)

Ответы на часто задаваемые вопросы.

Как задавать вопросы! Разница между стилем и скриптом. ( Советы)

Плюс к названию темы еще и Памятка.

Любой вопрос по оформлению/неполадкам сопровождайте ссылкой на форум, по которому возникли сложности!

Предыдущая часть темы: Общие вопросы от новичков (63)

Предыдущая часть темы: Общие вопросы от новичков (63) #2


Вопрос автора

Добрый вечер! На форуме возникла проблема с быстрой ссылкой или как её назвать... В форме ответа пишешь @ и выскакивает табличка с юзерами, нажимаешь на нужного и появляется ссылка на его профиль. Почему-то не работает именно с моим. Имя есть, а ссылки нет. С чем это может быть связано?

+1

341

Хамелион написал(а):

Благодарю.

Не за что. Если не получится, то почистите кэш веб-браузера, пользователи тоже пусть его почистят. Потому что браузер для убыстрения загрузки сайта, который он запомнил у себя в истории, сначала обращается к кэшу и оттуда загружает прежнее состояние сайта. После очистки должно, в принципе, помочь. Внимание: при полной очистке запомненного в браузере снимите галку с паролей, иначе удалятся и все пароли!

Отредактировано Neo.Neo (Ср, 24 Сен 2025 13:53:07)

0

342

Хамелион написал(а):

у Администраторов форум виден в цветном варианте(ники,названия форумов,книпки прокрутки и прочее)- а у простых пользователей форум отображается таким, каким он был до внесения изменении.

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

0

343

Здравствуйте.
Можно сделать, чтобы в этом скрипте при нажатии окошко тем отображалось возле правого угла кнопки, а не на определённом расстоянии от форумов?

Код:
<!-- Первые N тем в описании форума (новая версия) -->
<style>
.topicslist {
  position: absolute;
  margin-left: 100px;
  background-color: #faf1ed;
  border: 1px solid rgba(0, 0, 0, .35);
  margin-top: 3px;
  padding: 10px;
  box-shadow: 0 4px 4px -2px rgba(0, 0, 0, .35);
  border-radius: 3px;
  max-width: 90vw;
  z-index: 110;
}
.topicslist .sticky a {
  font-weight: bold;
  color: #f00;  /* Цвет для выделенных тем */
}
.topicslist .closed a {
  color: #a9a9a9;  /* Цвет для закрытых тем */
}
.topicslist .load {
  animation: slow-load-blink 2s ease-in-out infinite;
} 
.clickt {
  cursor: pointer;
  user-select: none;
}
.clickt img {
  border: 0;
  line-height: 1;
  max-height: 16px;
  max-width: 16px;
  vertical-align: middle;
}
@keyframes slow-load-blink{0%,100%{opacity:1}50%{opacity:.3}}
</style>
<script>
window.firstNtopics = {
    // Настройки скрипта
    count: 18,            // Максимальное количество выводимых тем форума
    touchDevice: 1,      // 1- включить принудительно вариант показа блока click для сенсорных устройств , 0 - выключить
    useSession: 0,       // 1- включить кэширование списка тем на 10 минут, 0 - выключить
    selectAct: 'click',  // Вариант показа блока: 'click' (нажатие по значку рядом с названием темы) или 'hover' (наведение курсора на название темы) 
    // Шаблон для действия click
    templateClick: ' <span class="clickt" title="Заглянуть внутрь"><img src="https://forumstatic.ru/files/001c/36/f3/86140.png" alt="Список тем"></span>',
};
</script>
<script type="module" src="https://forumstatic.ru/files/001c/3a/d4/90907.js"></script>

0

344

<3
Найдите в скрипте строчку:

Код:
margin-left: 100px;

и поменяйте на 148
будет так:
https://upforme.ru/uploads/0000/14/1c/32894/t121653.jpg

у Вас стоит запрет на пкм, если что то просите, то снимайте его.

Я бы сделал вообще вот так:
https://upforme.ru/uploads/0000/14/1c/32894/t695277.jpg

Отредактировано ACT3255 (Пт, 26 Сен 2025 18:46:50)

0

345

ACT3255 написал(а):

и поменяйте на 148

Это бестолку, у меня невидимые форумы другой длины по описанию и с разным количеством тем - всё это выглядит по-разному криво, я же написала: чтобы НЕ зависело от отступа от начала форумов, а было именно из нижнего угла КНОПКИ...  :(
(я эту строчку сама написала, пробовала всякие значения и знаю, о чём говорю - не то это всё, нужно как прошу)

Пс: Сам скрипт я скинула, зачем мне извечно убирать запрет копирования у себя на форуме, если его можно просто пофиксить как надо и на тестовом проверить?..

Отредактировано <3 (Сб, 27 Сен 2025 01:31:58)

0

346

<3
Через стили сложнее такое сделать, поскольку позиционирование идёт от внутреннего края элемента .tclcon
Чтобы сделать позиционирование, зависящее от положения кнопки, необходимо переписывать логику появления блока. Все прочие методы смещения не будут брать в расчет положение кнопки.

+1

347

Alex_63 написал(а):

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

Благодарю. Действительно,я ставил все коды в тестовые формы. Переместил,теперь всё отображается!

0

348

Reysler
Это невозможно? Хотя ладно, не критично уже.

Отредактировано <3 (Сб, 27 Сен 2025 15:17:45)

0

349

Кто-то может быстро помочь с вопросом, какую строчку и куда добавить, чтобы данный фейерверк показывался только на главной странице?

Код:
<script type="text/javascript">//<![CDATA[ function write_fire(e){var t,n,r;stars[e+"r"]=createDiv("|",12);boddie.appendChild(stars[e+"r"]);for(t=bits*e;t<bits+bits*e;t++){stars[t]=createDiv("*",13);boddie.appendChild(stars[t])}}function createDiv(e,t){var n=document.createElement("div");n.style.font=t+"px monospace";n.style.position="absolute";n.style.backgroundColor="transparent";n.appendChild(document.createTextNode(e));return n}function launch(e){colour[e]=Math.floor(Math.random()*colours.length);Xpos[e+"r"]=swide*.5;Ypos[e+"r"]=shigh-5;bangheight[e]=Math.round((.5+Math.random())*shigh*.4);dX[e+"r"]=(Math.random()-.5)*swide/bangheight[e];if(dX[e+"r"]>1.25)stars[e+"r"].firstChild.nodeValue="/";else if(dX[e+"r"]<-1.25)stars[e+"r"].firstChild.nodeValue="\\";else stars[e+"r"].firstChild.nodeValue="|";stars[e+"r"].style.color=colours[colour[e]]}function bang(e){var t,n,r=0;for(t=bits*e;t<bits+bits*e;t++){n=stars[t].style;n.left=Xpos[t]+"px";n.top=Ypos[t]+"px";if(decay[t])decay[t]--;else r++;if(decay[t]==15)n.fontSize="7px";else if(decay[t]==7)n.fontSize="2px";else if(decay[t]==1)n.visibility="hidden";Xpos[t]+=dX[t];Ypos[t]+=dY[t]+=1.25/intensity[e]}if(r!=bits)setTimeout("bang("+e+")",speed)}function stepthrough(e){var t,n,r;var i=Xpos[e+"r"];var s=Ypos[e+"r"];Xpos[e+"r"]+=dX[e+"r"];Ypos[e+"r"]-=4;if(Ypos[e+"r"]<bangheight[e]){n=Math.floor(Math.random()*3*colours.length);intensity[e]=5+Math.random()*4;for(t=e*bits;t<bits+bits*e;t++){Xpos[t]=Xpos[e+"r"];Ypos[t]=Ypos[e+"r"];dY[t]=(Math.random()-.5)*intensity[e];dX[t]=(Math.random()-.5)*(intensity[e]-Math.abs(dY[t]))*1.25;decay[t]=16+Math.floor(Math.random()*16);r=stars[t];if(n<colours.length)r.style.color=colours[t%2?colour[e]:n];else if(n<2*colours.length)r.style.color=colours[colour[e]];else r.style.color=colours[t%colours.length];r.style.fontSize="13px";r.style.visibility="visible"}bang(e);launch(e)}stars[e+"r"].style.left=i+"px";stars[e+"r"].style.top=s+"px"}function set_width(){var e=999999;var t=999999;if(document.documentElement&&document.documentElement.clientWidth){if(document.documentElement.clientWidth>0)e=document.documentElement.clientWidth;if(document.documentElement.clientHeight>0)t=document.documentElement.clientHeight}if(typeof self.innerWidth!="undefined"&&self.innerWidth){if(self.innerWidth>0&&self.innerWidth<e)e=self.innerWidth;if(self.innerHeight>0&&self.innerHeight<t)t=self.innerHeight}if(document.body.clientWidth){if(document.body.clientWidth>0&&document.body.clientWidth<e)e=document.body.clientWidth;if(document.body.clientHeight>0&&document.body.clientHeight<t)t=document.body.clientHeight}if(e==999999||t==999999){e=800;t=600}swide=e;shigh=t}var bits=80;var speed=33;var bangs=5;var colours=new Array("#03f","#f03","#0e0","#93f","#0cf","#f93","#f0c");var bangheight=new Array;var intensity=new Array;var colour=new Array;var Xpos=new Array;var Ypos=new Array;var dX=new Array;var dY=new Array;var stars=new Array;var decay=new Array;var swide=800;var shigh=600;var boddie;window.onload=function(){if(document.getElementById){var e;boddie=document.createElement("div");boddie.style.position="fixed";boddie.style.top="0px";boddie.style.left="0px";boddie.style.overflow="visible";boddie.style.width="1px";boddie.style.height="1px";boddie.style.backgroundColor="transparent";document.body.appendChild(boddie);set_width();for(e=0;e<bangs;e++){write_fire(e);launch(e);setInterval("stepthrough("+e+")",speed)}}};window.onresize=set_width//]]></script>

(именно строчку покажите красным и куда, так как у меня этот код переделанный стоит - я только добавлю нужное)

0

350

<3 написал(а):

чтобы данный фейерверк показывался только на главной странице

Попробуйте поставить данный скрипт в "Объявления", там как раз есть выбор - показывать нечто только на Главной или показывать оное на всех страницах. Может, "прокатит". Ведь "попытка - не пытка".

+1

351

<3 написал(а):

Здравствуйте.
Можно сделать, чтобы в этом скрипте при нажатии окошко тем отображалось возле правого угла кнопки, а не на определённом расстоянии от форумов?

Здравствуйте.

https://upforme.ru/uploads/0000/14/1c/38891/t69605.webp

Отредактировано Merlin777 (Вс, 28 Сен 2025 02:08:18)

+1

352

<3 написал(а):

добавить, чтобы данный фейерверк показывался только на главной странице?

Вместо него добавьте скрипт:

Показать код
Код:
<script type="text/javascript">
//<![CDATA[
function write_fire(e){
    var t,n,r;
    stars[e+"r"]=createDiv("|",12);
    boddie.appendChild(stars[e+"r"]);
    for(t=bits*e;t<bits+bits*e;t++){
        stars[t]=createDiv("*",13);
        boddie.appendChild(stars[t])
    }
}
function createDiv(e,t){
    var n=document.createElement("div");
    n.style.font=t+"px monospace";
    n.style.position="absolute";
    n.style.backgroundColor="transparent";
    n.appendChild(document.createTextNode(e));
    return n
}
function launch(e){
    colour[e]=Math.floor(Math.random()*colours.length);
    Xpos[e+"r"]=swide*.5;
    Ypos[e+"r"]=shigh-5;
    bangheight[e]=Math.round((.5+Math.random())*shigh*.4);
    dX[e+"r"]=(Math.random()-.5)*swide/bangheight[e];
    if(dX[e+"r"]>1.25)stars[e+"r"].firstChild.nodeValue="/";
    else if(dX[e+"r"]<-1.25)stars[e+"r"].firstChild.nodeValue="\\";
    else stars[e+"r"].firstChild.nodeValue="|";
    stars[e+"r"].style.color=colours[colour[e]]
}
function bang(e){
    var t,n,r=0;
    for(t=bits*e;t<bits+bits*e;t++){
        n=stars[t].style;
        n.left=Xpos[t]+"px";
        n.top=Ypos[t]+"px";
        if(decay[t])decay[t]--;
        else r++;
        if(decay[t]==15)n.fontSize="7px";
        else if(decay[t]==7)n.fontSize="2px";
        else if(decay[t]==1)n.visibility="hidden";
        Xpos[t]+=dX[t];
        Ypos[t]+=dY[t]+=1.25/intensity[e]
    }
    if(r!=bits)setTimeout("bang("+e+")",speed)
}
function stepthrough(e){
    var t,n,r;
    var i=Xpos[e+"r"];
    var s=Ypos[e+"r"];
    Xpos[e+"r"]+=dX[e+"r"];
    Ypos[e+"r"]-=4;
    if(Ypos[e+"r"]<bangheight[e]){
        n=Math.floor(Math.random()*3*colours.length);
        intensity[e]=5+Math.random()*4;
        for(t=e*bits;t<bits+bits*e;t++){
            Xpos[t]=Xpos[e+"r"];
            Ypos[t]=Ypos[e+"r"];
            dY[t]=(Math.random()-.5)*intensity[e];
            dX[t]=(Math.random()-.5)*(intensity[e]-Math.abs(dY[t]))*1.25;
            decay[t]=16+Math.floor(Math.random()*16);
            r=stars[t];
            if(n<colours.length)r.style.color=colours[t%2?colour[e]:n];
            else if(n<2*colours.length)r.style.color=colours[colour[e]];
            else r.style.color=colours[t%colours.length];
            r.style.fontSize="13px";
            r.style.visibility="visible"
        }
        bang(e);
        launch(e)
    }
    stars[e+"r"].style.left=i+"px";
    stars[e+"r"].style.top=s+"px"
}
function set_width(){
    var e=999999;
    var t=999999;
    if(document.documentElement&&document.documentElement.clientWidth){
        if(document.documentElement.clientWidth>0)e=document.documentElement.clientWidth;
        if(document.documentElement.clientHeight>0)t=document.documentElement.clientHeight
    }
    if(typeof self.innerWidth!="undefined"&&self.innerWidth){
        if(self.innerWidth>0&&self.innerWidth<e)e=self.innerWidth;
        if(self.innerHeight>0&&self.innerHeight<t)t=self.innerHeight
    }
    if(document.body.clientWidth){
        if(document.body.clientWidth>0&&document.body.clientWidth<e)e=document.body.clientWidth;
        if(document.body.clientHeight>0&&document.body.clientHeight<t)t=document.body.clientHeight
    }
    if(e==999999||t==999999){e=800;t=600}
    swide=e;
    shigh=t
}

var bits=80;
var speed=33;
var bangs=5;
var colours=new Array("#03f","#f03","#0e0","#93f","#0cf","#f93","#f0c");
var bangheight=new Array;
var intensity=new Array;
var colour=new Array;
var Xpos=new Array;
var Ypos=new Array;
var dX=new Array;
var dY=new Array;
var stars=new Array;
var decay=new Array;
var swide=800;
var shigh=600;
var boddie;

window.onload=function(){
    // 🔹 Проверяем, что мы на главной странице
    if(window.location.pathname === "/" || window.location.pathname === "/index.php"){
        if(document.getElementById){
            var e;
            boddie=document.createElement("div");
            boddie.style.position="fixed";
            boddie.style.top="0px";
            boddie.style.left="0px";
            boddie.style.overflow="visible";
            boddie.style.width="1px";
            boddie.style.height="1px";
            boddie.style.backgroundColor="transparent";
            document.body.appendChild(boddie);
            set_width();
            for(e=0;e<bangs;e++){
                write_fire(e);
                launch(e);
                setInterval("stepthrough("+e+")",speed);
            }
        }
    }
};

window.onresize=set_width;
//]]>
</script>

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

+2

353

Добрый день
Сегодня  перестал работать счётчик просмотров
Кто знает почему и что делать?

0

354

Марина Аврора 22
Пожалуйста, укажите ссылку на форум с проблемой, а также опишите проблему более подробно, что за счётчик и что с ним не так (желательно с приложением скриншотов).
Задавать вопросы лучше в общей теме: Общие вопросы от новичков (63) #3, данная тема предназначена для тех, кто испытывает проблемы с регистрацией на этом форуме.

+1

355

Добрый день
Форум "Рисунки с натуры"
http://risyiy.mybb.ru
https://upforme.ru/uploads/0000/14/1c/39466/t894838.jpg
ссючетчик просмотров в разделе "Платные услуги" всегда показывал количество просмотров форума за сутки, а сегодня за вчерашний день стоят эти две единицы и все,хотя просмотры были и гораздо больше,чем один за сутки
Это какая-то ошибка или сбой
Прошу помочь в разрешении этой проблемы

0

356

Merlin777 написал(а):

Здравствуйте.

https://upforme.ru/uploads/0000/14/1c/38891/t69605.webp

У вас длина форумов такая или что? Я подробно описала проблему, у меня они разные и отображение идёт от края форумов, а не из угла кнопки. Я попросила при возможности сделать в самом коде выход меню из нижнего правого угла, но не критично в целом.)

Отредактировано <3 (Вс, 28 Сен 2025 12:33:21)

0

357

Марина Аврора 22
Счётчик просмотров обновляется раз в сутки. Реальное количество будет показано завтра. К тому же не совсем понятно, зачем вам это значение так подробно контролировать, оно влияет только на стоимость отключения рекламы (чем больше просмотров - тем выше стоимость).

0

358

<3 написал(а):

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

Я сделал отображение менюшки не под названием форума, а справа :) Что такое "выход из угла", я не понимаю :)

+1

359

Merlin777 написал(а):

Я сделал отображение менюшки не под названием форума, а справа

А, я поняла, но как это сделать?  :D Мне было нужно, чтобы окошко с темами выступало от края самой кнопки при нажатии.) Так как названия форумов разной длины и одинаковый отступ от края самих форумов выглядит криво...
Вот для наглядности:
https://upforme.ru/uploads/0000/14/1c/38357/782231.png
(и при разных названиях по длине получается, что где-то меню выпадает у кнопки, а где-то перегораживает половину картинки и текста, поэтому я вообще убрала этот отступ)

Отредактировано <3 (Вс, 28 Сен 2025 12:38:25)

0

360

<3 написал(а):

я поняла, а как это сделать?

Попробуйте вот это:

Показать код
Код:
<script type="module">
/* ========================================
   🎨 CSS с регулируемыми параметрами
======================================== */
const style = document.createElement('style');
style.textContent = `
:root {
  --topiclist-count: 10;             
  --topiclist-session: 1;            
  --topiclist-touch-device: 0;       
  --topiclist-select-action: click;  
  --topiclist-template-click: "<img src='https://forumstatic.ru/files/001c/36/f3/86140.png' alt='Список тем' style='width:16px;height:16px;vertical-align:middle'>";  
}

.topicslist {
  position: absolute;
  background-color: #faf1ed;
  border: 1px solid rgba(0,0,0,.35);
  margin-top: 3px;
  padding: 10px;
  box-shadow: 0 4px 4px -2px rgba(0,0,0,.35);
  border-radius: 3px;
  max-width: 90vw;
  z-index: 110;
  opacity: 0;
  transition: opacity 0.2s ease-in-out;
}
.topicslist.show { opacity: 1; }
.topicslist .sticky a { font-weight: bold; color: #f00; }
.topicslist .closed a { color: #a9a9a9; }
.topicslist .load { animation: slow-load-blink 2s ease-in-out infinite; }
.clickt { cursor: pointer; user-select: none; }
.clickt img { border: 0; line-height: 1; max-height: 16px; max-width: 16px; vertical-align: middle; }
@keyframes slow-load-blink{0%,100%{opacity:1}50%{opacity:.3}}
`;
document.head.appendChild(style);

/* ========================================
   ⚙️ Настройки из CSS
======================================== */
function getParams() {
  const root = getComputedStyle(document.documentElement);
  return {
    count: parseInt(root.getPropertyValue('--topiclist-count')) || 10,
    useSession: root.getPropertyValue('--topiclist-session').trim() === '1',
    touchDevice: root.getPropertyValue('--topiclist-touch-device').trim() === '1' || ('ontouchstart' in window || navigator.maxTouchPoints > 0),
    selectAction: root.getPropertyValue('--topiclist-select-action').trim() || 'click',
    templateClick: root.getPropertyValue('--topiclist-template-click').replace(/['"]/g,'') || ' >'
  };
}

/* ========================================
   🌐 Переводы
======================================== */
const lang = document.documentElement.lang === 'ru' ? 'ru' : 'en';
const translations = {
  en: { showTopics:"Show list of topics", loadTopics:"Loading topics...", noTopics:"No topics", errorLoad:"Error loading topics.<br>Refresh page."},
  ru: { showTopics:"Показать список тем", loadTopics:"Загружаю список...", noTopics:"Тем нет", errorLoad:"Ошибка при загрузке.<br>Обновите страницу."}
};

/* ========================================
   🏗 Загрузка и отображение тем
======================================== */
let currentForumId = null;
let closeTimeout = null;

async function loadTopics(container, forumId) {
  const params = getParams();
  const key = `fid${forumId}_storage`;
  const now = Date.now();

  if (params.useSession && sessionStorage.getItem(key)) {
    const cached = JSON.parse(sessionStorage.getItem(key));
    if (now - cached.timestamp < 600000) return renderTopics(container, cached.data);
    sessionStorage.removeItem(key);
  }

  try {
    const res = await fetch(`/api.php?method=topic.get&forum_id=${forumId}&sort_by=last_post&sort_dir=desc&sticky_first=1&limit=${params.count}`);
    const data = await res.json();
    if (data?.response?.length > 0) {
      const topics = data.response.map(t => ({
        subject: t.subject,
        url: `/viewtopic.php?id=${t.id}`,
        class: `tid${t.id}` + (t.sticky ? " sticky" : "") + (t.closed ? " closed" : "")
      }));
      renderTopics(container, topics);
      if (params.useSession) sessionStorage.setItem(key, JSON.stringify({ data: topics, timestamp: now }));
    } else renderMessage(container, translations[lang].noTopics);
  } catch (e) {
    renderMessage(container, translations[lang].errorLoad);
  }
}

function renderTopics(container, topics) {
  const ul = container.querySelector("ul");
  ul.innerHTML = "";
  topics.forEach(t => {
    const li = document.createElement("li");
    li.className = t.class;
    li.innerHTML = `<a href="${t.url}">${t.subject}</a>`;
    ul.appendChild(li);
  });
  container.classList.add('show'); // Плавное появление
}

function renderMessage(container, message) {
  const ul = container.querySelector("ul");
  ul.innerHTML = `<li>${message}</li>`;
  container.classList.add('show'); // Плавное появление
}

/* ========================================
   🎛 Показ блока тем
======================================== */
function showTopics(trigger) {
  const tr = trigger.closest("tr");
  const forumId = tr.id.match(/\d+/)[0];
  if (currentForumId === forumId && tr.querySelector(".topicslist")) return;

  document.querySelectorAll(".topicslist").forEach(el => el.remove());

  const header = tr.querySelector("h3");
  const box = document.createElement("div");
  box.className = "topicslist";
  box.innerHTML = `<ul><li class="load">${translations[lang].loadTopics}</li></ul>`;
  header.insertAdjacentElement("afterend", box);

  positionBox(trigger, box);
  loadTopics(box, forumId);
  currentForumId = forumId;

  if (getParams().selectAction === "hover" && !getParams().touchDevice) resetCloseTimeout(box);
}

function resetCloseTimeout(box) {
  clearTimeout(closeTimeout);
  closeTimeout = setTimeout(() => {
    box.remove();
    currentForumId = null;
  }, 2000);
}

/* ========================================
   📌 Позиционирование блока справа
======================================== */
function positionBox(button, box) {
  const rect = button.getBoundingClientRect();
  const scrollTop = window.scrollY || document.documentElement.scrollTop;
  const scrollLeft = window.scrollX || document.documentElement.scrollLeft;

  box.style.position = 'absolute';
  box.style.left = `${rect.right + scrollLeft + 5}px`; // справа с отступом
  box.style.top = `${rect.top + scrollTop}px`;          // по верхнему краю кнопки

  const maxRight = window.innerWidth - 10;
  if (rect.right + 5 + box.offsetWidth > maxRight) {
    box.style.left = `${maxRight - box.offsetWidth}px`;
  }
}

/* ========================================
   🚀 Инициализация кнопок и слушателей
======================================== */
function initListeners() {
  document.querySelectorAll(".tclcon h3 a").forEach(a => {
    const btn = document.createElement("span");
    btn.className = "clickt";
    btn.title = translations[lang].showTopics;
    btn.innerHTML = getParams().templateClick; // ← картинка вместо стрелки
    a.insertAdjacentElement("afterend", btn);

    btn.addEventListener("click", e => {
      e.stopPropagation();
      const row = btn.closest("tr");
      const forumId = row.id.match(/\d+/)[0];
      const box = row.querySelector(".topicslist");

      if (currentForumId === forumId && box) { box.remove(); currentForumId = null; }
      else showTopics(btn);
    });
  });

  document.addEventListener("click", e => {
    if (!e.target.closest(".topicslist") && !e.target.closest(".clickt")) {
      document.querySelectorAll(".topicslist").forEach(el => el.remove());
      currentForumId = null;
    }
  });
}

document.addEventListener("DOMContentLoaded", initListeners);
</script>

Это я сделал из скрипта уважаемого господина Reysler. У него код выглядит более компактно за счёт вынесения разной логики по разным внешним файлам которые подгружаются, это удобно и и это считается хорошим тоном в программировании, и браузер может это быстрее загружать (теоретически). Но "большой кусок кода" тоже  работает  :)
(мне просто сейчас лень разносить всё по внешним файлам, сорри  :) )

0


Вы здесь » Единый форум поддержки » Форум для новичков » Общие вопросы от новичков (63) #3