2010-08-01 3 views
1

Salut communauté StackOverflow, je HTML, XML, problème JS lié ...Enregistrer fichier XML, JS, XML HTML

Im apprendre un peu de langages de programmation web et en tant que projet, je commencé à faire un JS- jeu de navigateur basé. Sur un projet antérieur, j'ai eu quelques problèmes quand j'ai voulu sauvegarder les Highscores dans une base de données MySQL (de la variable JS à la variable php). Au final, j'ai trouvé un moyen d'éviter cela en plaçant les scores dans un div caché, et en utilisant HTML DOM en plaçant le score sous une forme (JS -> PHP -> MySQL).

Maintenant, sur ce projet, j'ai commencé à utiliser cette technique pour éviter beaucoup de scripts JS, et en utilisant la div cachée comme une sorte de mémoire temporaire. Mais il s'est avéré être un code très désordonné, donc je voulais essayer d'utiliser XML pour mettre des données temporaires loin. J'ai vérifié le site W3-écoles et adapté mon code.

Le jeu est une sorte de jeu à prix réduit (très simple), où chaque jour de prix est renouvelé et vous gagnez de l'argent en vendant des choses que vous avez achetées un jour plus tôt à un prix inférieur. Je voulais enregistrer les prix de la veille, pour faire un menu "Votre profit est: $ ...". Donc, j'ai pensé mettre les données dans un fichier XML, donc je pourrais facilement sauvegarder les données et les rappeler plus tard.

