JavaScript - Scroll infinito

Filtrado por el usuario: xve
<<>>
Filtrado por el usuario 'xve' (Eliminar fitro)
 
Vista:
sin imagen de perfil
Val: 8
Ha aumentado su posición en 307 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Scroll infinito

Publicado por Mariguuan (3 intervenciones) el 19/06/2021 16:49:11
Mirad, soy inútil. Llevo más de un mes tratando de hacer un scroll infinito para mi pagina y me es imposible. He probado de todo, he buscado videos de YouTube, enlaces de Google, cogido código de otras personas, preguntado en foros y nada. Me han dado algunas soluciones, pero no consigo hacerlas. He conseguido hacer una función ajax que se active cuando deslices y inserte el código en un div. Pero solo lo hace una vez. Luego como el div ya tiene texto no funciona más. Tan solo quiero un scroll infinito que cargue unas publicaciones cuando deslices. Nada más. Muchas gracias.
Este es el código que tengo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<script>
function ajax(){
    const http = new XMLHttpRequest();
    const url = 'http://localhost/Registro/articulo.php';
    http.onreadystatechange = function(){
        if(this.readyState == 4 && this.status == 200){
          console.log(this.responseText);
          document.getElementById("response").innerHTML = this.responseText;
 
        }
    }
 
    http.open("GET", url);
    http.send();
 
}
 
 
 
$(document).ready(function(){
    var count=0;
 
    $(document).scroll(function(){
        if($(document).scrollTop()+$(window).height()>=$(document).height())
        {
        count+=1;
            $("body").append( "<article>",ajax(),"</article><article>",ajax(),"</article><article>",ajax(),"</article>");
        }
    });
});
</script>

Y este es el codigo que quiero cargar. El de articulo.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php include("includes/header3.php")?>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<link rel="stylesheet" href="estilos4.css">
<div class= "articulo" id="articulo">
    <article>
    <?php $sql="SELECT*FROM publicaciones ORDER BY RAND() limit 1";
        $result=mysqli_query($conn,$sql);
        while($mostrar=mysqli_fetch_array($result)){
          $publicacion=$mostrar['publicacion'];
          ?>
          <?php } ?>
      <hgroup>
          <div id="user" onclick="location.href='Perfil.php'"><img src="Imagenes/Foto de perfil - copia.png" id="fotouser">
            <h1 id="nombreuser">
          <?php $sql="SELECT*FROM publicaciones WHERE publicacion= '".$publicacion."' ORDER BY RAND() limit 1";
        $result=mysqli_query($conn, $sql);
        while($mostrar=mysqli_fetch_array($result)){
          $autor= ucfirst($mostrar['nombre']);?>
        <?php echo $autor ?>
        <?php } ?>
        </h1></button>
        </div>
        <h1 id="Tituloarticulo">Título del primer artículo</h1>
      </hgroup>
        <time datetime="08-02-2021"> Publicado el 08-02-2021</time>
        <table>
        <?php
        $result=mysqli_query($conn,$sql);
        while($mostrar=mysqli_fetch_array($result)){
          ?>
        <tr>
          <td><?php echo $mostrar['publicacion'] ?> </td>
        </tr>
        <?php
        }
        ?>
        </table>
        <footer>
            <p>Comentarios (0)</p>
            <button id="Comentarios"></button>
        </footer>
    </article>
</div>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Gio
Val: 368
Bronce
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

Scroll infinito

Publicado por Gio (79 intervenciones) el 21/06/2021 03:54:43
Hola Mariguuan, tal vez este código que hice te sea de ayuda:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<style>
    #padre{
        width: 200px;
        overflow: overlay;
        height: 80px;
        border: solid 3px;
    }
    .hijo{
        width: 100%;
        height: 20px;
        border: solid 2px #333;
        box-sizing: border-box;
    }
</style>
 
<div id="padre" style="overflow: overlay;">
</div>
 
