2010-02-03 25 views
1

Je n'ai pas vu de mention de ceci est le livre "JavaScript - le guide définitif" de David Flanagan (j'ai aussi posé cette question sur O'Reilly Answers), ou n'importe où d'ailleurs, mais je trouve cette fenêtre .onunload n'est invoqué que si le document est complètement chargé, ce qui est assez ennuyeux! C'est vrai pour IE8 et Chrome 3 au moinsJavaScript onunload seulement appelé si le document est complètement chargé?

J'ai un morceau de Javascript que je veux ajouter au bas des pages web. Si l'utilisateur clique sur la page avant que la page ne soit chargée (voir ci-dessous), et avant que mon Javascript ait eu une chance de s'exécuter, j'espérais piéger ça dans le chargement. Mais ce n'est pas possible car le gestionnaire d'événements onunload n'est appelé que lorsque le document est entièrement chargé. Si je ne peux pas utiliser onunload, y a-t-il autre chose que je peux utiliser pour atteindre la même chose?^"Javascript - Le Guide Définitif" suggère que l'interaction de l'utilisateur avec la page ne peut pas arriver jusqu'à ce que la page soit chargée. Je crois que c'est faux. Voici une description du livre:

"Une autre zone grise dans le modèle d'exécution Javascript est la question de savoir si les gestionnaires d'événements peuvent être appelés avant que le document ne soit complètement chargé. tous les gestionnaires d'événements sont toujours déclenchés après l'exécution de tous les scripts, ce qui n'est généralement pas le cas: si un document est très long ou est chargé sur une connexion réseau lente, le navigateur peut rendre partiellement le document et permettre à l'utilisateur de commencer à interagir avec lui (et de déclencher des gestionnaires d'événements) avant que tous les scripts et les gestionnaires onload ne soient lancés.Si un tel gestionnaire d'événements invoque une fonction non encore définie, il échouera. dans les scripts d'un document.) Et si un tel gestionnaire d'événements tente de manipuler une partie du document qui n'a pas encore été analysée, elle échouera. Ce scénario est rare dans la pratique, et ce ne sont généralement pas en valeur l'effort de codage supplémentaire nécessaire pour protéger énergiquement contre elle. » (5e édition, page 256)

I a réalisé des tests sur IE8 qui a montré qu'il était possible d'interagir avec la page (et laissez-le via un lien d'ancrage) à tout moment dans le chargement de la page.

Merci pour toute aide, Paul

+0

Si l'utilisateur a le temps de cliquer avant que le javascript ait terminé son exécution initiale, pourriez-vous réduire la quantité de javascript qui doit fonctionner de cette façon?Vous pouvez toujours utiliser eval pour récupérer un autre fichier js plus tard. –

+0

Est-ce que vous définissez "fully loaded" comme "document parsed" ou "' onload' a déclenché "? –

+0

* le navigateur peut rendre partiellement le document et permettre à l'utilisateur de commencer à interagir avec lui * indique que le navigateur peut permettre à l'utilisateur d'interagir avec la page partiellement rendue. –

Répondre

0

il me semble logique qu'un événement onunload ne pouvait tirer jusqu'à Le document est analysé: l'analyse du document et l'exécution du script s'exécutent généralement sur le même thread et si un utilisateur devait e page, le thread serait annulé après que l'événement onunload a été déclenché. Depuis l'analyse syntaxique utilise le fil au moment où l'utilisateur quitte la page, le navigateur aurait les options suivantes:

  • complète l'analyse syntaxique et le feu l'événement unload - qui retarderaient la navigation à la page suivante, donc ce n'est pas vraiment une option faisable.
  • Annuler l'analyse et déclencher l'événement de déchargement - c'est une option plus réalisable mais vous pourriez probablement voir certains UA ne pas déranger.
  • Juste arrêter le fil et accédez à la page suivante - qui semble être ce qui se passe pour vous dans IE et Chrome

Peut-être que vous pourriez voir si l'événement est tiré onbeforeunload? Je ne pense pas que cela fera une différence. Je pense que la meilleure chose à faire serait de chercher des façons d'optimiser la page pour charger plus rapidement.