11548 sujets

JavaScript, DOM et API Web HTML5

J'ai un problème pour lire avec Javascript des "strings" de grande longueur (11000 caractères et plus)
Le string est obtenu par la lecture d'un noeud dans un fichier Google Earth (XML) représentant les points d'un parcours :
instruction : data = node.firstChild.nodeValue;
puis passage à une fonction : function Calcul(valeur, compteur)

Problème :

* IE8 lit complètement le string et le résultat est "conforme"
* FF3.5 lit partiellement le string (sans message d'erreur) et le résultat est incomplet (calcul sur une partie du trajet)..

Dans FF3.5 si je remplace dans l'exécutable data en copiant directement sa "vraie valeur" :
instruction data = "43.5678899 6.4784332 450.456... suite....." le résultat est correct.

En plus :
Avec les 2 navigateurs si je veux connaître la longueur du string avec :
alert('Longueur string : ' + data.lenght );
J'obtiens "undefined" dans les 2 cas soit en lisant la variable soit en lisant la "vraie valeur".
Je pensait utiliser ce test pour éviter les résultats erronés...

Pour terminer si je vais sur le site :
http://pagesperso-orange.fr/philippe.medan/jvs/jschaines1.htm#longueur
en faisant un copié / collé j'obtiens la longueur du string sans problème !

J'ai compris en cherchant sur le Web que la longueur d'un maximum string dépend de l'environnement mais cela n'explique pas les comportements ci-dessus.

Si quelqu'un peut m'expliquer comment m'en sortir (attention retraité autodidacte!)
Modifié par cyrano25550 (16 Jan 2010 - 23:00)
C'est original comme problème ^^.
C'est bien la première fois que je vois quelqu'un essayer de manipuler un aussi gros blob de données en javascript.

La solution à appliquer quand on traite de gros volume de données qu'on ne peut pas adresser entièrement en mémoire, c'est de faire appel à un stream. Le principe du stream, c'est grosso-modo une interface qui te permet de manipuler une partie de ton blob et d'avancer au fur et à mesure, en deux mots c'est l'application informatique du "flux tendu".

Bien sûr, tu t'en doute probablement, javascript n'a pas vraiment été bâti dans l'optique de manipuler des fichiers entiers, et donc les API standards ne te proposent pas de streams. Il va donc falloir mettre les mains dans le cambouis et en développer une toi-même.
En récupérant des morceaux de ton noeud via substring, je pense que tu devrais pouvoir arriver à tes fins.

Pour l'exemple, voici l'interface d'un stream sur la plateforme java :
http://java.sun.com/j2se/1.4.2/docs/api/java/io/StringReader.html
publicaccount merci pour ta réponse.
J'ai réussi à comprendre ce qui se passe après recherche plus approfondie sur le web.

En synthèse car j'ai trouvé beaucoup de questions et discussions sur les strings :
* Il y a deux types de string. Voir lien http://skypoetsworld.blogspot.com/2007/11/javascript-string-primitive-or-object.html
* La longueur maximum du string dépend de l'environnement : http://bytes.com/topic/javascript/answers/510223-string-length-question
* J'ai trouvé que les deux types de string ne se comportent pas de le même façon (longueur maxi et réponse de la méthode "lenght" : il faut convertir le string pour ne pas obtenir "undifined").

Longueur maxi du string litéral avec FF3.5 : 2 puissance 37 pour IE8 2 puissance 38 (ça donne de la marge dans les 2 cas !).
IE donne le message "memory overflow" en cas de dépassement, FF ne dit rien.

Par contre si l'on lit un noeud la valeur du string est tronquée à 4096 caractères pour Firefox (sans message d'erreur) je n'ai pas la limite de IE (pas de problème jusqu'à 180 000 caractères ce qui est largement suffisant.).

En conclusion, en tenant compte des remarques ci-dessus, cela marche avec IE pas avec FF (je vais tester les autres navigateurs)
Maintenant il faut que je vois pour marquer cette question comme soldée....
Remarque en passant, tu as écrit:
data.lenght

La popriété lenght n'existe pas (et donc retourne undefined), mais par contre length devrait exister et retourner un entier. À tester à nouveau sans la faute?
Modifié par Florent V. (17 Jan 2010 - 11:49)