<script>
	////////////////////////////////////
	////////// DECLARACIONES ///////////
	////////////////////////////////////
		//FUNCION QUE SIMULA EL FUNCIONAMIENTO DE AJAX
			function ajax(desde, cuantos=1, onreadystatechange=false){
				var baseDatos = [ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100 ];
 
				//AJUSTES DE VARIABLES, ANTIERROR
					var l=baseDatos.length;
					desde--;
					var hasta=desde+cuantos;
					if(hasta>l) hasta = l;
 
				//EN ESTA PARTE SIMULAMOS EL DELAY DE ENTREGA POR PARTE DEL SERVIDOR
					return new Promise((resolve, reject) => {
						if(desde>=0&&desde<l && cuantos>0){
 
							setTimeout(()=>{
								//FUNCION QUE SE EJECUTA CUANDO SE RESIVE LO QUE NOS ENTREGA EL SERVIDOR
								if(onreadystatechange){
									onreadystatechange();
								}
 
								resolve(baseDatos.slice(desde, hasta));
							}, 1500);
						} else {
							resolve(false);
						}
					});
 
			}
 
		//FUNCION QUE AJUSTA LA SINCRONIA DE LA FUNCION ajax()
			async function ajaxB(i, fin=false){
				try{
					let res=await ajax(i);
					if(res){
						padre.innerHTML += crearHijo(res);
					}
					esperando=false;
					return true;
				} catch (err){
					return false;
				}
			}
 
		var esperando=false;
		var padre = document.getElementById("padre");
		var hasta=10;
 
		//CREA LA ESTRUCTURA HTML DE UN ELEMENTO HIJO
			function crearHijo(contenido){
				return '<div class="hijo">'+contenido+'</div>\n';
			}
 
		//TAMAÑO INTERNO DE UN ELEMENTO CON SCROLL
			function scrollHeight(e){
				return e.scrollHeight - e.clientHeight;
			}
 
		//POSICION DONDE SE ENCUENTRA EL SCROLL
			function scrollY(e){
				return e.scrollHeight*(e.scrollTop/(e.scrollTop+e.clientHeight));
			}
 
		//ALTO TOTAL DE LOS ULTIMOS ELEMENTOS HIJOS DE UN ELEMENTO PADRE
			function ultimosHijos(e, x=1){
				var hijos = e.children;
				var max   = hijos.length;
				var alto=0;
 
				x=(x>max)?max:x;
 
				for(let i=0; i<x; i++){
					alto+=hijos[i].offsetHeight;
				}
 
				return scrollHeight(e)-alto;
			}
 
 
 
 
	////////////////////////////////////
	//////// PREPARACION HTML //////////
	////////////////////////////////////
		//SE PREPARA LA ESTRUCTURA INTERNA INICIAL DEL ELEMENTO PADRE, PIDIENDOLE 10 ELEMENTOS INICIALES AL SERVIDOR
			for(let i=1; i<=hasta; i++){
				let a = ajaxB(i);
				if(!a){
					break;
				}
			}
 
 
 
 
	////////////////////////////////////
	///////////// EVENTOS //////////////
	////////////////////////////////////
		//SE DETECTA CUANDO EL USUARIO HACE USO DEL SCROLL
		padre.addEventListener('scroll', function(e) {
			//DETECTAMOS SI EL USUARIO SE ENCUENTRA A 3 ELEMENTOS HIJOS O A 70px DEL FINAL DEL SCROLL
			if(!esperando&&(scrollHeight(padre)-scrollY(padre) < 70 || scrollY(padre) > ultimosHijos(padre, 3))){
				//PONEMOS LA VARIABLE ESPERA PARA QUE ESTA PARTE NO SE VUELVA A EJECUTAR HASTA QUE EL SERVIDOR NOS TERMINE DE ENTREGAR LO PEDIDO MEDIANTE AJAX
				esperando=true;
 
				//LE PEDIMOS AL SERVIDOR 10 DATOS NUEVOS Y LOS AGREGAMOS EN EL ELEMENTO PADRE
				for(let i=hasta+1; i<=hasta+10; i++){
					let a = ajaxB(i);
					if(!a){
						break;
					}
				}
				hasta+=10;
			}
		});
</script>

Si pones en ejecución este codigo, veras como al bajar en el scroll (bajo siertas condiciones especificadas en la linea 123), demora un tiempo (simulando el tiempo que tardaria el servidor en entregar mas datos) y se agregan mas elementos hijos (10 para ser exacto) en el elemento padre y hasta que el servidor ya no tenga mas datos para entregar.

Lo dejé todo bien comentado pero si tienes alguna duda, me la haces.
Aclaro que la función ajax() que sale en este código, es ficticia, oséa que no hace peticiones de verdad al servidor, pero se comporta como tal, es para simular el comportamiento de una función ajax() de verdad. Oséa que tienes que reemplazarla por la función ajax() que si necesitas para tu proyecto.

Espero que esto te sea de utilidad, un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar