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 :

Fichier js et XMLHttpRequest


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Façonnier
    Inscrit en
    Août 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Façonnier
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 31
    Par défaut Fichier js et XMLHttpRequest
    Bonjour,

    après moutl recherches j'en viens a demander votre aide parce que je ne comprends pas, et que je n'ai pas trouvé pour satisfaire ma compréhension sur le net.
    je suis en formation entre autres de Javascript et pour nous apprendre de façon ludique tout ce que l'on peut faire avec ce langage, comme exercice notre prof nous a demandé de faire un jeu, celui que l'on voulait. J'ai opté pour un pendu que j'ai réussi à coder (sans triche de recopie). Tout était merveilleux pour moi quand le prof me dit "c'est super mais il faut créer un fichier js et un fichier HTML".
    Le script fonctionne entre les balises <script></script> de ma feuille HTML, mais pas dans mon fichier js pourtant déclaré dans le fichier HTML de cette manière juste au-dessus de la balise </body>:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <script  src="js/jquery.js"></script>
    puis mon fichier js
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <script  src="js/pendu.js"></script>
    le problème vient d'une fonction qui ouvre un fichier texte. C'est celle-ci :
    Code : 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
    30
    31
    32
     
    function fichier_txt(fich) // ouvre le fichier texte qui est mon dico
    	{
    		if(window.XMLHttpRequest) 
    		{
        		obj_pers = new XMLHttpRequest(); //Pour Chrome, Firefox, Opera et les autres...
    		} 
    		else if(window.ActiveXObject) 
    		{
        		obj_pers = new ActiveXObject("Microsoft.XMLHTTP"); //Pour Internet Explorer
    		}
    		else
    		{
        		return(false);
    		}
     
    		if (obj_pers.overrideMimeType) 
    		{
        		obj_pers.overrideMimeType("text/xml"); //Évite un bug de Safari
    		}
    		obj_pers.open("GET", fich, false);
    		obj_pers.send(null);
     
    		if(obj_pers.readyState == 4) 
    		{
        		return(obj_pers.responseText);
    		}
    		else 
    		{
        		return(false);
    		}
    	} // Fin de la fonction fichier_txt
    Il déclare comme indéfini tout ce qui touche cette variable, si toutefois s'en est une, "obj_pers". quand je dis plus haut sans triche ni copie, il y a une exception, cette fonction dont je ne comprends pas grand chose et qui ouvre mon fichier.
    Autant tout fonctionne très bien quand ce fichier se trouve dans la page HTML à l'intérieur des balises <script></script>, autant il bloque tout dans le fichier js.
    par avance je vous remercie pour votre attention et aide

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

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Salut,

    fais attention à l’ordre dans lequel tu inclus tes scripts dans ta page. Par exemple, jQuery doit être inclus avant tout script qui utilise ce framework. (En l’occurence, ton script n’en a pas besoin).

    Tu dois également t’assurer que le DOM (la représentation interne des éléments HTML) a eu le temps de se construire au moment où ton script s’exécute, si jamais ton script utilise des éléments de la page. Concrètement, si tu as un bouton qui appelle ta fonction, ton script doit être inclus après le bouton. Une bonne pratique est de surveiller les évènements indiquant que la page est prête, par exemple l’évènement 'DOMContentLoaded' en JavaScript vanilla (vanilla ça veut dire sans framework), ou encore la fonction $(document).ready() en jQuery.

    Puisque tu débutes en JavaScript, autant prendre de bonnes habitudes tout de suite.

    Utilise le mode strict : il suffit d’ajouter la chaîne 'use strict' au tout début de ton fichier, ou au début de tes fonctions. Ça permet, entre autres, de voir certaines erreurs qui passeraient silencieusement en mode non strict, et de repérer plus facilement des variables accidentellement déclarées globales.

    Développe toujours avec la console ouverte. C’est la touche F12. On y trouve les erreurs du script, ainsi qu’une ligne de commande et tout un tas d’autres outils très utiles.

    Prends l’habitude de consulter la documentation quand tu ne sais pas comment faire ce que tu veux. Le MDN est une bonne ressource, exemple : https://developer.mozilla.org/fr/doc...XMLHttpRequest




    En ce qui concerne ton problème actuel, je ne peux pas t’aider si je ne vois pas de quelle façon tu appelles cette fonction fichier_txt.
    Par contre je peux t’expliquer rapidement ce que fait cette fonction dont tu ne comprends pas grand chose. D’abord il y a cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if (window.XMLHttpRequest) {
        obj_pers = new XMLHttpRequest(); //Pour Chrome, Firefox, Opera et les autres...
      } else if (window.ActiveXObject) {
        obj_pers = new ActiveXObject('Microsoft.XMLHTTP'); //Pour Internet Explorer
      } else {
        return false;
      }
    Ce bout de code se charge de créer un objet Ajax en fonction du navigateur. La partie qui gère les ActiveX, tu peux la virer, à moins que tu aies absolument envie de faire fonctionner ta page avec IE6, dans ce cas je te souhaite bon courage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if (window.XMLHttpRequest) {
        obj_pers = new XMLHttpRequest(); //Pour Chrome, Firefox, Opera et les autres...
      } else {
        return false;
      }
    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      if (obj_pers.overrideMimeType) {
        obj_pers.overrideMimeType('text/xml'); //Évite un bug de Safari
      }
    La partie qui teste overrideMimeType mentionne un bug avec Safari. Ça ne fait pas beaucoup de sens de tester si overrideMimeType existe, et de continuer même si cette méthode n’existe pas. On n’est pas sûr de quel sera le type de réponse si cette méthode n’est pas appelée, et ça rend le script moins fiable. Il serait plus prudent de retourner false.

    Une note à propos du type text/xml : avec ce type, le navigateur va automatiquement tenter d’interpréter le fichier qu’il reçoit comme du XML. Or, le XML a des règles de syntaxe beaucoup plus strictes que le HTML, et il n’est pas rare que les serveurs ne respectent pas ces règles. Du coup, l’interprétation échoue silencieusement et obj_pers.responseXML renvoie null. Dans le cas présent tu n’utilises pas responseXML, donc ce n’est même pas la peine de demander du XML. Au final, tu peux carrément virer toute cette partie.

    Enfin,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      obj_pers.open('GET', fich, false);
      obj_pers.send(null);
      if (obj_pers.readyState === 4) {
        return obj_pers.responseText;
      } else {
        return false;
      }
    }
    Tu ouvres la requête en mode synchrone (le 3e paramètre est false). J’attire ton attention sur le fait que le « A » de Ajax signifie asynchrone, autrement dit une requête en mode synchrone ce n’est pas de l’Ajax. Et c’est largement considéré comme une mauvaise pratique. Mais pour le moment, on va rester avec ça car c’est légèrement plus simple à apprendre.

    Le test sur readyState ne sert à rien car la requête bloque l’exécution de JS (parce qu’elle est en mode synchrone). Quand l’exécution reprend, la requête est terminée donc son readyState est forcément égal à 4. Tu peux virer cette ligne également.

    Au final, voilà à quoi ressemble maintenant ta fonction :
    Code : 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
    function fichier_txt(fich) {
      'use strict'; // active le mode strict
     
      var obj_pers; // il faut déclarer la variable, sinon elle est globale
     
      if (window.XMLHttpRequest) {
        obj_pers = new XMLHttpRequest();
      } else {
        return false;
      }
     
      obj_pers.open('GET', fich, false); // false -> requête synchrone
      obj_pers.send(null);
     
      return obj_pers.responseText;
    }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre averti
    Homme Profil pro
    Façonnier
    Inscrit en
    Août 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Façonnier
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 31
    Par défaut
    Bonjour Watilin
    Je m'excuse pour le retard à répondre à ce post, mais toute cette semaine nous étions à fond sur PHP et je n'ai pu m'occuper de avant ce matin de ce que j'avais demandé ici.
    Je te remercie pour tes conseils, j'ai eu l'impression d'entendre avec les yeux ce que mes oreilles entendent pendant les cours de la part de mon prof. Ce n'est absolument pas une critique, au contraire j'ai trouvé ça génial.
    Pour ce qui est de la fonction expliquée dans le détail et retravaillée par tes soins, je ne dis pas que je serais capable de la refaire sans aide mais pour le coup les scripts dans un fichiers js ne posent plus de problème. Mon programme fonctionne parfaitement. Alors encore merci pour ton aide et tes explications détaillées. Je me suis servi de quelque chose dont je ne maitrisais pas du tout les tenants et les aboutissements. Je n'ai pas encore vu le langage Ajax. Peut-être j'ai été un peu vite... Merci.
    Ce post est donc résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2007, 14h08
  2. XMLHttpRequest ouvrant un fichier présent sur un autre serveur
    Par LeSkaMan dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 22/01/2007, 19h08
  3. [AJAX] Upload de fichier
    Par hedgehog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/10/2006, 07h57
  4. XMLHTTPRequest et interception de fichier inexistant
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 06/09/2005, 15h35

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