elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  ¿Evitar que se bloqueen los navegadores al cargar un javascript?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Evitar que se bloqueen los navegadores al cargar un javascript?  (Leído 3,757 veces)
MA40

Desconectado Desconectado

Mensajes: 254


--- I ❤ Ƀ ---


Ver Perfil WWW
¿Evitar que se bloqueen los navegadores al cargar un javascript?
« en: 26 Septiembre 2016, 22:45 pm »

Hola.

Cuando se carga una web que tiene algún javascript que requiere mucho tiempo de cálculo, los navegadores se bloquean y después de unos minutos muestran mensajes para continuar o detener el script.

Sin embargo hay algunas webs que evitan esto (no sé cómo lo harán). Pongo el ejemplo de la siguiente página para jugar al ajedrez: http://forwardcoding.com/projects/ajaxchess/chess.html (para probar, hay que poner el “Time per move:” mayor de 10000 ms).

¿Cómo se puede hacer eso?

Para probar, he hecho el siguiente javascript en el archivo bloquea.js

Código
  1. function bloquea() {
  2.  var limite = 10000000000;
  3.  var n = 0;
  4.  for (var i = 0; i < limite; i++) {
  5.    n = i;
  6.  }
  7.  document.write("Terminado!");
  8. }

Y luego, la siguiente página:

Código
  1. <meta charset="utf-8">
  2. <script language="javascript" type="text/javascript" src="bloquea.js"></script>
  3. </head>
  4.  <input type="button" value="Bloquea" onclick="bloquea()">
  5. </form>
  6. </body>
  7. </html>

Se puede probar aquí: http://bitcart.info/laboratorio/bloquea.htm

Como se puede ver se bloquea, aunque si no se interrumpe voluntariamente el script, después de unos 15 segundos termina.

He estado buscando y encontré esta página en la que creo que se explica cómo solucionar el problema: http://www.frikipandi.com/public/post/cargar-javascript-sin-bloqueo-en-el-navegador/ Pero, utilizando el archivo bloquea.js, no he conseguido hacer funcionar ninguna de las opciones que describe.

El código de la primera es éste:

Código
  1. <meta charset="utf-8">
  2. <script type="text/javascript">
  3.  var xhrObj = getXHRObject();
  4.  xhrObj.onreadystatechange = function() {
  5.    if ( xhrObj.readyState == 4 && 200 == xhrObj.status ) {
  6.      eval(xhrObj.responseText);
  7.    }
  8.  };
  9.  xhrObj.open('GET', 'bloquea.js', true);
  10.  xhrObj.send('');
  11. </head>
  12.  <input type="button" value="Bloquea" onclick="bloquea()">
  13. </form>
  14. </body>
  15. </html>

Y se puede probar aquí: http://bitcart.info/laboratorio/nobloquea_1.htm

Bloquearse, no se bloquea, pero nunca termina, por lo que pienso que no entra en el bucle.

La segunda opción es ésta:

Código
  1. <meta charset="utf-8">
  2. <script type="text/javascript">
  3.  var xhrObj = getXHRObject();
  4.  xhrObj.onreadystatechange = function() {
  5.    if ( xhrObj.readyState == 4 ) {
  6.  var scriptElement = document.createElement('script');
  7.  document.getElementsByTagName('head')[0].appendChild(scriptElement);
  8.  scriptElement.text = xhrObj.responseText;
  9.    }
  10.  };
  11.  xhrObj.open('GET', 'bloquea.js', true);
  12.  xhrObj.send('');
  13. </head>
  14.  <input type="button" value="Bloquea" onclick="bloquea()">
  15. </form>
  16. </body>
  17. </html>

Y para probar: http://bitcart.info/laboratorio/nobloquea_2.htm

El resultado es el mismo que el de la anterior.

Tercera opción:

Código
  1. <meta charset="utf-8">
  2. <script type="text/javascript">
  3.  var scriptElement = document.createElement('script');
  4.  scriptElement.src = 'bloquea.js';
  5.  document.getElementsByTagName('head')
  6.  [0].appendChild(scriptElement);
  7. </head>
  8.  <input type="button" value="Bloquea" onclick="bloquea()">
  9. </form>
  10. </body>
  11. </html>

Y para probar: http://bitcart.info/laboratorio/nobloquea_3.htm

Sí se bloquea, y también termina.

Cuarta opción:

Código
  1. <meta charset="utf-8">
  2. <script defer="" src="bloquea.js"></script>
  3. </head>
  4.  <input type="button" value="Bloquea" onclick="bloquea()">
  5. </form>
  6. </body>
  7. </html>

Para probar: http://bitcart.info/laboratorio/nobloquea_4.htm

Lo mismo, se bloquea y termina.

La quinta opción ya no la he probado.

¿Alguien puede ayudarme?

Un saludo.


« Última modificación: 27 Septiembre 2016, 16:35 pm por MA40 » En línea

¿Qué sucedería si se enfrentara una fuerza imparable contra un muro inamovible?
Visita Ediciones MA40 - Libros clásicos de ajedrez y este blog de ajedrez
ChessFaucet.com - Gana bitcoins jugando al ajedrez contra el ordenador
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: ¿Evitar que se bloqueen los navegadores al cargar un javascript?
« Respuesta #1 en: 26 Septiembre 2016, 23:39 pm »

No se si te servirá de algo, pero lee esta respuesta:

Al parecer podrias utilizar el método window.setTimeout() en la implementación de tu algoritmo para evitar que se bloquee el hilo del render mientras se procesan las operaciones expensivas que necesites llevar a cabo, o eso es lo que entendí según lo que parece poner en esa respuesta...

Ejemplo:
Código
  1. setTimeout(function () {
  2.    ... do the rest of the work...
  3. }, 0);

Y si eso no funciona, esto otro seguro que lo hará, puesto que en teoría te permitirá ejecutar tareas de forma asincrónica (por ende, el hilo principal de la web/navegador no se bloqueará):

PD: Yo no uso javascript.

Saludos


« Última modificación: 26 Septiembre 2016, 23:51 pm por Eleкtro » En línea



MA40

Desconectado Desconectado

Mensajes: 254


--- I ❤ Ƀ ---


Ver Perfil WWW
Re: ¿Evitar que se bloqueen los navegadores al cargar un javascript?
« Respuesta #2 en: 27 Septiembre 2016, 12:52 pm »

Hola.

Encontré esta otra dirección, muy interesante y en español, donde se explica cómo podrían programarse multihilos con la librería Concurrent.Thread.js (https://github.com/bringmehome/Concurrent.Thread.js)

La dirección: http://www.purojavascript.com/2012/07/documento-sin-titulo.html

Un saludo.
En línea

¿Qué sucedería si se enfrentara una fuerza imparable contra un muro inamovible?
Visita Ediciones MA40 - Libros clásicos de ajedrez y este blog de ajedrez
ChessFaucet.com - Gana bitcoins jugando al ajedrez contra el ordenador
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: ¿Evitar que se bloqueen los navegadores al cargar un javascript?
« Respuesta #3 en: 27 Septiembre 2016, 13:55 pm »

Otra opcion igual de valida seria enviar los datos al servidor y que este los procese, y tener un script que se ejecute cada x segundos para comprobar si el servidor ya acabo de procesar los datos y en ese caso mostrarlos.

Saludos

En línea

[u]nsigned


Desconectado Desconectado

Mensajes: 2.397

JS/Node developer


Ver Perfil WWW
Re: ¿Evitar que se bloqueen los navegadores al cargar un javascript?
« Respuesta #4 en: 27 Septiembre 2016, 16:26 pm »

1) los JS siempre van al final de la pagina, justo antes de cerrar </body>

2) Para evitar el bloqueo se usan promises (promesas).
En línea

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!
MA40

Desconectado Desconectado

Mensajes: 254


--- I ❤ Ƀ ---


Ver Perfil WWW
Re: ¿Evitar que se bloqueen los navegadores al cargar un javascript?
« Respuesta #5 en: 27 Septiembre 2016, 17:04 pm »


1) los JS siempre van al final de la pagina, justo antes de cerrar </body>


http://librosweb.es/libro/javascript/capitulo_1/como_incluir_javascript_en_documentos_xhtml.html

 :huh: :huh: :huh: :huh: :huh:



MOD: Imagen reimensionada a lo usado en el foro.
« Última modificación: 28 Septiembre 2016, 05:38 am por MCKSys Argentina » En línea

¿Qué sucedería si se enfrentara una fuerza imparable contra un muro inamovible?
Visita Ediciones MA40 - Libros clásicos de ajedrez y este blog de ajedrez
ChessFaucet.com - Gana bitcoins jugando al ajedrez contra el ordenador
[u]nsigned


Desconectado Desconectado

Mensajes: 2.397

JS/Node developer


Ver Perfil WWW
Re: ¿Evitar que se bloqueen los navegadores al cargar un javascript?
« Respuesta #6 en: 27 Septiembre 2016, 17:10 pm »

Eso está mal, lo correcto es ponerlos donde te dije yo. Asi cargan de ultimo, porque los js bloquean la carga,e s decir mientras se cargan no carga nada mas, por esos ponerlo al final del body.
En línea

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!
MA40

Desconectado Desconectado

Mensajes: 254


--- I ❤ Ƀ ---


Ver Perfil WWW
Re: ¿Evitar que se bloqueen los navegadores al cargar un javascript?
« Respuesta #7 en: 27 Septiembre 2016, 17:33 pm »


Eso está mal, lo correcto es ponerlos donde te dije yo. Asi cargan de ultimo, porque los js bloquean la carga,e s decir mientras se cargan no carga nada mas, por esos ponerlo al final del body.


Gracias {u}nsigned, tomamos nota.

En cuanto a lo de evitar el bloqueo en navegadores ¿cómo se podría resolver con promises? ¿Podrías poner el código para mi primer ejemplo (el de bloquea.js)?

Muchas gracias y un saludo.
En línea

¿Qué sucedería si se enfrentara una fuerza imparable contra un muro inamovible?
Visita Ediciones MA40 - Libros clásicos de ajedrez y este blog de ajedrez
ChessFaucet.com - Gana bitcoins jugando al ajedrez contra el ordenador
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
cargar una variable en javascript
Scripting
superchorch 2 4,070 Último mensaje 5 Julio 2012, 21:31 pm
por superchorch
cargar datos mediante javascript
Programación General
Kase 1 2,616 Último mensaje 6 Septiembre 2012, 00:08 am
por sistemx
{Ayuda} Cargar imágenes javascript
Desarrollo Web
sebah97 6 4,031 Último mensaje 1 Mayo 2013, 12:32 pm
por #!drvy
Evitar el reconectar al cargar la pagina usando fancywebsocket.js .
Desarrollo Web
70N1 9 6,496 Último mensaje 12 Diciembre 2014, 00:28 am
por engel lex
MOVIDO: ¿Evitar que se bloqueen los navegadores al cargar un javascript?
Scripting
Eleкtro 0 2,129 Último mensaje 26 Septiembre 2016, 23:40 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines