Comunidad de diseño web y desarrollo en internet online

Internet Explorer JAVASCRIPT-PHP error

Citar            
MensajeEscrito el 25 Ago 2007 02:56 pm
Hola... buena gente de CristaLab, me dirigo a ustedes para solicitarles ayuda con un problema que me esta afectando desde hace un par de dias.

Les platicare lo mas resumido posible. Tengo un par de scripts en PHP que me permiten darle uso a varias librerias de javascript de una manera muy sencilla. Por ejemplo, si quiero validar un formulario simplemente pongo al final del formulario:

Código :

<form id="form1">
...
<input type="text" class="v-email">
<input type="submit">
<? $html->formValidate('form1'); ?>
</form>


No necesito incluir nada en el header. Esa funcion de php me imprime ( por medio de un puente en JS entre el <head> </head> usando document.getElementsByTagName("head").item(0).appendChild(FILEREF);) todos los CSS y JS que necesito y ejecuta las funciones de JS pertinentes.

Funciona perfecto en Firefox y Opera y medianamente bien en Internet Explorer, por que? porque si guiñas un ojo, das dos chisquillos con los dedos e inclinas la cabeza 12° funciona, sino da error.

Gracias a que en realidad no conozco ninguna buena herramienta para depurar JS en INTERNET EXPLORER me tomo casi 3 dias medio encontrar la causa del problema, de nuevo, les platicare.

Estos scripts en PHP de los que les hablo optimizan el codigo de los JS y CSS, (borran espacios, comentarios, saltos de linea, encriptan y comprimen en gzip) y guardan el resultado en un archivo de cache en el servidor, la primera carga de la pagina toma bastante tiempo mas de lo normal, pero esto solo pasa una vez cada que se cambian los JS. una vez que se han generado los archivos cache simplemente lee el contenido de esos archivos y lo imprime y es increiblemente rapido.

Por ejemplo, la libreria Prototype JS que pesa 92KB pasa a pesar solo 12KB.

En fin, el dia de hoy me di cuenta que Internet Explorer tiene problemas cuando los archivos cache no se han generado, es decir, en el ejemplo anterior ejecuta el codigo para iniciar el formulario ANTES de que se termine de cargar la libreria JS. Si entro a la pagina primero en firefox y luego en IE, funciona, si entro primero en IE no funciona.

Hasta ahi bien, porque pense, simplemente genero los archivos una vez en firefox y luego siempre debera funcionar en IE, pero no. funciona unos 30 mintuos en IE y luego vuelve a dar errores.

Quizas lo pueda solucionar con alguna cabezara de HTTP, pero no se bien cual. o quiza agregando un sleep en PHP para que no siga leyendo hasta que no se cargue el sleep (solucion que no me gusta), o quiza exista alguna funcion en javascript o http que me permita obligar al navegador a cargar primero un script.

Les solicito ayuda..

este es el archivo que carga los JS:
http://www.pbxa.com:8080/ioFramework/browser/project-template/phload/js/loader.js
esta es la clase que verifica si debe crear el archivo cache o no.
http://www.pbxa.com:8080/ioFramework/browser/includes/trunk/io/Html/phLoad/bridge.php
y esta es la documentacion:
http://www.pbxa.com:8080/ioFramework/wiki/PhLoad

Por neohunter

Claber

563 de clabLevel

1 tutorial

 

Bogota, Colombia

opera
Citar            
MensajeEscrito el 25 Ago 2007 04:35 pm
La cuestión es simple, Internet Explorer a diferencia de otros navegadores, puede llegar a ejecutar scripts, sin que la página terminé de cargar. Tal vez es complejo de entender, pero en resumidas cuentas te digo que agregues un listener(y en el dispares todas tus funciones JS) para el evento onload del body, y con eso solucionarás muchos de tus problemas en IE. Eso me hay ayudado bastante a mí. ^^

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 25 Ago 2007 04:43 pm
ahhhh hago que las funciones se ejecuten con onload?
mmm buena idea, puede ser que funcione... deja veo si es posible hacerlo =D...

no existe una forma (quiza con codigo en javascript) de obligarle a Internet Explorer cargar un archivo JS antes de continuar con la ejecucion de la pagina?. o pausar la ejecucion, no se? :crap:

Por neohunter

Claber

563 de clabLevel

1 tutorial

 

Bogota, Colombia

firefox
Citar            
MensajeEscrito el 25 Ago 2007 06:05 pm
Bueno, resumiento. cuando hago esto:

Código :

<? $html->formValidate('form1'); ?>

el php imprime esto:

Código :

<script type="text/javascript" src="http://cristal/phload/phload.php?file=formValidator/validator.js"></script>
<script type="text/javascript"> var valid_form1 = new Validation('form1' , { theme: 'Simple',stopOnFirst: '1' } ); </script>


Bien, lo que queriamos es que la segunda linea se agregara a la funcion onload, entonces agrege esta funcion:

Código :

function ioAddListener(obj,evt,func) {
    if (obj.attachEvent)
        obj.attachEvent('on' + evt, func);

    else {
        if (obj.addEventListener) {
            obj.addEventListener(evt,func,false);
        }
        else {
            if (obj.eval) {
                obj["on"+evt] = func;
            } else {
                alert("No se puede agregar el listener\nObject:"+obj+" 
ID:"+obj.id+" Name:"+obj.name+" TagName:"+obj.tagName+"\nEvent:"+evt);
            }
        }
    }
}


y en el php estoy haciendo esto:

Código :

   function printHtml(){
      echo "\n<script type='text/javascript'> 
         ioAddListener(window,'load',function(){
               new Control.Modal('$this->id', ".$this->parseParams().");
            } );
      </script>";
   }


Es asi como decias dano?

Por neohunter

Claber

563 de clabLevel

1 tutorial

 

Bogota, Colombia

firefox
Citar            
MensajeEscrito el 25 Ago 2007 06:35 pm
Masomenos, es la idea. Mira, también veo otro detalle, la inclusión de script, la haces en el body. Lo mas recomendable es que queden dentro del header. Para eso, agregalas en el Dom, te paso un algoritmo de mi idea(creo que si me la entendiste solo la reafirmo).

Código :

<html>
<header>
...  
</header>
<body>
<form>
...
<?php 
echo "<script>//agregamos por dom, los scripts externos en el header</script>";
echo "<script>agregamos un listener para onLoad, el listener que agreguemos ejecutara las funciones iniciales que queremos</script>"
</form>
</body>
</html>


Creo que con eso reduces mucho la probabilidad de error, pruebalo y nos cuentas.

Saludos

pd. Yo no combino PHP con Html, te recomiendo usar un sistema de plantillas, en clab subí una clase que Maikel me ayudo a hacer un tutorial de uso:
http://www.cristalab.com/tutoriales/160/galeria-de-imagenes-con-templates-en-php

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 25 Ago 2007 07:04 pm
Opps si! lo coloque mal, siempre lo agrego al head con el DOM. hago la inclusion asi:

Código :

fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src", loadphp+file);
document.getElementsByTagName("head").item(0).appendChild(fileref);


en todo caso ya esta como tu dices, imprimi en consola para ver el orden de las cosas, carga asi:

Termina de cargar script.js
Etiqueta </body>
onLoadEvent

Lo que parece estar bien. Voy a hacer las pruebas, ruego a dios que funcione...

Por neohunter

Claber

563 de clabLevel

1 tutorial

 

Bogota, Colombia

firefox
Citar            
MensajeEscrito el 25 Ago 2007 07:22 pm
... me quiero tirar por la ventana... la primera vez no sirve, le das F5 y sirve siempre... ='(

Por neohunter

Claber

563 de clabLevel

1 tutorial

 

Bogota, Colombia

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.