Foros del Web » Programando para Internet » Javascript »

Optimizar de carga pagina

Estas en el tema de Optimizar de carga pagina en el foro de Javascript en Foros del Web. Hola gente que tal, este es mi primer post. Les cuento que mis conocimientos son básicos y solamente de HTML5 y CSS3 que es lo ...
  #1 (permalink)  
Antiguo 09/07/2016, 10:15
 
Fecha de Ingreso: julio-2016
Mensajes: 5
Antigüedad: 7 años, 9 meses
Puntos: 0
Pregunta Optimizar de carga pagina

Hola gente que tal, este es mi primer post.
Les cuento que mis conocimientos son básicos y solamente de HTML5 y CSS3 que es lo que he estado "estudiando" de internet hace ya varios meses, tengo claro que esto solamente me servirá para poder diseñar la pagina, enmaquetar y hacer que se vea linda pero no hacerla interactiva o "real".

Después de muchos meses de ir practicando, viendo tutoriales y leyendo en algún que otro foro, me veo en la obligación de aprender javascript ya que creo es el siguiente paso, lo primero que me gustaría aprender (y no se si estoy en en lenguaje correcto) es aprender a optimizar la carga de contenido, mi caso es el siguiente:

Código:
<ul>
     <li> 
          <a href="#modal"> LINK </a>	
     </li>
     <div id="modal">
           <iframe src="contenido_del_modal.html">
          </iframe>
     </div>
	
	<li>
		...
	</li>

</ul>
En esa lista <ul> tengo muchos <li>, cada uno de ellos tiene un link el cual me lleva a un div que esta abajo al cual llame "modal", ese modal en su totalidad es otro archivo .html el cual tiene contenido, fotos, videos, texto, etc.
El problema se me da cuando tengo unos 15 <li> y cada uno de ellos con sus <iframe>
Que solución le darían ustedes para que se cargara cada <iframe> solamente cuando doy click en LINK que me lleva a "modal" ?

Me gustaría que me mencionaran que estoy haciendo mal, como lo optimizarían o si esto se puede arreglar con javascript, si se puede y no quieren escribir todo un código, decirme palabras clave para googlear y saber como arrancar porque estoy muy perdido al no saber nada.

Saber que buscar, me motivaría para aprender de una vez javascript!

Saludos
  #2 (permalink)  
Antiguo 09/07/2016, 10:52
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 16 años, 6 meses
Puntos: 48
Pregunta Respuesta: Optimizar de carga pagina

Hola Gunet,

no dejas claro cual es el problema que tienes, solo indicas que tu problema se produce cuando tienes 15 o mas <li>, pero no defines con claridad el problema.

Podrias explicar claramente cual es el problema?

Gracias y un saludo.
__________________
El problema de nuestra época consiste en que sus hombres no quieren ser útiles sino importantes.

Winston Churchill
  #3 (permalink)  
Antiguo 09/07/2016, 14:39
 
Fecha de Ingreso: julio-2016
Mensajes: 5
Antigüedad: 7 años, 9 meses
Puntos: 0
Respuesta: Optimizar de carga pagina

Perdona, se ve que omití la parte mas importante.

Cada <li> tiene un <iframe> con mucho contenido, el cual quiero que se cargue solo al hacer click en en link (que lleva al modal donde esta contenido_de_modal.html) y no al entrar al index.html donde tengo el <ul>.

Actualmente la pagina se carga y carga todo el contenido de cada <li>, o sea el <iframe> completo, y eso hace que demore mucho en cargar la pagina.

Imagina que si cada li tiene un video, una mapa de google, imágenes y eso lo multiplicas por 10, 15 o 20 (cantidad de <li>). tienes una pagina que demora muchiiiisimo en cargar.

Me di cuenta que es ese el problema porque la misma pagina con con los li vacíos, sin el iframe, carga enseguida, no se traba la pc ni el móvil directamente.

Si no queda claro solo preguntarme que le estoy poniendo ganas pero estoy bastante limitado.
Saludos y gracias por la rápida preocupación!
  #4 (permalink)  
Antiguo 09/07/2016, 15:44
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 16 años, 6 meses
Puntos: 48
Información Respuesta: Optimizar de carga pagina

Hola Gunet,

por ponerte un poco en situación, y aunque a lo mejor ya lo sepas te quiero comentar que cada vez que usas un IFRAME lo que en realidad ocurre es que se realiza una petición mas al servidor para obtener su HTML.

Te lo explicaré con un ejemplo:

Supongamos que tienes la pagina main.html, esta pagina necesita para funcionar correctamente los siguientes recursos.

- 3 ficheros javascript.
- 1 fichero css (hoja de estilo).
- 5 imagenes.

Cuando tu introduces en tu navegador la direccion...

http://www.example.com/main.html

... el servidor web te devolvera el HTML de esa pagina, correcto? (Primera peticion)...

... el navegador recibe el HTML y lo interpreta y ve que necesitas descargar los recursos que te enumeré antes (3+1+5=9 ficheros o recursos), asi que el navegador vuelve a solicitar al servidor 9 peticiones mas, en total llevamos 10 peticiones.

Pues cada vez que usas un IFRAME sucede exactamente lo mismo ya que es como embeber una pagina HTML dentro de la principal.

main.html (10 peticiones)
|___ iframe1.html (10 peticiones)
|___ iframe2.html (10 peticiones)
|___ iframeN.html (10 peticiones)

Basandonos en este escenario ficticio que me acabo de inventar y suponiendo que tengas 15 IFRAMES obtenemos que para que tu pagina se cargue completamente vas a necesitar...

15 iframes + 1 pagina main = 16 paginas * 10 recursos = 160 peticiones al servidor!!!

Ok, ahora que sabemos como funciona el tema de los IFRAMES te puedo confirmar que no es una buena solucion para tu proyecto, si, se pueden usar pero no abusar de ellos.

En tu caso te recomendaria que usases Ajax para cargar contenido bajo demanda.

Un saludo y ya nos comentaras como te fue todo.
__________________
El problema de nuestra época consiste en que sus hombres no quieren ser útiles sino importantes.

Winston Churchill
  #5 (permalink)  
Antiguo 09/07/2016, 16:43
 
Fecha de Ingreso: julio-2016
Mensajes: 5
Antigüedad: 7 años, 9 meses
Puntos: 0
Respuesta: Optimizar de carga pagina

Muchas gracias por redactarlo tan detalladamente y si podía tener una vaga idea pero no tan claro como lo dejaste.

Ajax lo conozco de nombre nada mas y para ser honesto me asusta un poco tener que estudiar eso por mi cuenta como vengo haciendo pero arrancaré por ver algo en youtube a ver si se acerca a mi proyecto.

Eso que tu me dices es verdad, a veces quizás, nos enfocamos en que queremos hacer tal cosa y usamos mal una herramienta o no la optima, veré como logro cargar contenido en un click.

Saludos!
  #6 (permalink)  
Antiguo 09/07/2016, 17:00
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Optimizar de carga pagina

Bienvenido a Foros del Web.

Lo primero que debes hacer es colocar a cada <div> en el espacio comprendido por cada <li> o llevarlo hacia otro contenedor. Esto es porque, el elemento <ul>, debe usarse solo para listar a elementos <li> de forma desordenada; de allí viene su nombre: unordered list (lista desordenada). Es más una cuestión semántica que de funcionamiento.

Suponiendo que hiciste lo primero, te quedaría algo similar a esto:
Código HTML:
Ver original
  1. <ul>
  2.     <li>
  3.         <a href="#modal">LINK</a>
  4.         <div id="modal">
  5.             <iframe src="ejemplo.html"></iframe>
  6.         </div>
  7.     </li>
  8.     <li>
  9.         <a href="#modal">LINK 2</a>
  10.         <div id="modal">
  11.             <iframe src="otroEjemplo.html"></iframe>
  12.         </div>
  13.     </li>
  14. </ul>

