2009-10-01 13 views
1

Est-il possible de suspendre l'exécution de javascript jusqu'à ce que la page entière soit chargée dans un navigateur? Je mets à jour un div au bas du document en utilisant AJAX, mais lorsque je clique sur ce lien avant page entière est chargée, je reçois une erreur ...Comment suspendre l'exécution de javascript?

<%= link_to_remote 'Update', :update => 'div_at_the_bottom', :url => { :usual_stuff } %> 

Répondre

2

Désactiver le lien généré et permettent lorsque le dom a chargé:

  1. Désactiver le lien:

    <%= link_to_remote 'Update', 
         { :update => 'div_at_the_bottom', :url => { :usual_stuff } }, 
         { :disabled => 'disabled', :id => 'update-trigger' } 
    %> 
    

    (noter que pour pouvoir passer cette option supplémentaire pour link_to_remote dont vous avez besoin pour faire le [2e] "options" hachage explicite en l'enveloppant avec des bouclés {}Extra help on this

  2. Ensuite, quelque part (partout après a été inclus lib du prototype) activer le lien lorsque le DOM est chargé (ce qui est similaire à ce que tout le monde a dit de le faire jusqu'à présent):

    <script> 
    $(document).observe('dom:loaded', function() { 
        $('update-trigger').disabled = false 
    }) 
    </script> 
    

Cette solution est également sémantiquement agréable, si cela vous importe (cela me concerne).

+0

C'est exactement ce que je voulais. BTW 'désactivé' tag ne fonctionne pas avec mais je reçois l'idée. Merci – Kylo

+0

@Kylo: par golly vous avez raison. http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#h-17.12.1 J'ai utilisé cet attribut avec succès sur des ancres dans des applications conçues pour IE et Firefox. Bon sang. –

1

Si vous optez pour une bibliothèque JavaScript comme jQuery vous pouvez facilement lier tout code javascript à l'événement DOM ready et éviter les problèmes de ce type.

+0

OP ne "lie aucun code javascipt". OP utilise 'link_to_remote' auquel votre réponse ne répond pas. Du tout. –

3

La façon la plus simple est de tout faire window.onload:

window.onload = function() { 
    // do everything here 
} 

Vous pouvez également mettre votre javascript droit à la fin de la page, avant </body>. De cette façon, les objets sur lesquels vous opérez sont garantis dans le DOM.

Comme d'autres l'ont dit, certains frameworks JS ont une bonne méthode d'exécution de JS lors du chargement du DOM. Le principal avantage de ceci est que vous n'obtenez pas l'équivalent JS de "flash de contenu non stylé", c'est-à-dire voir un élément sous une forme (peut-être moche), puis changer une fois la pleine page chargée.

+0

cet événement se déclenche seulement après que le document entier a été chargé, y compris toutes les images et quoi, ce qui est un peu exagéré dans la plupart des situations –

+0

vrai, mais l'objet que l'OP modifie est au bas de la page minime je suppose. – DisgruntledGoat

+0

Cela fait même partie des «meilleures pratiques» de Google en matière de développement Web à l'adresse http://code.google.com/speed/articles/optimizing-opensocial-gadgets.html - «Placez Javascript aussi tard que possible dans la page. et les pages Web sont chargées et rendues du haut vers le bas.Laisser le contenu visible de l'utilisateur comme le HTML, les images et CSS être une priorité plus élevée dans l'ordre de téléchargement. " –

Questions connexes