Maintenant, le problème est que les données ne sont pas sauvegardées du tout. Quand je quitte une fonction JS, le fichier XML est 'réinitialisé', toutes les données sont perdues ... Comment puis-je sauvegarder le fichier XML sur le serveur? Pour clarifier les choses, j'ai ajouté mon code, mais je sais que c'est très compliqué (la première fois que j'utilise XML:) ... J'ai donc ajouté quelques commentaires, j'espère que ça aide. Pour concrétiser le problème: lorsque la fonction nextDay() se déclenche, il faut enregistrer les prix du jour précédent, puis renouveler les prix, mais ils ne sont pas sauvegardés.

PriceGame /* Fonction pour randomiser les prix au début d'un nouveau jour */

 function randomPrice(n){ 
      var price; 
      var R; 
      var P; 

      P = n * ((Math.random() * 4)/10) 

      R = Math.random(); 
      if (R > .5) { 
       price = n + P; 
       price = price.toFixed(2); 
       return price; 
      } 

      if (R < .5) { 
       price = n - P; 
       price = price.toFixed(2); 
       return price; 
      } 
     } 





     /* Function that fires when an user clicks on a 'Next day'-button, the prices get reset */ 

     function nextDay(){ 

      /* Acces XML file */ 

      if (window.XMLHttpRequest) { 
       xmlhttp = new XMLHttpRequest(); 
      } 
      else { 
       xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
      } 
      xmlhttp.open("GET", "XML.xml", false); 
      xmlhttp.send(); 
      xmlDoc = xmlhttp.responseXML; 

      /* ERROR: Saving the prices from the day earlier, but this doesn't work */ 

      for (i = 0; i < 26; i++) { /* loop for selecting all of the 26 products */ 
       x = xmlDoc.getElementsByTagName("pricetoday")[i].childNodes[0]; 

       price = x.nodeValue; 
       x = xmlDoc.getElementsByTagName('priceyesterday')[i].childNodes[0]; 
       x.nodeValue = price; 

        } 

/* Je vérifiais si je pouvais demander les valeurs du fichier XML en les mettant dans un div, juste pour voir si cela fonctionne, mais je continue à obtenir une valeur par défaut de mon 'Null' ... */

x = xmlDoc.getElementsByTagName('priceyesterday')[i].childNodes[0]; 
       priceYesterday = x.nodeValue; 
document.getElementById(i+27).innerHTML = priceYesterday; /* Puts prices Yesterday in a div */ 


      /* Renewal of prices */ 

      for (i = 0; i < 26; i++) { 
       x = xmlDoc.getElementsByTagName('pricebase')[i].childNodes[0]; /* the basic price is selected for each product */ 
       basePrice = x.nodeValue; 

       n = parseFloat(basePrice); 
       randomisedPrice = randomPrice(n); /* The basic price is randomised, added or substracted 40% */ 
       x = xmlDoc.getElementsByTagName('pricetoday')[i].childNodes[0]; /* Saves prices in XML file */ 
       x.nodeValue = randomisedPrice; 
      } 



      /* Display price and product */ 

      for (i = 0; i < 26; i++) { 
       x = xmlDoc.getElementsByTagName("product")[i].childNodes[0]; /* Selects productsname, maybe unnessecary, but is saves some HTML code */ 
       product = x.nodeValue; 

       x = xmlDoc.getElementsByTagName("pricetoday")[i].childNodes[0]; 

       price = x.nodeValue; 

       document.getElementById(i + 1).innerHTML = product + ": $" + price; /* Displays products and according price */ 
      } 




      /* adds a day */ 

      x = xmlDoc.getElementsByTagName('day')[0].childNodes[0]; 
      xparsed = parseFloat(x.nodeValue); 
      dayAdded = xparsed + 1; 

      x.nodeValue = dayAdded; 
      document.getElementById('daycount').innerHTML = dayAdded; /* Displays the number of days passed */ 
     } 

     /* Function that fires onload, sets the day-count to 1 and resets the prices to random values */ 
     function newDay(){ 

/* Acces XML file */ 

      if (window.XMLHttpRequest) { 
       xmlhttp = new XMLHttpRequest(); 
      } 
      else { 
       xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
      } 
      xmlhttp.open("GET", "XML.xml", false); 
      xmlhttp.send(); 
      xmlDoc = xmlhttp.responseXML; 

      /* Renewal of prices */ 

      for (i = 0; i < 26; i++) { 
       x = xmlDoc.getElementsByTagName('pricebase')[i].childNodes[0]; 
       basePrice = x.nodeValue; 

       n = parseFloat(basePrice); 
       randomisedPrice = randomPrice(n); 

       x = xmlDoc.getElementsByTagName('pricetoday')[i].childNodes[0]; 
       x.nodeValue = randomisedPrice; 
      } 



      /* Display price and product */ 

      for (i = 0; i < 26; i++) { 
       x = xmlDoc.getElementsByTagName("product")[i].childNodes[0]; 

       product = x.nodeValue; 

       x = xmlDoc.getElementsByTagName("pricetoday")[i].childNodes[0]; 

       price = x.nodeValue; 

       document.getElementById(i + 1).innerHTML = product + ": $" + price; 

      } 

      /* set daycounter to 1 */ 

      x = xmlDoc.getElementsByTagName("day")[0].childNodes[0]; 
      x.nodeValue = 1; 



     } 
    </script> 

Répondre

1

Vous n'envoyez le document XML modifié au serveur nulle part. La mise à jour de l'arborescence DOM sur le client ne la met pas à jour par magie sur le serveur: vous devrez faire une autre requête XmlHttp pour y parvenir.

+0

Après quelques regardant autour, il semble que vous pouvez récupérer des données à partir d'un fichier XML en l'insérant dans un objet DOM, mais vous ne pouvez pas le renvoyer au serveur ... D'autres suggestions? – 3sdmx

0

Lorsque vous avez le document DOM final, postez-le sur une page php qui enregistrera le fichier XML.

<?php 

// Prenez domtree de votre jsscript sur une autre page que vous avez posté ici // Manipulez dom $xml = $_POST['value']; $xml_to_add=new DOMDocument(); $xml_to_add->loadXML($xml); $xml_root=$xml_to_add->documentElement;

// Obtenez le fichier que vous souhaitez modifier sur le serveur (certains xml fichier)

$xdoc = new DOMDocument(); 
    $xdoc->load($file); 

// va Voici un code où vous pouvez tout remplacer dans ce fichier, ou de le modifier en utilisant la valeur affichée

// Mais quand vous avez terminé, vous voulez enregistrer votre fichier sur le serveur $xdoc->save($file);

?>

Questions connexes