Lo que ahora tienes que hacer es reemplazar al atributo id de cada <div> por el atributo class u otro. Esto es porque no debe repetirse el valor de un id en el documento HTML. Se trata de un valor único e irrepetible.

Realizando dicho cambio, el esquema quedaría muy parecido a esto:
Código HTML:
Ver original
  1. <ul>
  2.     <li>
  3.         <a href="#modal">LINK</a>
  4.         <div class="modal">
  5.             <iframe src="ejemplo.html"></iframe>
  6.         </div>
  7.     </li>
  8.     <li>
  9.         <a href="#modal">LINK 2</a>
  10.         <div class="modal">
  11.             <iframe src="otroEjemplo.html"></iframe>
  12.         </div>
  13.     </li>
  14. </ul>

La idea de hacer estos cambios es que se le pueda dar un clic a cualquier enlace de la lista y se cargue el contenido del <iframe> contenido en el <div> que se encuentra insertado en el mismo elemento <li> en el que está el enlace y, una estructura como esta, ayuda a que el proceso mediante JavaScript sea más sencillo. Dado a que los enlaces tienen como propósito enlazar hacia otra dirección electrónica o anclar en algún elemento del documento (mover a la barra de desplazamiento vertical hasta la posición del elemento cuyo id sea igual al valor del atributo href del enlace pulsado), lo aconsejable es que utilices otro elemento. Por ejemplo, podrías usar elementos <span> a los cuales les asignarías una clase para poder identificarlos y diferenciarlos de otros elementos <span> que pudiera haber en otras secciones del documento. Y como la idea es que el contenido de cada <iframe> no cargue al inicio, podrías almacenar el valor de la ruta en un atributo personalizado.

Así es como quedaría el esquema hasta este punto:
Código HTML:
Ver original
  1. <ul id="lista">
  2.     <li>
  3.         <span class="enlace">Modal 1</span>
  4.         <div class="modal">
  5.             <iframe data-src="ejemplo.html"></iframe>
  6.         </div>
  7.     </li>
  8.     <li>
  9.         <span class="enlace">Modal 2</span>
  10.         <div class="modal">
  11.             <iframe data-src="otroEjemplo.html"></iframe>
  12.         </div>
  13.     </li>
  14. </ul>

Añadí un id al elemento <ul> para poder tomarlo fácilmente en el código JavaScript. Teniendo esto, ya podemos pasar a la parte funcional.

Ahora bien, como tenemos a varios elementos similares y quieres que se cargue el contenido de cada <iframe> al darle un clic al <span> que se encuentra en cada <li>, te aconsejo delegar dicho evento (el evento click) al elemento <ul>; de esta forma, cuando este se produzca en cualquier parte del mismo (la lista), se verificará que el elemento objetivo (el elemento al que se le dio el clic) posea la clase "enlace"; de ser así, se cargará el contenido del <iframe> vecino a partir del valor del atributo personalizado que este posea.

Esto sería así:
Código Javascript:
Ver original
  1. //Luego de cargar la página
  2. document.addEventListener("DOMContentLoaded", function(){
  3.     //Delegamos el evento click al elemento <ul>
  4.     document.querySelector("#lista").addEventListener("click", function(event){
  5.         var elementoAfectado = event.target; //Capturamos al elemento afectado por el clic
  6.         if (elementoAfectado.className == "enlace"){ //Si la clase del elemento es igual a "enlace"
  7.             var elLi = elementoAfectado.parentNode, //El elemento padre del <span>, o sea, el <li>
  8.                 elDiv = elLi.querySelector(".modal"), //El elemento <div> contenido en el <li>
  9.                 elIframe = elDiv.querySelector("iframe"), //El elemento <iframe> contenido en el <div>
  10.                 laRuta = elIframe.dataset.src; //La ruta contenida en el atributo personalizado del <iframe>            
  11.             elIframe.src = laRuta; //Asignamos la ruta al <iframe> y procederá a cargar el contenido
  12.         }
  13.     }, false);
  14. }, false);

Luego de cargar el DOM o modelo de objetos del documento (evento DOMContentLoaded), se procede a registrar al evento click en el elemento <ul> al cual tomamos por el valor de su id. Al producirse este, se ejecutará una función anónima que ejecutará un conjunto de instrucciones. En este caso, se tomará al elemento afectado por el evento y se verificará que posea la clase "enlace" para determinar si se trata de alguno de los elementos <span> de la lista. Al cumplirse la condición, se procede a tomar al elemento que contiene al <li>, se captura al elemento <div> contenido, al <iframe> insertado en el <div>, al valor del atributo personalizado del <iframe> y, finalmente, se asigna este último valor al atributo src del <iframe> para que pueda cargar el contenido respectivo.

Ejemplo en vivo

Algunas referencias para entender mejor el código:
  • Mediante el método .addEventListener(), registramos un evento en un elemento del documento.
  • El método .querySelector() permite seleccionar un elemento contenido en el elemento que se especifique antes del punto.
  • En la variable event se encuentra el objeto del evento, mismo que posee el atributo target que es en el que se almacena una referencia hacia el elemento directamente afectado por el evento producido.
  • La propiedad parentNode registra una referencia hacia el elemento que contiene al elemento asociado mediante el punto: element.parentNode (elemento que contiene a element).

Por cierto, si realizaras peticiones asíncronas (AJAX), también cargarías de peticiones al servidor.

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 10/07/2016, 02:36
 
Fecha de Ingreso: julio-2016
Mensajes: 5
Antigüedad: 7 años, 9 meses
Puntos: 0
Respuesta: Optimizar de carga pagina

Master, mil gracias, estuve varias horas viendo lo que hiciste, lo leí, lo probé y me funciona, ahora surgen 2 cosas.

1ro. El link que me lleva al modal necesito que sea una imagen, imagina que dentro de la <ul> tengo una galeria de fotos y al dar click obtengo mayor información en el famoso iframe, según busqué, el span no me lo permite quizás se deba a eso que no puedo generar un link con la imagen.

2do. No consigo el efecto del modal que consistía en opacar el fondo y que se desplegara un cuadro (que contiene el html del iframe) el cual ocupa casi todo el ancho y el alto... el típico pop-up sin abrir otra ventana, lo que consigo tal y como esta tu ejemplo en vivo, es que aparezca un recuadro abajo, pero necesitaría no perder el estilo que había creado, te reitero las gracias porque era justo eso lo que estaba necesitando! solo faltaría poder añadirle mi pseudo-animación.

Te muestro lo que he querido hacer para ver si tu puedes editar tu código y adaptarlo a los otros div que omití poner con la tonta intensión de facilitar las cosas, solo consiguiendo complicarme ante la dificultad de adaptar el codigo javascript.

Codigo del index donde el ul tiene una galeria de imagenes donde en este caso son frutas, al clickear en la fruta se opacaria el fondo, bajaria una recuadro con informacion traida de "nombredelafruta".html

Código:
<ul>
       <li>
             <a href="#modal1>
                     <img src="frutas/manzana.jpg"/>
             </a>
       <li>
        <div id="modal1"class="modalmask">
                <div class="modal movedown">
                       <div id="info">
                             <iframe class="ficha" src="frutas/manzana.html" scrolling="no" align="center"></iframe>  
                      </div>
                      <a href="#close" title="Close" class="close"><img src="img/site/close.png"/></a>
                </div>
        </div>

       <li>
             <a href="#modal2>
                     <img src="frutas/sandia.jpg"/>
             </a>
       <li>
        <div id="modal2"class="modalmask">
                <div class="modal movedown">
                       <div id="info">
                             <iframe class="ficha" src="frutas/sandia.html" scrolling="no" align="center"></iframe>  
                      </div>
                </div>
        </div>
</ul>

Estos son los estilos del modal y la ventana emergente que quiero combinar con tu código:

.modalmask { /* <<< Fondo oscuro >>> */
background: rgba(0,0,0,0.85);
bottom: 0;
font-family: Arial, sans-serif;
left: 0;
right: 0;
opacity:0;
-webkit-transition: opacity 400ms ease-in;
-moz-transition: opacity 400ms ease-in;
transition: opacity 400ms ease-in;
pointer-events: none;
position: fixed;
top: 0;
z-index: 1000;
}
.modalmask:target { /* <<< cuando es objetivo el modal mask >>> */
opacity: 1;
pointer-events: auto;
}

.modalbox { /* <<< VENTANA >>> */
background: #fff;
border: 0.2em solid #EB75DF;
border-radius: 0.1875em;
height: 93%;
margin-top: 5%;
position: center;
padding: 0.125em 0.42em;
-webkit-transition: all 500ms ease-in;
-moz-transition: all 500ms ease-in;
transition: all 500ms ease-in;
width: 90%;
}

.movedown { /* <<<<< Aparicion >>>>> */
margin: 0 auto;
border: 0.3em solid #B062BC;
}

.modalmask:target .movedown { /* EL DIV que tiene el div perfil */
border-radius: 0.3125em;
margin: 1% auto;
width: 90%;
height: 93%;
}

.close {
width: 1.9em;
height: 1.9em;
border-radius: 2em;
-webkit-border-radius: 2em;
-moz-border-radius: 2em;
background: white;
top: 0.8em;
right: 1em;
position: absolute;
text-decoration: none;
text-align: center;
z-index: 1001;
}

.close:hover {
background: red;
}

Si logras editar tu codigo con mi estilo, estaría por terminado!
Saludos!!
  #8 (permalink)  
Antiguo 10/07/2016, 10:34
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Optimizar de carga pagina

Estimado Gunet:

Paso a responder los puntos señalados:

1. Si cambias al <span> por un elemento <img>, <label> o el que fuera, y mantuvieras la clase que le asigné a los <span> del ejemplo, la funcionalidad seguiría siendo la misma.
Código HTML:
Ver original
  1. <ul id="lista">
  2.     <li>
  3.         <img src="imagen1.jpg" class="enlace" />
  4.         <div class="modal">
  5.             <iframe data-src="ejemplo.html"></iframe>
  6.         </div>
  7.     </li>
  8.     <li>
  9.         <img src="imagen2.jpg" class="enlace" />
  10.         <div class="modal">
  11.             <iframe data-src="otroEjemplo.html"></iframe>
  12.         </div>
  13.     </li>
  14. </ul>

2. Te aconsejo dejar la estructura como en el punto anterior y tener un <div> externo que serviría de fondo para todos los casos.
Código HTML:
Ver original
  1. <ul id="lista">
  2.     <li>
  3.         <img src="imagen1.jpg" class="enlace" />
  4.         <div class="modal">
  5.             <iframe data-src="ejemplo.html"></iframe>
  6.         </div>
  7.     </li>
  8.     <li>
  9.         <img src="imagen2.jpg" class="enlace" />
  10.         <div class="modal">
  11.             <iframe data-src="otroEjemplo.html"></iframe>
  12.         </div>
  13.     </li>
  14. </ul>
  15.  
  16. <div id="fondo"></div>

Con unos cuantos estilos, le darías la apariencia que necesitas:
Código CSS:
Ver original
  1. #fondo{
  2.     position: absolute; /* Posición absoluta para que pueda ser ubicado sin tomar en cuenta a los demás elementos */
  3.     background-color: black; /* Fondo de color negro */
  4.     display: none; /* Inicialmente, el fondo no debe verse */
  5.     top: 0; /* En el eje Y, se ubicará partiendo del borde superior del documento */
  6.     left: 0; /* En el eje X, se ubicará partiendo del borde izquierdo del documento */
  7.     width: 500%; /* Ancho amplio para que sea visible cuando se muestre un <iframe> ubicado muy abajo */
  8.     height: 500%;   /* Altura amplia para que sea visible cuando se muestre un <iframe> ubicado muy abajo */
  9. }

