Foros del Web » Programando para Internet » Javascript »

Evento Doc. Load para IE (via DOM)

Estas en el tema de Evento Doc. Load para IE (via DOM) en el foro de Javascript en Foros del Web. Hola ¿que tal? ¿Saben si hay alguna forma de meter un event handler para el document load en IE que no sea via window.onload ? ...
  #1 (permalink)  
Antiguo 30/08/2007, 13:11
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
De acuerdo Evento Doc. Load para IE (via DOM)

Hola ¿que tal?

¿Saben si hay alguna forma de meter un event handler para el document load en IE que no sea via window.onload ?

El problema de window.onload es que funciona bien si la uso una sola vez, pero en mi proyecto cargo primeramente una funcion GENERAL para el document load, y despues en función de cual sea la sección en la que estoy navegando tengo que cargar una ó más funciones al document load... y estas funciones no se acumulan sino que una pisa la otra.

En firefox me funciona pero en firefox lo puedo manejar via dom y se acumulan en vez de pisarse.

Un saludo atento y gracias!! :)
  #2 (permalink)  
Antiguo 30/08/2007, 14:05
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Re: Evento Doc. Load para IE (via DOM)

SOLUCIONADO:

Hermanos, el señor me ha iluminado con su gracia celestial y he dado con una solución (demos gracias al señor, amen!).

Esto es lo que hice:

Código:
// A
window.onload = cargarFunciones;

// B
loads = new Array();

//c
function manolo() {
	alert("hola");
}

// D
function pirulo() {
	alert("hola 2");
}

// E
loads[0] = "manolo()";
loads[1] = "pirulo()";

// F
function cargarFunciones() {
	for (var i =0; i < loads.length;i++) {
		eval(loads[i]);
	}
}
Explico...

A: window.onload = <funcion>. Donde "funcion" es una función() escrita en algun lado del código. En mi caso no uso directamente window.onload, tengo una funcion que primero intenta usar dom events (con addEventListener) y si eso no funciona, es decir, si el browser no soporta dom events como es el caso del IE, mete window.onload.


B: Tengo un array global donde cada uno de sus registros es un string con la función que quiero ejecutar. Durante el transcurso del armado de mi proyecto voy incluyendo archivos via PHP dependiendo de la sección en la que estoy. En función de estoy voy a necesitar ADHERIR más funciones al document load. Lo que hago simplemente en estos casos es meterle a ese array el nombre() de la funcion.

C: Una función

D: Otra funcion diferente

E: Cargar funciones RECORRE el array loads (que contiene strings con el nombre() de funciones) y usa EVAL para ejecutar cada caso [Gracias dios, gracias por traerme eval()!!!).





Conclusion...

1. Cuando se termine de cargar la web se ejecuta la funcion cargarFunciones(); (Window.load = cargarFunciones;)

2. cargarFunciones() lee y ejecuta el array loads[];

3. En donde a mi se me plasca dentro del código meto dentro de loads[] una nueva funcion... para ayudar al dinamismo podemos usar:

Código:
// Esto mete una funcion en el ultimo record de loads
loads[loads.count+1] = "miFuncion()";

:D

Un saludo!!
  #3 (permalink)  
Antiguo 30/08/2007, 15:03
 
Fecha de Ingreso: diciembre-2003
Mensajes: 1.583
Antigüedad: 20 años, 4 meses
Puntos: 13
Re: Evento Doc. Load para IE (via DOM)

¿Y no te salía más fácil esto?:

Código:
window.onload = function(){
    funcion1();
    funcion2();
    funcion3();
}
__________________
El conocimiento es libre: Movimiento por la Devolución
  #4 (permalink)  
Antiguo 31/08/2007, 09:56
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Re: Evento Doc. Load para IE (via DOM)

Hola Frijolerou,

No, en realidad eso no me servia por que en el sistema que estoy haciendo tengo, por un lado un modulo "GENERAL" que carga una funcion en el doc_load, pero el sistema tiene otros modulos como por ejemplo "USUARIOS", "PERFILES", "ARCHIVOS", etc... estos modulos son includes de PHP que se cargan de forma dinamica dentro del documento. Cada modulo carga sus propias funciones dentro del mismo DOCUMENT LOAD, por que son includes.

Cada modulo tiene sus propios archivos JS.

Por esto no puedo cargar todo en la misma linea ó en el mismo archivo.

Lo mejor que encontré entonces fue crear un array global, ir metiendo con cada modulo las funciones que quiera cargar en el DOC LOAD dentro de ese array global y luego tener una función única que recorre el array y ejecuta. Esta función única es la que meto en el DOC LOAD.

Un saludo!
  #5 (permalink)  
Antiguo 31/08/2007, 09:58
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Evento Doc. Load para IE (via DOM)

Hola:

Normalmente para hacer estas cosas (añadir funciones al evento y no pisar a todo lo que ya está asignado) se utiliza addEventListener (para IE y su maravilloso soporte DOM attachEvent).

Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #6 (permalink)  
Antiguo 01/09/2007, 14:56
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Re: Evento Doc. Load para IE (via DOM)

Derke,

Gracias por responder. Si, comprendo lo que decis. De hecho tengo una función propia para agregar eventos de forma independiente al browser. El tema es que AddEventListener es para DOM Events. IE y su attachEvent no funcionan de la misma forma, no respetan el modelo de eventos DOM por ende funcionan de otra forma.

Más aún, si lo que quiere uno es agregar un evento al doc load no se puede lograr con attachEvent, hay que usar el maldito window.onload :S

Estas son mis funciones, por si a alguien le sirven:

Código:
/*

	DECLARACION DE FUNCIONES UTILIZADAS PARA APLICAR EVENTOS A ELEMENTOS

	01/08/2007 - Eduardo Garcia Rajo (h)

*/

loads = new Array();

// REFERENCIA general hacia el BODY de la página
var bodyref = $('bodyref');

// Event Object del Browser
var e = e || window.event;


//
// Función para aplicar un evento
//
function addListener(Obj, event, eventHandler) {

	if( Obj.addEventListener ) {
		Obj.addEventListener(event, eventHandler, false);
	} else if( Obj.attachEvent ) {
		Obj.attachEvent("on"+event, eventHandler);
	}
}


//
// Función para eliminar un evento
//
function removeListener(Obj, event, eventHandler) {

	if( Obj.removeEventListener ) {
		Obj.removeEventListener(event, eventHandler, false);
	} else if( Obj.detachEvent ) {
		Obj.detachEvent("on"+event, eventHandler);
	}
}

//
//	Función para agregar un evento al LOAD de la página
//
function DocLoad(eventHandler) {
	if (document.addEventListener) {
		addListener(document, "DOMContentLoaded", eventHandler);
	} else if (window.addEventListener) {
		addListener(window, "DOMContentLoaded", eventHandler);
	} else {
		window.onload = eventHandler;
	}
}


/*******************************************************************/


//
//	Ejecuta todas las funciones de Document Load
//
function cargarFunciones() {
	for (var i =0; i < loads.length;i++) {
		eval(loads[i]);
	}
}

//
//	Disparamos el Document Load
//
DocLoad(cargarFunciones);

¿A alguien le funciono attachEvent utilizando "onload" o algo asi? yo tuve que hacer una función especial para meter eventos al document load.


Un saludo atento y gracias por responder :)
  #7 (permalink)  
Antiguo 01/09/2007, 22:44
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: Evento Doc. Load para IE (via DOM)

Hola de nuevo.

Utilizando tu misma función addListener() sí me ha dejado agregar eventos al window.onload. Lo que ocurre es que IE ejecuta primero el último agregado, y FF el primero agregado es el primero ejecutado:

Código PHP:
<!doctype html public "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
meta name="Author" content="derkeNuke" />
<
title>P&#225;gina nueva</title>
<style type="text/css">

</
style>
</
head>

<
body>

<
script type="text/javascript">

//
// Función para aplicar un evento
//
function addListener(ObjeventeventHandler) {

    if( 
Obj.addEventListener ) {
        
Obj.addEventListener(eventeventHandlerfalse);
    } else if( 
Obj.attachEvent ) {
        
Obj.attachEvent("on"+eventeventHandler);
    }
}

addListenerwindow"load", function() {
    
alert("hola");
} );
addListenerwindow"load", function() {
    
alert("adios");
} );

</script>

</body>
</html> 
Tanto en IE6 como en FF2.


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
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 09:33.