• Как сделать пагинацию на js для нескольких независимых секций на странице?

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

    <div class="wrap_item" data-section="1">
      <h3 class="title_heading">Секция №1</h3>
      <div class="wrap_elements">
        <div class="class_element">Элемент 1</div>
        <div class="class_element">Элемент 2</div>
        <div class="class_element">Элемент 3</div>
        <div class="class_element">Элемент 4</div>
        <div class="class_element">Элемент 5</div>
      </div>
      <div class="pagination"></div>
    </div>
    
    <div class="wrap_item" data-section="2">
      <h3 class="title_heading">Секция №2</h3>
      <div class="wrap_elements">
        <div class="class_element">Элемент A</div>
        <div class="class_element">Элемент B</div>
        <div class="class_element">Элемент C</div>
        <div class="class_element">Элемент D</div>
        <div class="class_element">Элемент E</div>
      </div>
      <div class="pagination"></div>
    </div>
    
    <div class="wrap_item" data-section="3">
      <h3 class="title_heading">Секция №3</h3>
      <div class="wrap_elements">
        <div class="class_element">Элемент α</div>
        <div class="class_element">Элемент β</div>
        <div class="class_element">Элемент γ</div>
        <div class="class_element">Элемент δ</div>
        <div class="class_element">Элемент ε</div>
      </div>
      <div class="pagination"></div>
    </div>


    document.addEventListener('DOMContentLoaded', () => {
    
        const itemsPerPage = 2;
    
        document.querySelectorAll('.wrap_item').forEach((section) => {
          const wrapElements = section.querySelector('.wrap_elements');
          const elements = Array.from(wrapElements.children);
          const paginationContainer = section.querySelector('.pagination');
          const totalPages = Math.ceil(elements.length / itemsPerPage);
    
          function showPage(page) {
            elements.forEach((el, index) => {
              el.style.display =
                index >= (page - 1) * itemsPerPage && index < page * itemsPerPage
                  ? ''
                  : 'none';
            });
          }
    
          function createPagination() {
            paginationContainer.innerHTML = ''; // очистили контейнер пагинации
            for (let i = 1; i <= totalPages; i++) {
              const button = document.createElement('button');
              button.textContent = i;
              button.addEventListener('click', () => {
                showPage(i);
                updateActiveButton(i);
              });
              paginationContainer.appendChild(button);
            }
            updateActiveButton(1); 
          }
    
          function updateActiveButton(activePage) {
            paginationContainer.querySelectorAll('button').forEach((btn, index) => {
              btn.classList.toggle('active', index + 1 === activePage);
            });
          }
    
          showPage(1);
          createPagination();
        });
      });


    .wrap_elements {
        display: flex;
        flex-wrap: wrap;
        gap: 10px;
      }
    
      .class_element {
        padding: 10px;
        border: 1px solid #ccc;
        background: #f5f5f5;
      }
    
      .pagination button {
        margin: 0 5px;
        padding: 5px 10px;
        border: none;
        background: #ddd;
        cursor: pointer;
      }
    
      .pagination button.active {
        background: #ff6f61;
        color: #fff;
      }


    Теперь имеем что? Каждый .wrap_item обрабатывается отдельно, кайф. Все дочерние элементы .class_element собираются в массив, ну красота. Style.display для скрытия/показа элементов в зависимости от текущей страницы.
    Количество кнопок определяется totalPages.
    При клике на кнопку отображаются элементы, соответствующие выбранной странице. Вроде ничего не упустил.
    Ответ написан
    1 комментарий
  • Как запретить на сайте нажатие CTRL+SHIFT+I и F12?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вместо того чтоб страдать подобной <тут должно быть нецензурное слово> лучше сначала напишите что-то реально полезное, а так только сами себе грабли стелите
    Тот же авито сажает вирус в расширения хрома при открытии инструментов разработчика, наверно как и Вы боятся спалить свой говнокод (а у них там действительно беда)
    А еще подумайте вот о чем: что если инструменты разработчика уже открыты к моменту загрузки Вашей страницы? А что если я сижу на маке, где эти сочетания другие (CMD+I)? А что Вы будете делать с расширением которое позволяет блокировать обработку события контекстного меню скриптами в любое время? (У меня такое стоит)
    Ну и напоследок: когда в Вашем коде появится реально что-то полезное, у Вас будут мысли не "каким еще костылем защитить мой код", а "как бы это написать так, чтоб потом выложить в опенсорс не стыдно было, да еще звездочек за это на гитхабе нахватать"
    Ответ написан
    2 комментария
  • Как реализовать подписание оферты на сайте простой электронной подписью?

    hint000
    @hint000
    у админа три руки
    https://ru.wikipedia.org/wiki/Оферта
    Статья 158 Гражданского кодекса Российской Федерации допускает, что согласие на сделку может следовать из поступков стороны, направленных на реализацию сделки (конклюдентные действия), даже если не было явных заявлений о воле принять условия оферты. Например, факт посадки в общественный транспорт свидетельствует о желании ехать и приемлемости описанных условий оказания транспортных услуг (маршрут, цена), что автоматически обязывает пассажира оплатить проезд.


    Но юрист сказал клиенту, что нужно что бы были доказательства о том, что согласились клиенты с офертой.
    Делаем вывод: клиенту уволить юриста погаными тряпками, но мы-то знаем, что другим клиентам другие юристы сказали то же самое, законы не читают даже юристы.
    И посоветовал сделать подпись простой электронной подписью.
    Нажатием кнопки "согласен с условиями" или чекбоксом "согласен с условиями". Без этого нажатия не пускать к оформлению заказа. Это типовая схема.
    Ответ написан
    2 комментария
  • Есть ли в PHP готовый инструмент для получения элемента массива вложенность которого хранится в другом массиве?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Штатных средств нет.
    Неким "стандартом" стал доступ в dot-нотации. Вот одна из реализаций:
    https://github.com/adbario/php-dot-notation
    Ответ написан
    9 комментариев
  • Раздражает ли авторизация тех, кто следит заходит на мой Pet-проект?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    В таких случаях обычно регистрация и авторизация делаются, но где-нибудь пишется, что можно воспользоваться демонстрационным пользователем с логином demo и паролем demo.
    Ответ написан
    Комментировать
  • Почему в FIrefox и Safari файлы стилей переименовываются?

    Lynn
    @Lynn
    nginx, js, css
    У вас в vendor.js скрипт который зачем-то заменяет файлы стилей на блобы.

    document.querySelectorAll('link').forEach((e => t(e)))
    
    function t(e){"text/css"!=e.type&&"stylesheet"!=e.rel||!e.href||new URL(e.href,document.baseURI).origin==location.origin&&fetch(e.getAttribute("href")).then((async t=>{const i=await t.text();let n=Pt.transpileStyleSheet(i,!0);if(n=Pt.transpileStyleSheet(i,!1),n!=i){const t=new Blob([n],{type:"text/css"}),i=URL.createObjectURL(t);e.setAttribute("href",i)}}))}
    Ответ написан
    4 комментария
  • Как организовать пополнение бонусов в пользовательское свойство?

    @koder_1
    Битрикс программист
    Циклом по файлу bonus.csv (обычные функции php работы с файлами)
    берём в очередной строке телефон, по нему берём пользователя (апи Битрикс CUser::GetList)
    и его бонусы (апи Битрикс CSaleUserAccount::GetByID).
    Обновляем бонусы как Вам нужно CSaleUserAccount::UpdateAccount
    Ответ написан
    Комментировать
  • Wordpress выдает такую ошибку, как её решить?

    @maksam07
    А вопрос то в чем?
    PHP сообщает об отсутствии модуля mysqli. Дальше уже обращайтесь за документацией к вашему ПО, чтобы узнать, как его включить/установить

    Некоторые решения:
    https://stackoverflow.com/questions/51624555/mysql...
    https://stackoverflow.com/questions/71702104/how-t...
    https://www.reddit.com/r/PHPhelp/comments/16mtjan/...
    Ответ написан
    Комментировать
  • Как "просканировать" сайт на картинки в директории?

    @alexalexes
    В самом примитивном случае задача будет решаться так (это псевдокод, он пародирует язык программирования, передает лишь идею):
    a = [алфавит 0-9a-zA-Z]
    foreach(i => index_a_0 ... index_a_last )
       foreach( j => index_a_0 ... index_a_last )
          foreach( k => index_a_0 ... index_a_last)
          ...
         {
              filename = a[i] + a[j] + ... a[m] + '.jpg'
              result = [функция получения HTTP заголовков по url, метод HEAD](filename)
              if(result.responseCode = 200) // Если HTTP код 200, то файл существует
              {
                // загружаем файл
              }
              // пишем в лог файл, какие i,j,k...m прошли
         }

    Если у вас пинг будет в пределах 100 мс, то все комбинации процесс в одном потоке обойдет за 2 месяца.
    Ответ написан
    Комментировать
  • На чем пишут современные соц.сети, способные выдержать большой поток людей?

    @bit8
    Большую соц.сеть на 1 языке не создать, в определенныый момент придется часть сервисов переписывать на другие языки, для производительности или фишек каких то
    Ответ написан
    Комментировать
  • Как исправить ошибку Your requirements could not be resolved to an installable set of packages?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    или установить расширение fileinfo в php
    или downgrade до php7

    но правильнее начать с установки актуальной версии laravel, 9я мягко говоря устарела
    Ответ написан
    Комментировать
  • Как добавить класс js?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Используйте всплытие событий. Вешайте обработчик на постоянно присутствующий родительский элемент.
    Ответ написан
    2 комментария
  • Как добавить класс js?

    @metalezhig
    Используй делегирование событий.
    $(document).on("click", ".open", function() { ... })
    Ответ написан
    Комментировать
  • Ошибка при отправке POST запроса на open server?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Проблема скорее всего тут .then(response => console.log(response.json())). И скорее всего в том, что твой сервер по адресу db.json отдаёт вместо json какую-то фигню. Открой вкладку Сеть в инструментах разработчика и посмотри, что тебе от сервера в ответ на твой POST приходит.
    Ответ написан
    7 комментариев
  • Возникает ошибка "Заполните все поля". Все заполнено. Что не так с кодом?

    IvanU7n
    @IvanU7n
    nothing interesting here
    Была бы просто опечатка, разобрался бы сам.

    значит таки мы имеем дело с ничего не умеющей личностью

    мне так стало интересно, что я скачал архив и посмотрел на код, и у меня нахождение опечатки заняло меньше минуты (!)
    но дам возможность реабилитироваться, обратив внимание на строку 150 файла index.php

    ПС. про структуру кода и таблицы промолчу
    Ответ написан
    Комментировать
  • Как сделать анонимный домен в 2024?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Что значит "анонимный"? Домен обычно сам по себе не существует (хотя и может), его обычно привязывают к сайту. И тут уже начинаются варианты, зачем тебе анонимность:
    - ты собираешься развернуть порносайт. Тогда тебе дорога в локации, где порно не запрещено, в Нидерланды например - берешь там хостинг, там же берешь домен.
    - ты собираешься вляпаться в политоту. Тогда тебе дорога в те локации, которые враждебны той локации, которую ты собрался обсерать - берешь там хостинг, и там же берешь домен.
    (как ты собрался оплачивать там хостинг - это другой вопрос)

    Анонимности в Сети не существует. Существует возможность к ней приблизиться, но это дорого и неудобно.
    Ответ написан
    4 комментария
  • Как исправить панель стилей в dev tools?

    yesbro
    @yesbro
    Думаю, помогаю думать
    Смотри свой скрин. Там три точки справа вверху. Там самая верхняя строка где написано "Закрепить сбоку" из иконок выбираешь вариант где панель снизу (третий по счету).
    Ответ написан
    Комментировать
  • Как объединить файлы xlsx/xls в один через phpSpreadSheet?

    @dhesaw Автор вопроса
    Переписал метод мерджа на
    $mergedWorkbook=new Spreadsheet();
                    foreach ($files as $file) {
                        $spreadsheet = IOFactory::load($file);
                        $worksheets = $spreadsheet->getAllSheets();
                        foreach ($worksheets as $worksheet) {
                            if ($mergedWorkbook->sheetNameExists($worksheet->getTitle())) {
                                $worksheet->setTitle($worksheet->getTitle() . rand(1,40));
                            }
                            $mergedWorkbook->addExternalSheet($worksheet);
                        }
                    }
                    $mergedWorkbook->removeSheetByIndex(0);
                    $writer = IOFactory::createWriter($mergedWorkbook, 'Xlsx');
                    $folderName=self::createFolder();
                    $writer->save(
                        "{$_SERVER['DOCUMENT_ROOT']}/upload/tmp/{$folderName}/mergedFilesDoc.xlsx"
                    );


    Но ошибка с некорректным форматированием ячеек все равно осталась, пришлось изменить метод garbageCollect класса Spreadsheet библиотеки phpOffice.
    // other_code before 1399 line
     foreach ($this->getWorksheetIterator() as $sheet) {
                // for all cells
                foreach ($sheet->getCoordinates(false) as $coordinate) {
                    $cell = $sheet->getCell($coordinate);
                    $cell->setXfIndex($map[$cell->getXfIndex()]?$map[$cell->getXfIndex()]:0); // code modification
                }
    
                // for all row dimensions
                foreach ($sheet->getRowDimensions() as $rowDimension) {
                    if ($rowDimension->getXfIndex() !== null) {
                        $rowDimension->setXfIndex($map[$rowDimension->getXfIndex()]?$map[$rowDimension->getXfIndex()]:0); // code modification
                    }
                }
    
                // for all column dimensions
                foreach ($sheet->getColumnDimensions() as $columnDimension) {
                    $columnDimension->setXfIndex($map[$columnDimension->getXfIndex()]?$map[$columnDimension->getXfIndex()]:0); // code modification
                }
    
                // also do garbage collection for all the sheets
                $sheet->garbageCollect();
            }
    // other_code after 1420 line

    Понимаю, что это неправильно, но так файл начал создаваться (как для xls, так и для xlsx) и все стили подтянулись. Ну и не пишет, что файл поврежден.
    Ответ написан
    1 комментарий
  • Как методом POST вывести координаты клика мышкой?

    Zagir-vip
    @Zagir-vip
    Web dev, Game dev, app dev, Разработчик на Python!
    Интересно к чему вы "вешаете" событие addEventListener('mousemove', pos, false);

    Может нужно привязать событие к document?
    document.addEventListener('mousemove', pos, false);
    Ответ написан
    4 комментария