Как сделать кнопку показать еще js
Перейти к содержимому

Как сделать кнопку показать еще js

  • автор:

Как реализовать кнопку «Показать ещё»?

Здравствуйте! Заранее прошу не кидаться тапками, пожалуйста, я нуб) У меня есть кнопка «Показать ещё», которая выводит дополнительные 3 строки из таблицы. Всё работает, но мне не нравится что при нажатии кнопки страница перезагружается. Я не знаю как это реализовать через JS(долго пытаюсь найти инфу в интернете — не выходит). Помогите сделать красиво, пожалуйста. Злюки — проигнорируйте вопрос пж, мне итак негатива в жизни хватает.

function getFriendsList() < $link = mysqli_connect("localhost", "root", "root", "mb"); if(!$link)< printf("База не подключена"); exit(); >$sql_res = mysqli_query($link, 'SELECT COUNT(*) FROM reviews'); if($_SESSION["ttr"] == 0) < $_SESSION["ttr"] = 3; >if(isset($_POST["submit2"])) < $_SESSION["ttr"] = $_SESSION["ttr"] + 3; >$sql = 'SELECT * FROM reviews ORDER BY id DESC LIMIT '.$_SESSION["ttr"].''; $sql_res = mysqli_query($link, $sql); echo '

Последние отзывы

'; while($row = mysqli_fetch_assoc($sql_res)) < $ret = '

'.$row['name'].'

'.$row['comm']. '

'; echo $ret; > > getFriendsList(); echo '

';
  • Вопрос задан более года назад
  • 325 просмотров

Курсы javascript

Имеется наипростейший див контента. В этот див помещаются обновления, статьи, новости. Хочу сделать так, чтобы показывалось определённое количество новостей или чтобы див оставался определённой высоты, а внизу блока была кнопка «Показать ещё», как это реализовано в большинстве сайтов. Подскажите с чего начать, какие методы использовать.

03.07.2014, 19:11
Регистрация: 16.03.2010
Сообщений: 1,618
С основ, очевидно. Там же логика элементарная: нажал кнопку, отправил запрос за верской, вставил её.
03.07.2014, 19:12
Интересующийся
Регистрация: 24.02.2014
Сообщений: 20
ничего не дало. с основ чего JavaS html php ?
Последний раз редактировалось Alban, 03.07.2014 в 19:41 .
03.07.2014, 19:56
Регистрация: 16.03.2010
Сообщений: 1,618
Это говорит только об одном: надо изучать основы.
Как вариант, начать с этого.
03.07.2014, 20:14
Интересующийся
Регистрация: 24.02.2014
Сообщений: 20
лет на десять всё это. а методику опишите. что там надо делать первое второе третье.
03.07.2014, 20:23
Регистрация: 16.03.2010
Сообщений: 1,618

Получается, я десять лет изучал всё это, чтобы за спасибо методики писать? Я уже написал «первое второе третье»:

03.07.2014, 21:55
Интересующийся
Регистрация: 24.02.2014
Сообщений: 20

вы бы могли сказать, что для этого требуется вызов какой-либо функции, или может надо установить плагин, как это требуют во всяких «инструкциях», или может что-либо ещё. я ж не прошу писать диссертацию по этой теме.
а «нажал кнопку», которую сперва надо создать, «вставить её» что вставить? кнопку? не совсем понятно мне. мне нужна подсказка на которую можно опереться и дальше идти.

Последний раз редактировалось Alban, 03.07.2014 в 22:05 .
03.07.2014, 23:12
Регистрация: 16.03.2010
Сообщений: 1,618

Вёрстку, конечно. Короче, общий принцип с jQuery: есть урл, через который ты запрашиваешь следующую партию новостей. Например, site.com/getNews?id=1234. В параметре запроса передаешь какой-нибудь id’шник. Например, id первой новости из тех, которые собираешься получить. Ну либо как-нибудь по-другому. По клику на кнопку делаешь запрос. Ответ, допустим будет в json-формате с новым идентификатором для следующего запроса и, собственно, с самой версткой новостей. И эту верстку ты запихиваешь в контента. Тип того:

  

