INFINITO SCROLL PAGINACION FETCH GET API JSON JS PHP MYSQL CHATGPT
ejemplo de infinito scroll con javascript window.onscroll con fetch get sql limit offset mysql php tabla articulo id nombre precio foto
ChatGPT
Aquí tienes un ejemplo de cómo implementar la funcionalidad de "infinito scroll" en una página web utilizando JavaScript, window.onscroll, una solicitud fetch, PHP y MySQL para cargar datos de una tabla de artículos en función de la posición de desplazamiento del usuario. En este ejemplo, asumiremos que tienes una tabla llamada "articulos" con columnas "id", "nombre", "precio" y "foto".
HTML:
html
Copy code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Infinito Scroll</title>
<style>
#container {
width: 80%;
margin: 0 auto;
}
.item {
border: 1px solid #ccc;
margin: 10px;
padding: 10px;
}
</style>
</head>
<body>
<div id="container">
<div id="items"></div>
</div>
<script src="script.js"></script>
</body>
</html>
JavaScript (script.js):
javascript
Copy code
let loading = false;
let currentPage = 0;
function fetchArticulos(offset, limit) {
return fetch(`fetch_articulos.php?offset=${offset}&limit=${limit}`)
.then(response => response.json());
}
function loadMoreArticulos() {
if (loading) return;
loading = true;
fetchArticulos(currentPage * 10, 10)
.then(data => {
loading = false;
if (data.length > 0) {
const itemsContainer = document.getElementById("items");
data.forEach(articulo => {
const item = document.createElement("div");
item.classList.add("item");
item.innerHTML = `
<p>ID: ${articulo.id}</p>
<p>Nombre: ${articulo.nombre}</p>
<p>Precio: $${articulo.precio}</p>
<img src="${articulo.foto}" alt="${articulo.nombre}">
`;
itemsContainer.appendChild(item);
});
currentPage++;
}
})
.catch(error => {
console.error("Error fetching data: ", error);
loading = false;
});
}
loadMoreArticulos();
window.onscroll = () => {
if (window.innerHeight + window.scrollY >= document.body.offsetHeight) {
loadMoreArticulos();
}
};
PHP (fetch_articulos.php):
php
Copy code
<?php
// Conexión a la base de datos (reemplaza estos valores con los tuyos)
$host = "localhost";
$user = "tu_usuario";
$password = "tu_contraseña";
$database = "tu_base_de_datos";
$conn = new mysqli($host, $user, $password, $database);
if ($conn->connect_error) {
die("Error de conexión a la base de datos: " . $conn->connect_error);
}
$offset = $_GET['offset'];
$limit = $_GET['limit'];
$query = "SELECT id, nombre, precio, foto FROM articulos LIMIT $limit OFFSET $offset";
$result = $conn->query($query);
$articulos = array();
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$articulos[] = $row;
}
}
$conn->close();
header("Content-Type: application/json");
echo json_encode($articulos);
?>
En este ejemplo, al desplazarse hacia abajo en la página, se cargarán más artículos cuando el usuario llegue al final de la página. La cantidad de artículos cargados por lote (offset) es 10 en este caso, pero puedes ajustarlo según tus necesidades. Asegúrate de reemplazar las credenciales de la base de datos y los nombres de las columnas por los correctos.
User
agregar un mensaje sin mas articulos en el codigo
ChatGPT
Puedes agregar un mensaje que indique que no hay más artículos disponibles una vez que se hayan cargado todos los artículos. Para hacerlo, modifica el JavaScript de la siguiente manera:
javascript
Copy code
let loading = false;
let currentPage = 0;
let noMoreItems = false;
function fetchArticulos(offset, limit) {
return fetch(`fetch_articulos.php?offset=${offset}&limit=${limit}`)
.then(response => response.json());
}
function loadMoreArticulos() {
if (loading || noMoreItems) return;
loading = true;
fetchArticulos(currentPage * 10, 10)
.then(data => {
loading = false;
if (data.length > 0) {
const itemsContainer = document.getElementById("items");
data.forEach(articulo => {
const item = document.createElement("div");
item.classList.add("item");
item.innerHTML = `
<p>ID: ${articulo.id}</p>
<p>Nombre: ${articulo.nombre}</p>
<p>Precio: $${articulo.precio}</p>
<img src="${articulo.foto}" alt="${articulo.nombre}">
`;
itemsContainer.appendChild(item);
});
currentPage++;
} else {
noMoreItems = true;
const noMoreItemsMessage = document.createElement("div");
noMoreItemsMessage.classList.add("no-more-items");
noMoreItemsMessage.textContent = "No hay más artículos disponibles.";
itemsContainer.appendChild(noMoreItemsMessage);
}
})
.catch(error => {
console.error("Error fetching data: ", error);
loading = false;
});
}
loadMoreArticulos();
window.onscroll = () => {
if (window.innerHeight + window.scrollY >= document.body.offsetHeight) {
loadMoreArticulos();
}
};
Con esta modificación, cuando no haya más artículos disponibles para cargar, se mostrará el mensaje "No hay más artículos disponibles." y el evento onscroll dejará de realizar solicitudes de carga adicionales.
User
el codigo para noMoreItemsMessage en index.html
ChatGPT
Puedes agregar el elemento noMoreItemsMessage directamente en tu archivo index.html. A continuación, se muestra cómo puedes hacerlo:
html
Copy code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Infinito Scroll</title>
<style>
#container {
width: 80%;
margin: 0 auto;
}
.item {
border: 1px solid #ccc;
margin: 10px;
padding: 10px;
}
.no-more-items {
text-align: center;
font-weight: bold;
color: #888;
margin: 20px 0;
}
</style>
</head>
<body>
<div id="container">
<div id="items"></div>
<div class="no-more-items">No hay más artículos disponibles.</div>
</div>
<script src="script.js"></script>
</body>
</html>
En este código HTML, se ha agregado un elemento <div> con la clase no-more-items, que contendrá el mensaje "No hay más artículos disponibles." Cuando no haya más artículos para cargar, este mensaje se mostrará automáticamente en la página gracias a la lógica implementada en el archivo JavaScript (script.js) cuando no hay más elementos para cargar.
User
noMoreItemsMessage que no vea al inciar cargar la pagina al primcipios
ChatGPT
Para evitar que el mensaje "No hay más artículos disponibles" se muestre al cargar la página, puedes ocultarlo inicialmente y mostrarlo solo cuando sea necesario. Para hacerlo, puedes utilizar CSS para ocultar el elemento y JavaScript para mostrarlo cuando sea apropiado. Aquí está cómo puedes lograrlo:
HTML (index.html):
html
Copy code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Infinito Scroll</title>
<style>
#container {
width: 80%;
margin: 0 auto;
}
.item {
border: 1px solid #ccc;
margin: 10px;
padding: 10px;
}
.no-more-items {
display: none; /* Ocultar el mensaje inicialmente */
text-align: center;
font-weight: bold;
color: #888;
margin: 20px 0;
}
</style>
</head>
<body>
<div id="container">
<div id="items"></div>
</div>
<div class="no-more-items">No hay más artículos disponibles.</div>
<script src="script.js"></script>
</body>
</html>
JavaScript (script.js):
javascript
Copy code
let loading = false;
let currentPage = 0;
let noMoreItems = false;
const noMoreItemsMessage = document.querySelector(".no-more-items");
function fetchArticulos(offset, limit) {
return fetch(`fetch_articulos.php?offset=${offset}&limit=${limit}`)
.then(response => response.json());
}
function loadMoreArticulos() {
if (loading || noMoreItems) return;
loading = true;
fetchArticulos(currentPage * 10, 10)
.then(data => {
loading = false;
if (data.length > 0) {
const itemsContainer = document.getElementById("items");
data.forEach(articulo => {
const item = document.createElement("div");
item.classList.add("item");
item.innerHTML = `
<p>ID: ${articulo.id}</p>
<p>Nombre: ${articulo.nombre}</p>
<p>Precio: $${articulo.precio}</p>
<img src="${articulo.foto}" alt="${articulo.nombre}">
`;
itemsContainer.appendChild(item);
});
currentPage++;
} else {
noMoreItems = true;
noMoreItemsMessage.style.display = "block"; // Mostrar el mensaje
}
})
.catch(error => {
console.error("Error fetching data: ", error);
loading = false;
});
}
loadMoreArticulos();
window.onscroll = () => {
if (window.innerHeight + window.scrollY >= document.body.offsetHeight) {
loadMoreArticulos();
}
};
En este código, hemos establecido inicialmente el estilo display del elemento .no-more-items en "none" para ocultarlo al cargar la página. Luego, cuando no haya más artículos para cargar, cambiamos el estilo display a "block" en el JavaScript para mostrar el mensaje. Esto asegura que el mensaje "No hay más artículos disponibles" solo se muestre cuando sea necesario.
Comentarios
Publicar un comentario