7
votes

Comment réaliser un événement "surcharger" sur le document dans IE

Je développe actuellement des tests d'unités pour une méthode JavaScript qui détecte la disponibilité du document. Ce code est déjà au niveau du cadre, s'il vous plaît éviter les mentions de cet étant déjà implémentées dans jQuery ou une autre bibliothèque.

J'ai simulé avec succès l'événement de changement «ReadyStatechange» avec le code suivant: P>

document.attachEvent('onload',listener);


10 commentaires

L'événement incendie réellement sur document.body . Vous pouvez donc essayer à la place document.body.fireeevent ("surcharger", événement) . Je doute que ce soit réellement des poignées de feu attachés à surcharger cependant. Si cela faisait, je serais choqué ....


Vous êtes 100% raison. Tirer l'événement sur le document.Le corps peut être fait sans erreur, mais les auditeurs attachés avec document.ATTATECTEVENT ne sont pas déclenchés.


@ERIC: pensé autant. C'est un homme bummer.


@Crescent frais trop mauvais. Si vous faites votre commentaire dans une réponse, je serai heureux de l'accepter. Toute raison derrière le fait que «ReadyStatechange» et «Charge» se comportent différemment?


@ERIC Vous devez également probablement attacher au document .body.attachevent () au lieu de document.attachevent ()


@gnarf Probablement ... Je suis en train de regarder, je vérifie simplement si je supposais mal que le document.attachevent ("surcharger", quelque chose) devrait jamais tirer


@gnarf: Je ne crois pas les gestionnaires attachés à document.body.attachevent ('Onload', ...) Feu lorsque la page charge normalement de toute façon. C'est-à-dire que vous vous oblige à attacher soit via , window.onload = ... ou window.attachetatevent , ...) .


Mais apparemment sur le surcharge et le document de la fenêtre. Le téléphone est-il le même? haussement d'épaules juste une pensée ...


@gnarf: Nope. est le seul moyen de mapper vers la fenêtre Overload EVAIK. document.body.attachevent ('Onload', ...) est juste ignoré.


@Crescent Frescent C'est la conclusion que je viens de conclure en exécutant quelques nouveaux tests: les auditeurs de l'événement «Onload» sont uniquement tirés dans IE lorsqu'ils sont attachés via Window.ATTATECENT, NON DOCUMENT.ATTATECHEVENT NOR DOCUMENT.BODE.ATTATECENT


3 Réponses :


0
votes

L'événement de chargement se déclenchera lorsque le document (y compris des ressources externes telles que des images) est entièrement chargé et non auparavant.

Quels résultats obtenez-vous de vos tentatives d'incendie ReadyStatechange ? Est-ce que la valeur ReadyStat modifie effectivement? Que ce soit ou non, ce n'est pas beaucoup d'usage non plus non plus: soit vous tirez l'événement avec un ReadyState qui n'a pas changé, ou vous le faites avec un ReadyStat qui n'est pas une réflexion valide de l'état du document.


4 commentaires

@Nickfitz merci pour la réponse. Je n'essaie pas de changer la valeur du document.readystate, qui reste "complète" avant (parce que j'ai une attente jusqu'à ce que le prêt préalable soit "complet") et après mon test. Veuillez garder à l'esprit que ce code est écrit pour des tests d'unités.


@NICKFITZ: Eric essaye simplement de simuler le World Real-World Charger Event pour les tests d'unités locales.


Si c'est pour un test unitaire, vous n'avez pas besoin de déclencher des événements. Créez simplement un objet d'événement simulé avec des valeurs connues et appelez directement le gestionnaire d'événements, puis vérifiez qu'il a généré les résultats corrects pour ces valeurs. Sinon, ce n'est pas un test unitaire, c'est un test d'intégration: vous testez comment le code s'intègre aux mécanismes de traitement des événements internes du navigateur.


@Nickfitz Sauf que je ne suis pas unitaire testant les gestionnaires d'événements :) J'écris des tests d'unités pour une méthode qui remplace et filtre l'AddeventListener et AttachEvent sur la fenêtre et le document.




4
votes

Pour une raison quelconque, il semble que c'est-à-dire que IE remplace la propriété surcharger code> de la fenêtre code> avec un objet vide après chargement du chargement de la DOM. Au moins, c'est le cas lorsque vous essayez d'y accéder depuis n'importe quel gestionnaire d'événements d'un élément DOM ...

<!DOCTYPE html>
<html>
  <head>
    <title>Test by Josh</title>
    <script type="text/javascript">
      window.onload = function() {
        alert("Test");
      }         
    </script>
  </head>
  <body>
    <h1 onclick="window.onloadfix()">Test</h1>
    <!-- Could potentially be injected via server-side include if needed -->
    <script type="text/javascript">
      window.onloadfix = function() {
        window.onload();
      }
    </script>
  </body>
</html>


1 commentaires

@Josh Stodola Intéressé ... J'ai découvert aujourd'hui que le document.attachevent n'est pas une fonction dans IE: vous pouvez l'appeler bien sûr, mais (typeof document.attachevent) renvoie "objet" et documenter.attachevent.Call et document.ATTATECENT.CALL .apply sont indéfinis ... Ce navigateur ne cessera jamais de me surprendre.