Des livres incontournables pour tout maîtriser

  • CSS2
  • Réussir son site web avec XHTML et CSS
  • PHP 5 avancé
  • Memento CSS
  • Memento XHTML
  • Ergonomie web
  • Bien rédiger pour le web
Auteur
Creak
# 20 Dec 2009 - 16:08:58
Citer
24 Posts
Bonjour,

Je n'y comprend rien, j'ai tenté simplement de parser un fichier XML et il se trouve que ça ne fonctionne pas, sauf si je met window.alert().

Code HTML:
<html>
<head>
<script type="text/javascript">
var xmlParser = null;
if(document.implementation && document.implementation.createDocument)
xmlParser = document.implementation.createDocument('', '', null);
if(!xmlParser)
window.alert("pas de parser xml");

var testXml = {
"init": function(elt, dataFile) {
xmlParser.load(dataFile);

//window.alert("inutile");

var module = xmlParser.getElementsByTagName("Module");

if(!module) {
window.alert("pas de module");
return;
}

if(module.length == 0) {
window.alert("pas de fils");
return;
}

var content = module[0].getElementsByTagName("Content");
var textNode = document.createTextNode(content[0].textContent);
elt.appendChild(textNode);
}
};
</script>
</head>
<body>
<div id="test">
<script type="text/javascript">testXml.init(document.getElementById("test"), "data.xml");</script>
</div>
</body>
</html>


Fichier XML (très simple, pris de l'exemple Hello World de widget de Google):
<?xml version="1.0" encoding="UTF-8" ?> 
<Module>
<ModulePrefs title="hello world example" />
<Content type="html">
<![CDATA[
Hello, world!
]]>
</Content>
</Module>


Si vous décommentez la ligne "window.alert("inutile");", ça marchera...
Je test avec Firefox 3.5.6, sur Linux (Ubuntu)

A l'aide... ça n'a plus aucun sens! sweatdrop
Modifié par Creak (20 Dec 2009 - 17:12)

http://www.foolstep.com 
^
Creak
# 20 Dec 2009 - 17:11:05
Citer
24 Posts
J'ai trouvé!!! Fracking asynchronisation!
Alors, la solution c'est d'attendre le onload du document qui charge le fichier xml.
J'en ai profité pour architecturer le widget, y ajouter le titre au dessus du contenu et de leur donner des nom de classe CSS.

Ca donne donc ceci:
<html>
<head>
<style type="text/css">
div.widget {
width: 300px;
border: 1px solid black;
}

div.widget div.title {
font-variant: small-caps;
background-color: silver;
}

div.widget div.content {
color: gray;
}
</style>

<script type="text/javascript">
var docXml = null;
if(document.implementation && document.implementation.createDocument)
docXml = document.implementation.createDocument('', '', null);
if(!docXml)
window.alert("pas de parser xml");

var testXml = {
"element": null,

"init": function(elt, dataFile) {
docXml.addEventListener("load", testXml.render, false);
docXml.load(dataFile);
testXml.element = elt;
},

"render": function(e) {
var module = docXml.getElementsByTagName("Module");

if(!module || module.length == 0) {
window.alert("No Module tag.");
return;
}

var modulePrefs = module[0].getElementsByTagName("ModulePrefs");
var titleNode = document.createTextNode(modulePrefs[0].getAttribute("title"));
var titleElt = document.createElement("div");
titleElt.className = "title";
titleElt.appendChild(titleNode);
testXml.element.appendChild(titleElt);

var content = module[0].getElementsByTagName("Content");
var contentNode = document.createTextNode(content[0].textContent);
var contentElt = document.createElement("div");
contentElt.className = "content";
contentElt.appendChild(contentNode);
testXml.element.appendChild(contentElt);
}
};
</script>
</head>
<body>
<div id="test" class="widget">
<script type="text/javascript">testXml.init(document.getElementById("test"), "data.xml");</script>
</div>
</body>
</html>


http://www.foolstep.com 
^
Powered by Phedio v3.8.6 beta in 6 ms © dew