Y tan solo sería cuestión de que, cuando vayas a mostrar un <iframe>, selecciones al fondo, lo hagas visible (propiedad display) y le asignes una opacidad (propiedad opacity) mayor a cero y menor a uno para obtener un efecto de transparencia. También te aconsejo añadir un botón o imagen al cual, una vez que se le dé un clic, oculte tanto al <iframe> que se está mostrando como al fondo para que así el usuario pueda seleccionar otro. Debes tener en cuenta que, este último botón, también deberá ser mostrado y ocultado junto con cada <iframe> y el fondo.

Para que no se muestren las barras de desplazamiento al momento de mostrar el fondo (porque es más grande que la vista del documento), solo tendrías que ocultarlas mediante la propiedad overflow:
Código JavaScript:
Ver original
  1. document.body.overflow = "hidden";

Y volver a mostrarlas cuando ocultes al <iframe> y el fondo:
Código JavaScript:
Ver original
  1. document.body.overflow = "auto";

Para centrar al <iframe>, podrías asignarle una posición absoluta (así como el fondo) y aplicarle los siguientes estilos:
Código Javascript:
Ver original
  1. elIframe.style.top = window.innerHeight / 2 - elIframe.offsetHeight / 2 + window.scrollY + "px";
  2. elIframe.style.left = window.innerWidth / 2 - elIframe.offsetWidth / 2 + window.scrollX + "px";

De esta manera, el punto medio del <iframe> quedará en la misma ubicación del punto medio de la pantalla, centrándose completamente.

Como añadí un efecto de transición a todos los elementos para que los cambios de estilos (aunque no todos) se produzcan con un efecto de retardo, deberás centrar al <iframe> pasado el tiempo que se asignó a la propiedad transition en la hoja de estilos. En este ejemplo, fue de ".1s", es decir, cien milésimas de segundo; por lo tanto, necesitarás utilizar un temporizador para realizar el centrado efectivamente:
Código Javascript:
Ver original
  1. setTimeout(function(){
  2.     //Centramos al <iframe>
  3.     elIframe.style.top = window.innerHeight / 2 - elIframe.offsetHeight / 2 + window.scrollY + "px";
  4.     elIframe.style.left = window.innerWidth / 2 - elIframe.offsetWidth / 2 + window.scrollX + "px";
  5. }, 100);

Esto se debe a que, como se le asigna al <iframe> un ancho y alto en tiempo de ejecución, pasarán cien milésimas de segundo hasta que se complete el proceso, pero el centrado se ejecutará antes de que eso ocurra, por lo que, las medidas que se toman en las dos líneas que realizan el centrado, no serán las cifras finales.

Ejemplo en vivo (sin el botón para ocultar todo)

Algunos enlaces de referencia.
Si tienes otra duda, consúltanos con total confianza.

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #9 (permalink)  
Antiguo 12/07/2016, 16:27
 
Fecha de Ingreso: julio-2016
Mensajes: 5
Antigüedad: 7 años, 9 meses
Puntos: 0
Respuesta: Optimizar de carga pagina

Alexis88 no resta mas que agradecerte tus grandes aportes, he visto como funciona y lo bien que queda, sobre todo, que es justo lo que pedía, faltaría agregarle estilos para que quede granial!!

Para mi que de javascript cero, veo como algo tan sencillo, tiene su complejidad, de este simple post que realicé tengo mucho para leer, gracias por poner palabras relacionadas al final, eso esta genial!

Seguramente me veras preguntando otras cosas para pulir el simple proyecto que vengo haciendo, salud y de nuevo gracias!

Etiquetas: google, html
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:41.