04.07.2014, 07:17
Интересующийся
Регистрация: 24.02.2014
Сообщений: 20
Вот, отлично, спасибо, принцип понятен, с остальным разберусь.
04.07.2014, 10:58
Регистрация: 29.11.2011
Сообщений: 3,924
на основы можно опереться

__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

Кнопка «Показать еще»

Несколько примеров, как сделать AJAX подгрузку записей из базы данных кликом на кнопку «Показать еще».

Первый вариант: отдельный AJAX-обработчик

В тело страницы помещается PHP-скрипт, который выводит только первые три записи из таблицы `prods` и кнопку «Показать еще».

prepare("SELECT * FROM `prods` LIMIT 3"); $sth->execute(); $items = $sth->fetchAll(PDO::FETCH_ASSOC); // Кол-во страниц $sth = $dbh->prepare("SELECT COUNT(`id`) FROM `prods`"); $sth->execute(); $total = $sth->fetch(PDO::FETCH_COLUMN); $amt = ceil($total / 3); ?> 
Показать еще

При клике на кнопку отправляется AJAX-запрос на скрипт ajax.php с GET-параметром page=2 (при следующим клике – page=3 и т.д.), скрипт возвращает следующие три записи, далее они вставляются в конец списка товаров методом jquery append() . Когда все записи показаны, кнопка скрывается.

Код ajax.php

prepare("SELECT * FROM `prods` LIMIT , "); $sth->execute(); $items = $sth->fetchAll(PDO::FETCH_ASSOC); foreach ($items as $row) < ?>
CSS-стили:
/* Кнопка */ .showmore-bottom < text-align: center; >.showmore-bottom a < padding: 20px 30px; display: inline-block; border: 1px solid #3f2aff; border-radius: 100px; color: #fff; font-weight: 500; font-size: 16px; text-align: center; vertical-align: top; background-color: #3f2aff; text-decoration: none; margin-bottom: 20px; >/* Вывод товаров */ .prod-list < overflow: hidden; margin: 0 0 20px 0; >.prod-item < width: 174px; height: 230px; float: left; border: 1px solid #ddd; padding: 20px; margin: 0 20px 20px 0; text-align: center; border-radius: 6px; >.prod-item-img < width: 100%; >.prod-item-name < font-size: 13px; line-height: 16px; >.prod-list .prod-item:nth-child(3n)
Пример в действии:

Второй вариант: обработчик «Пагинатор»

Во втором примере, AJAX-запрос отправляется сам на себя. Скрипт выводит записи в зависимости от значения переменной $_GET[‘page’] , которое содержит номер страницы (скрипт основан на пагинаторе).

Стоит отметить, что данный пример избавляет от дублирования кода, но работает медленнее, т.к. через AJAX идет полный HTML-код страницы.

prepare("SELECT SQL_CALC_FOUND_ROWS * FROM `prods` LIMIT , "); $sth->execute(); $items = $sth->fetchAll(PDO::FETCH_ASSOC); // Узнаем сколько всего записей в БД $sth = $dbh->prepare("SELECT FOUND_ROWS()"); $sth->execute(); $total = $sth->fetch(PDO::FETCH_COLUMN); $amt = ceil($total / $limit); ?> 
Показать еще
Результат:

18.12.2020, обновлено 05.04.2022
Предыдущая запись Отправка sms через «SMS Aero» в PHP
Следующая запись Подгрузка контента при прокрутке (бесконечная лента)

Комментарии 2

26 января 2021 в 21:13

Здравствуйте!Очень благодарен за Ваш пост!Я использую второй вариант Вашего кода. Архитектура моего приложения — MVC, работа с базой данных через ORM RedBeans. Кнопка Показать еще пропадает при полном выводе данных из таблицы.
Но есть вопрос: подгруженные данные приклике не выводятся в виде. Т.е. они выводятся, курсор их видит и при клике на их место происходит переход по их ссылке (в данном случае на страницу карточки товара).Я не сильно какой кодер. Всю голову сломал, но так и не понял причину.Запрос к DB — $products = \R::find(‘product’, «LIMIT $start, $perpage»);Если нетрудно поделитесь соображениями по этому поводу.Спасибо!Виталий.

11 мая 2021 в 10:32
Почему то не работает пример, бесконечная лента прекрасно работает.

Авторизуйтесь, чтобы добавить комментарий.

Другие публикации

Примеры использования PDO MySQL

В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и.

Примеры отправки AJAX JQuery

AJAX позволяет отправить и получить данные без перезагрузки страницы. Например, делать проверку форм, подгружать контент и т.д. А функции JQuery значительно упрощают работу.

После отправки формы сохранить позицию скролла

В больших формах, с несколькими кнопками «Отправить/сохранить» есть одна проблема – после ее отправки браузер обновит.

Кнопка «Показать ещё» на чистом JavaScript

Кнопка «Показать ещё» обычно применяется, когда у нас очень много контента и его нужно вывести не весь сразу, а постепенно (небольшими порциями). Для этого весь контент разбивается на страницы.

Разбивка контента на страницы, подгрузка страниц выполняется с помощью нажатия на кнопку «Показать ещё»

При этом сначала отображается только первая страница (на этом примере это две карточки) и кнопка «Загрузить ещё» . Если пользователь хочет посмотреть ещё записи ( следующую страницу ), то он просто нажимает на кнопку .

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

Шаг 1. Написание backend-кода на PHP

Перед тем как перейти к разработке frontend-кода, необходимо сначала написать серверный сценарий, который будет обрабатывать наш запрос и возвращать ответ в формате JSON. Можно конечно и в формате HTML, но это уже будет очень простой случай, который в рамках этой статьи рассматривать не будем.

Серверный сценарий напишем, например, на PHP. Кроме этого, не забываем, чтобы он работал необходимо установить веб-сервер с поддержкой PHP на локальную машину.

Для написания кода на PHP создадим файл, например, с именем more.php в корне сайта.

Создание PHP-файла в текстовом редакторе Visual Studio Code

Данные в этом примере будем получать для простоты из подготовленного массива, а не из базы данных:

