IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Iframe schizophrène ou console lunatique ?


Sujet :

JavaScript

  1. #1
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut Iframe schizophrène ou console lunatique ?
    Bonsoir les amis,

    j’ai eu l’idée saugrenue de voir s’il était possible de récupérer des données autres que HTML au moyen d’une iframe. Pour ça j’ai lancé mon serveur local et écrit un petit script pour envoyer du JSON avec le bon Content-Type.
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    header('Content-Type: application/json; charset=utf-8');
    ?>{
      "pommes": 42,
      "poires": 17,
      "chocolat": true
    }

    Puis une page HTML à laquelle j’accède via mon localhost :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <!DOCTYPE html>
    <html lang="fr">
    <head>
      <meta charset="utf-8">
      <title>Iframe avec du contenu pas HTML</title>
    </head>
    <body>
     
    <iframe src="sample.json.php"></iframe>
     
    <script> 'use strict';
     
    document.addEventListener('DOMContentLoaded', () => {
      let $iframe = document.querySelector('iframe');
      let w = $iframe.contentWindow;
      console.log(w);
      if (w) {
        let doc = $iframe.contentDocument;
        console.log(doc);
        if (doc) {
          console.log(doc.documentElement);
          console.log(doc.documentElement.outerHTML);
        }
      }
    });
     
    </script>
    </body>
    </html>

    La console m’affiche ceci sous Firefox :
    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Window -> http://localhost/tests/iframes/sample.json.php
    HTMLDocument
    <html>
    <html><head></head><body></body></html>
    … Et sensiblement la même chose sous Chrome.
    Apparemment, je me retrouve avec un HTML stub comme lorsque le script est bloqué par la same origin policy.

    Cependant, les choses deviennent vraiment bizarre quand
    1. je fais clic-droit sur ce Window dans la console
    2. « stocker en tant que variable globale » / “store as global variable”
    3. j’évalue temp0.document.documentElement.outerHTML


    Voilà ce que j’obtiens alors :
    Code console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    "<html><head><link rel="alternate stylesheet" type="text/css" href="resource://gre-resources/plaintext.css" title="Retour à la ligne automatique"></head><body><pre>{
      "pommes": 42,
      "poires": 17,
      "chocolat": true
    }
    </pre></body></html>"
    Le résultat est similaire sous Chrome.

    Du coup j’ai tout un tas de questions et je voudrais savoir si vous avez eu des expériences similaires. Est-ce un bug de la console ? J’ai le même comportement sous Firefox et sous Chrome ; est-il possible que ce soit le même bug sur les deux consoles par une troublante coïncidence ? Ou un comportement attendu ? Dans ce cas, est-ce documenté quelque part ?

    Et finalement, est-il possible (même c’est une mise en œuvre stupide) d’accéder à du contenu non HTML via une iframe ?

    Merci d’avance, et désolé pour les nœuds au cerveau
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    Sans JS, avec Chrome -- Version 60.0.3112.32 (Build officiel) beta (64 bits), et avec <iframe src="sampleJSON.php"></iframe> j'obtiens l'affichage direct dans l'iframe.

    Nom : Capture.PNG
Affichages : 79
Taille : 12,1 Ko

    Et dans l'onglet "Elements" je trouve le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <pre style="word-wrap: break-word; white-space: pre-wrap;">{
      "pommes": 42,
      "poires": 17,
      "chocolat": true
    }</pre>

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

Discussions similaires

  1. où se trouve la console sur JBuilder 8?
    Par alaie dans le forum JBuilder
    Réponses: 8
    Dernier message: 19/04/2003, 19h39
  2. [Kylix] Kylix 3 et Applications console
    Par deniscm dans le forum EDI
    Réponses: 2
    Dernier message: 14/01/2003, 13h37
  3. [Kylix] application console avec kylix 3 ?
    Par Hakim dans le forum EDI
    Réponses: 4
    Dernier message: 15/11/2002, 22h45
  4. Réponses: 3
    Dernier message: 02/09/2002, 18h49
  5. Editeur en mode console
    Par logramme dans le forum C
    Réponses: 5
    Dernier message: 11/06/2002, 13h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo