Здравствуйте! Заранее прошу не кидаться тапками, пожалуйста, я нуб) У меня есть кнопка «Показать ещё», которая выводит дополнительные 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 '
Имеется наипростейший див контента. В этот див помещаются обновления, статьи, новости. Хочу сделать так, чтобы показывалось определённое количество новостей или чтобы див оставался определённой высоты, а внизу блока была кнопка «Показать ещё», как это реализовано в большинстве сайтов. Подскажите с чего начать, какие методы использовать.
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
Получается, я десять лет изучал всё это, чтобы за спасибо методики писать? Я уже написал «первое второе третье»:
вы бы могли сказать, что для этого требуется вызов какой-либо функции, или может надо установить плагин, как это требуют во всяких «инструкциях», или может что-либо ещё. я ж не прошу писать диссертацию по этой теме. а «нажал кнопку», которую сперва надо создать, «вставить её» что вставить? кнопку? не совсем понятно мне. мне нужна подсказка на которую можно опереться и дальше идти.
Последний раз редактировалось 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` и кнопку «Показать еще».
При клике на кнопку отправляется 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) < ?>
Во втором примере, 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
Почему то не работает пример, бесконечная лента прекрасно работает.
Авторизуйтесь, чтобы добавить комментарий.
Другие публикации
В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и.
AJAX позволяет отправить и получить данные без перезагрузки страницы. Например, делать проверку форм, подгружать контент и т.д. А функции JQuery значительно упрощают работу.
В больших формах, с несколькими кнопками «Отправить/сохранить» есть одна проблема – после ее отправки браузер обновит.
Кнопка «Показать ещё» на чистом JavaScript
Кнопка «Показать ещё» обычно применяется, когда у нас очень много контента и его нужно вывести не весь сразу, а постепенно (небольшими порциями). Для этого весь контент разбивается на страницы.
При этом сначала отображается только первая страница (на этом примере это две карточки) и кнопка «Загрузить ещё» . Если пользователь хочет посмотреть ещё записи ( следующую страницу ), то он просто нажимает на кнопку .
Это похоже на постраничную навигацию, но только предыдущие записи остаются на месте, а новые добавляются после них . При этом обычно это на сайте реализуется с использованием AJAX, то есть без перезагрузки страницы.
Шаг 1. Написание backend-кода на PHP
Перед тем как перейти к разработке frontend-кода, необходимо сначала написать серверный сценарий, который будет обрабатывать наш запрос и возвращать ответ в формате JSON. Можно конечно и в формате HTML, но это уже будет очень простой случай, который в рамках этой статьи рассматривать не будем.
Серверный сценарий напишем, например, на PHP. Кроме этого, не забываем, чтобы он работал необходимо установить веб-сервер с поддержкой PHP на локальную машину.
Для написания кода на PHP создадим файл, например, с именем more.php в корне сайта.
Данные в этом примере будем получать для простоты из подготовленного массива, а не из базы данных:
Количество записей на одной странице будем определять с помощью константы 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 :
Теперь давайте проверим, что выведет полученный PHP-файл, сохранённый в корне сайта под именем more.php . Для этого откроем браузер и в адресной строке введем путь к нему (в данном случае: http://localhost/more.php ):
В окне браузера мы видим JSON-код, то есть результат выполнения файла more.php на сервере.
Шаг 2. Создание HTML-кода
Теперь, после того как серверный код работает, создадим HTML-страничку index.html :
Все элементы, связанные с кнопкой «Показать ещё» обернём в .cards :
Начнем написание HTML-кода с разметки контейнера для карточек. Добавлять карточки в контейнер будем с помощью JavaScript, поэтому этот элемент у нас будет пустым:
Кроме кнопки у нас ёще будет блок .cards-progress , в котором расположим прогресс-бар и текстовую информацию о количестве показанных карточек:
Ну и сама кнопка:
У кнопки имеется атрибут data-page , который будем использования для хранения количества показанных страниц.
Кнопка у нас имеет svg-иконку, которую создали посредством . При этом сама она определена в с использованием , который вставили сразу после открывающего тега :
Шаг 3. Стилизация карточек и кнопки
Создавать CSS-код будем в отдельном файле main.css, который расположим рядом с index.html . Подключение main.css к index.html выполним с помощью :
Вёрстку контейнера ( .card-container ), в который мы будем добавлять карточки, выполним через флексы:
Расстояние между карточками зададим с помощью CSS-свойство gap .
Карточка товара ( .card ) у нас будет состоять из изображения ( .card-img ) и заголовка ( .card-title ). Для оформления самой карточки и её элементов будем использовать следующие стили:
При нажатии на кнопку она будет переводиться в неактивное состояние ( disabled ). Кроме этого, к ней будет добавляться с помощью JavaScript класс btn-more-loading , который будет активировать CSS-анимацию, и иконка в кнопке будет непрерывно вращаться.
Стилизацию прогресс-бара и дополнительной информации, расположенного рядом с ним, выполним следующим образом:
Прогресс-бар – это очень полезный элемент, который позволяет увидеть пользователям количество показанных и оставшихся карточек. Кроме этого, с помощью него они могут оценить, насколько большим является список и сколько времени им потребуется для просмотра всех элементов.
Вся разметка, связанная с кнопкой «Показать ещё» у нас находятся в корневом элементе .card . Его стилизацию в рамках этого примера выполним так:
.cards { max-width: 400px; margin: 1rem auto; }
То есть ограничим его ширине и выровняем по центру, а также добавим внешние отступы сверху и снизу.
Для скрытия элементов мы будем использовать класс d-none :
/* Класс для скрытия элемента */ .d-none { display: none; }
В этом примере у нас он используется для скрытия кнопки «Показать ещё», когда все карточки уже отображены и загружать уже больше нечего. Добавляется он в этом случае к элементу с помощью JavaScript. Кроме этого, d-none используется ещё в HTML-коде для скрытия .
Шаг 4. Добавление функциональности к кнопке с помощью JavaScript
Всю функциональность, связанную с кнопкой на странице, будем выполнять с помощью JavaScript, который напишем без использования каких-либо библиотек. Для этого создадим файл main.js и подключим его к нашей HTML-странице:
Теперь напишем асинхронную функцию, которая будет выполняться при нажатии на кнопку, то есть она у нас будет использоваться в качестве обработчика события 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); } }
Этот код выполняет в следующем порядке вот эти действия:
переводит кнопку в неактивное состояние, чтобы пользователь не мог выполнить это действие ещё раз пока не завершится текущее;
включает анимацию для иконки, расположенной в кнопке, посредством установки класса btn-more-loading ;
отправляет с помощью fetch на сервер запрос методом POST и передаёт в его теле номер запрашиваемой страницы;
ждёт ответа от сервера в формате JSON;
отключает видимость кнопки «Загрузить ещё», если мы показали все записи;
обновляет значение атрибута data-page у кнопки;
формирует HTML-код карточек, используя полученный шаблон от сервера и данные;
вставляет сформированный HTML-код карточек в контейнер, используя метод insertAdjacentHTML ;
обновляет прогресс-бар и количество показанных карточек;
удаляет класс btn-more-loading , который использовался для включения анимации иконки;
переводит кнопку в активное состояние, то есть делаем её доступной для следующего нажатия;
Теперь созданную функцию loadMoreCards укажем в качестве обработчика события click :