2009-05-22 8 views
12

J'ai un script qui est inséré dynamiquement via un autre script. Le code de ce script est enveloppé dans l'événement $(window).load() car il nécessite que les images de la page soient toutes chargées. Dans certains navigateurs, cela fonctionne très bien, mais dans d'autres, il semble ne pas se déclencher car la page a déjà terminé le chargement au moment où le code est exécuté.

Existe-t-il un moyen de vérifier et de voir si la page a déjà terminé le chargement - via jQuery ou JavaScript? (y compris les images)

Dans cette situation, je n'ai pas accès à l'événement onload du document original (à part de le modifier via le script chargé - mais cela semble présenter le même problème).

Toutes idées/solutions/conseils seraient grandement appréciés!

Répondre

7

Vous pouvez essayer de créer un gestionnaire qui est invoqué par un délai d'attente qui sera vérifiez les images pour voir si leurs propriétés sont disponibles. Effacez la minuterie dans le gestionnaire d'événements load, donc si l'événement de chargement se produit en premier, le minuteur ne se déclenchera pas. Si les propriétés ne sont pas disponibles, l'événement de chargement n'a pas encore été déclenché et vous savez que votre gestionnaire sera éventuellement appelé. Si tel est le cas, vous savez que l'événement de chargement s'est produit avant que votre gestionnaire ne soit défini et que vous pouvez simplement continuer.

pseudocode

var timer = null; 
$(function() { 
    $(window).load(function() { 
     if (timer) { 
      clearTimeout(timer); 
      timer = null; 
     } 
     process(); 
    }); 
    timer = setTimeout(function() { 
     if (checkAvailable()) 
      process(); 
     } 
    }, 10*1000); // waits 10 seconds before checking 
}); 

function checkAvailable() 
{ 
    var available = true; 
    $('img').each(function() { 
     try { 
      if (this.height == 0) { 
       available = false; 
       return false; 
      } 
     } 
     catch (e) { 
      available = false; 
      return false; 
     } 
     }); 
     return available; 
    } 

    function process() { 
     ... do the real work here 
    } 
+0

Ceci accomplit à peu près ce que je cherchais à faire. Juste tweaked un peu pour déclencher la minuterie à intervalles rapprochés au lieu d'attendre 10 secondes. Merci! – DismissedAsDrone

2

Je pense que votre problème se résoudreait si vous utilisiez $ (document) .ready au lieu de $ (window) .load - voir le jquery documentation.

+0

Juste un extrait des documents liés: En un mot, c'est un bon substitut à l'utilisation de window.onload ... votre fonction liée sera appelée l'instant e DOM est prêt à être lu et manipulé, ce qui signifie que 99,99% du code JavaScript doit être exécuté. – TML

+5

$ (document) .ready se déclenche si le DOM est en place mais n'attend pas le chargement des images (si je ne me trompe pas). Dans ce cas, j'ai besoin que les images soient chargées pour que je puisse lire leurs attributs. – DismissedAsDrone

+1

Vous pouvez lire les attributs sans images en cours de chargement ... – trusktr

5

J'ai écrit un plug-in qui peut être d'une certaine utilité: http://plugins.jquery.com/project/window-loaded

+0

Cool! Cela fonctionne-t-il si j'utilise .load() pour obtenir du contenu, et s'il y a des images qui doivent être chargées, '$ .windowLoaded (/ * dostuff * /)' exécutera le callbackaprès que de nouvelles images seront chargées ??? – trusktr

+0

J'ai résolu le problème en utilisant simplement addEventListener pour ajouter des fonctions à window.onload et pour chaque appel à la méthode .load() de jquery en définissant une variable sur true afin qu'elle puisse être détectée dans les ajouts ultérieurs à window.onload ... si cela fait n'importe quel sens ... – trusktr

+0

Le lien est cassé maintenant, il redirige vers le http://jquery.com/ :( – Septagram

Questions connexes