$items = [ [ 'title' => '. ', 'img' => '1.png', ], [ 'title' => '. ', 'img' => '2.png', ], // . ];

Количество записей на одной странице будем определять с помощью константы LIMIT :

const LIMIT = 2;

Сейчас у нас одна страница будет состоять из 2 записей. Всего записей (элементов в массиве) узнаем с помощью функции count :

$total = count($articles);

Номер страницы ( page ) будем передавать серверу через POST. В скрипте на PHP для получения этого значения воспользуемся глобальной переменной $_POST[‘page’] :

$page = (int)($_POST['page'] ?? 1);

Дополнительно на странице клиента будем отображать кроме самих данных ещё их оставшееся количество. Вычисление оставшегося количества записей будем выполнять следующим образом:

$remain = $total - $page * LIMIT;

Сами отдаваемые данные будем получать как срез массива с помощью array_slice :

$data = array_slice($items, ($page - 1) * LIMIT, LIMIT);

Кроме этого, клиенту будем передавать шаблон, который затем с помощью JavaScript будем использовать для генерации HTML-кода карточки:

$template =  {{title}}
{{title}}
HTML;

Возвращать ответ будем в формате JSON. Для этого перед отправкой данных установим соответствующий заголовок:

header('Content-Type: application/json');

Отправлять клиенту будем следующий массив данных, который используя функцию json_encode переведём в JSON:

echo json_encode([ 'total' => $total, 'page' => $page, 'remain' => $remain, 'template' => $template, 'data' => $data, ]);

Теперь давайте проверим, что выведет полученный PHP-файл, сохранённый в корне сайта под именем more.php . Для этого откроем браузер и в адресной строке введем путь к нему (в данном случае: http://localhost/more.php ):

Ответ

В окне браузера мы видим JSON-код, то есть результат выполнения файла more.php на сервере.

Шаг 2. Создание HTML-кода

Теперь, после того как серверный код работает, создадим HTML-страничку index.html :

Создание HTML-страницы в текстовом редакторе Visual Studio Code

Все элементы, связанные с кнопкой «Показать ещё» обернём в .cards :

Начнем написание HTML-кода с разметки контейнера для карточек. Добавлять карточки в контейнер будем с помощью JavaScript, поэтому этот элемент у нас будет пустым:

Кроме кнопки у нас ёще будет блок .cards-progress , в котором расположим прогресс-бар и текстовую информацию о количестве показанных карточек:

Ну и сама кнопка:

 

У кнопки имеется атрибут data-page , который будем использования для хранения количества показанных страниц.

Кнопка у нас имеет svg-иконку, которую создали посредством . При этом сама она определена в с использованием , который вставили сразу после открывающего тега :

Шаг 3. Стилизация карточек и кнопки

Создавать CSS-код будем в отдельном файле main.css, который расположим рядом с index.html . Подключение main.css к index.html выполним с помощью :

Вёрстку контейнера ( .card-container ), в который мы будем добавлять карточки, выполним через флексы:

/* Контейнер для карточек */ .card-container { display: flex; flex-wrap: wrap; gap: 1rem; }

Расстояние между карточками зададим с помощью CSS-свойство gap .

Стилизация карточки товара

Карточка товара ( .card ) у нас будет состоять из изображения ( .card-img ) и заголовка ( .card-title ). Для оформления самой карточки и её элементов будем использовать следующие стили:

/* Карточка товара */ .card { flex: 1 0 150px; border-radius: 0.5rem; box-shadow: 0 0.125rem 0.25rem rgb(0 0 0 / 8%); text-align: center; padding: 1rem; } .card-img { display: block; max-width: 100%; height: auto; } 

Стили для кнопки:

.btn-more { display: flex; color: #212529; font-size: 1rem; line-height: 1.5; background-color: #f5f5f5; font-family: inherit; border-radius: 0.25rem; border: 0 solid #f5f5f5; cursor: pointer; align-items: center; transition: filter .15s ease-in-out; padding: 0.375rem 0.75rem; gap: 0.25rem; margin-left: auto; margin-right: auto; } .btn-more:disabled { opacity: .65; color: #212529; background-color: #eee; } .icon { display: block; width: 1rem; height: 1rem; fill: currentcolor; } .btn-more-loading .icon { animation: 0.75s linear infinite rotate; } @keyframes rotate { to { transform: rotate(360deg); } }

При нажатии на кнопку она будет переводиться в неактивное состояние ( disabled ). Кроме этого, к ней будет добавляться с помощью JavaScript класс btn-more-loading , который будет активировать CSS-анимацию, и иконка в кнопке будет непрерывно вращаться.

Стили для кнопки «Показать ещё» и прогресс-бара

Стилизацию прогресс-бара и дополнительной информации, расположенного рядом с ним, выполним следующим образом:

.cards-progress { max-width: 150px; align-items: center; display: flex; gap: 0.5rem; margin: 1rem auto 0.5rem; font-size: 0.75rem; color: rgba(33, 37, 41, 0.75); } .progress { flex: 1 0 100px; display: flex; height: 0.25rem; overflow: hidden; background-color: #e9ecef; } .progress-bar { background-color: #3f51b5; transition: width 0.3s ease; }

Прогресс-бар – это очень полезный элемент, который позволяет увидеть пользователям количество показанных и оставшихся карточек. Кроме этого, с помощью него они могут оценить, насколько большим является список и сколько времени им потребуется для просмотра всех элементов.

Вся разметка, связанная с кнопкой «Показать ещё» у нас находятся в корневом элементе .card . Его стилизацию в рамках этого примера выполним так:

.cards { max-width: 400px; margin: 1rem auto; }

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

Для скрытия элементов мы будем использовать класс d-none :

/* Класс для скрытия элемента */ .d-none { display: none; }

В этом примере у нас он используется для скрытия кнопки «Показать ещё», когда все карточки уже отображены и загружать уже больше нечего. Добавляется он в этом случае к элементу с помощью JavaScript. Кроме этого, d-none используется ещё в HTML-коде для скрытия .

Шаг 4. Добавление функциональности к кнопке с помощью JavaScript

Всю функциональность, связанную с кнопкой на странице, будем выполнять с помощью JavaScript, который напишем без использования каких-либо библиотек. Для этого создадим файл main.js и подключим его к нашей HTML-странице:

Начнём создания JavaScript с выборки кнопки:

JavaScript

const btnMoreElem = document.querySelector('.btn-more');

Теперь напишем асинхронную функцию, которая будет выполняться при нажатии на кнопку, то есть она у нас будет использоваться в качестве обработчика события click :

JavaScript

const loadMoreCards = async (e) => { try { // получим элемент, на котором произошло событие, в данном случае кнопку const targetElem = e.target; // получим корневой элемент, в котором располагаются вся разметка, связанная с карточками и кнопкой const cardsElem = targetElem.closest('.cards'); // сделаем кнопку неактивной targetElem.disabled = true; // добавим к кнопке класс btn-more-loading, который добавляет анимацию вращения для иконки targetElem.classList.add('btn-more-loading'); // создадим новый объект класса FormData const body = new FormData(); // добавим в body номер текущей страницы body.append('page', targetElem.dataset.page); // получим ответ от сервера const response = await fetch('more.php', {method: 'POST', body}); // выполняем действия указанные в if, если ответ от сервера успешный if (response.ok) { // читаем ответ от сервера как JSON и преобразовываем его в объект JavaScript const result = await response.json(); // выполняем код анонимной функции, переданной в качестве аргумента методу setTimeout, через 500мс window.setTimeout(() => { // скрываем кнопку загрузки, если все карточки показаны result.remain { let html = result.template; Object.keys(item).forEach((field) => { html = html.replaceAll(`{{${field}}}`, item[field]); }) return html; }); // устанавливаем в качестве содержимого элемента .cards-count количество показанных карточек cardsElem.querySelector('.cards-count').textContent = result.total - result.remain; // устанавливаем в качестве содержимого элемента .cards-total общее количество карточек cardsElem.querySelector('.cards-total').textContent = result.total; // обновляем ширину прогресс-бара, отвечающего за количество показанных карточек cardsElem.querySelector('.progress-bar').style.width = `${(result.total - result.remain) / result.total * 100}%`; // вставляем карточки в контейнер document.querySelector('.card-container').insertAdjacentHTML('beforeend', cards.join('')); // удаляем анимацию иконки, с помощью удаления класса btn-more-loading targetElem.classList.remove('btn-more-loading'); // делаем кнопку доступной для нажатия targetElem.disabled = false; }, 500); } } catch (error) { console.error(error); } }

Этот код выполняет в следующем порядке вот эти действия:

Теперь созданную функцию loadMoreCards укажем в качестве обработчика события click :

btnMoreElem.addEventListener('click', loadMoreCards);

Формирование первой страницы будем выполнять на клиенте с помощью JavaScript. Для этого просто программным способом кликнем по кнопке «Загрузить ещё»:

btnMoreElem.click();

Скриншот, на котором приведён ответ сервера при нажатии на кнопку:

Ответ сервера, который мы получаем, когда нажимаем на кнопку «Показать ещё»

Заключение

Закончили! Мы успешно создали кнопку «Показать еще» на веб-странице:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *