2011-04-08 23 views
5

Tengo un par de funciones que se deben activar después de un retraso en el evento de carga. Funciona bien en Chrome, pero no en Firefox.Cómo cargar la función javascript en window.onload después de un retraso

function foo() { 
    // javascript code 
} 

window.onload = setTimeout(foo, delay); 

function bar() { 
    // javascript code 
} 

window.onload = setTimeout(bar, delay); 

Si quito el retraso, 'bar' se invoca en Firefox y 'foo' y 'bar' conseguir invoca en cromo. ¿Cuál podría ser el problema aquí?

Respuesta

1

trate de envolver el tiempo de espera en una función:

window.onload = function(delay) { 
        setTimeout(foo, delay); 
        setTimeout(bar, delay); 
       }; 
+0

@Koooilnc Gracias por la sugerencia. ¿Puede decirnos cómo hacer esto de forma dinámica, ya que en función de algunas convenciones de nombres suele haber una función de JavaScript para todos los elementos en un botón de opción (por ejemplo, podría tener 2 o 3 o 4 o muchas opciones). – Achaius

+0

@Kalpana no estoy seguro de lo que quiere decir: 'window.onload = [somefunction]' significa: iniciar 'somefunction' después de que el documento se haya cargado. Después de eso, puede usar funciones para hacer clic en botones de radio, etc. Si desea que activen una recarga de página con un cierto 'retraso ', puede intentar poner un parámetro en el html (' thisorthat.html? Delay = 10'). Buscar SO para la forma de usar parámetros, muchas respuestas para encontrar. – KooiInc

4

me sorprende ambas funciones consiguen invocarse en cualquier navegador. Sin embargo, es posible que tenga mejor suerte con algo como:

function foo() { 
    // javascript code 
    setTimeout(bar, additionalDelay); 
} 

function bar() { 
    // javascript code 
} 

window.onload = function() { setTimeout(foo, delay); }; 

Editar: No importa, voy a ver por qué tanto de los tiempos de espera ejecutar. Cuando haces algo como:

window.onload = setTimeout(bar, delay);

... no son en realidad estableciendo window.onload para ejecutar su función después de un retraso. En su lugar, esto invoca de inmediato setTimeout() para programar su llamada de función y asignar el resultado (un identificador a la invocación de función programada) al window.onload. Esto no es correcto, y probablemente cause un error de tiempo de ejecución en algunos navegadores cuando intentan invocar window.onload como una función.

Lo que se quiere hacer en su lugar es asignar una función a window.onload, como:

window.onload = function() { 
    setTimeout(foo, delay); 
    setTimeout(bar, delay); 
}; 
3

Se puede usar jQuery con algo así:

$(document).ready(function() { /* your code */ }); 

o

$(window).load(function() { /* your code */ }); 

jQuery agrega automáticamente funciones para apilar, y las ejecuta todas una vez que se desencadena el evento.

Si desea hacerlo sólo con JS, puede hacer gran variedad de funciones para activar:

function a() { 
     alert('a'); 
    } 

    function b() { 
     alert('b'); 
    } 

    var arr = new Array(a, b); 

    window.onload = function() { 
     for(var i = 0; i < arr.length; i++) { 
      setTimeout(arr[i], 1000); 
     } 
    } 

espero que ayude.

+1

La idea de la matriz de funciones es bastante clara. Si agrega algunos 'var arr = [];' y 'arr.push (a); arr.push (b); 'será perfecto :) –

1

Veo dos errores de base en su código. En primer lugar, si desea pasar una función como argumento, debe escribir el nombre de la función sin paréntesis; si agrega el paréntesis, la función será ejecutada en ese momento. Ver un ejemplo:

function foo(){ 
    alert("I am foo"); 
} 
function bar(){ 
    alert("I am bar"); 
} 

setTimeout(foo, 5000); 
setTimeout(bar(), 10000); 

En segundo lugar, si se asigna un valor al atributo .onload con el operador = sobrescribirá su valor anterior, al igual que a = 3 sobrescribe el valor anterior de a.

function foo(){ 
    alert("I am foo"); 
} 
function bar(){ 
    alert("I am bar"); 
} 
window.onload = foo; 
window.onload = bar; 

Por lo capto, su problema principal es ser capaz de añadir en lugar de reemplazar controladores de eventos. Como de costumbre, no hay una API universal que pueda usar con seguridad en todos los navegadores.Si está utilizando un marco o una biblioteca, probablemente proporcione un mecanismo de navegador cruzado. De lo contrario, necesita encontrar o escribir el suyo. En el pasado, he utilizado esto en varios proyectos:

... aunque no ha sido actualizado desde el año 2005 por lo que me aseguraría de que funciona correctamente en los navegadores recientes.

Cuestiones relacionadas