Ajouter le Forum à vos Favoris
- - - -
Vous êtes ici : Forum Pen Of Chaos > Divers > Informatique - Jeux Vidéos > Section OS - Software > Javascripting
Sujet : 

Dernier Message - Message le plus récent
Ajouter aux favoris - Envoyer ce Sujet par E-Mail - Imprimer ce Sujet
Faeldihn

Pal pas triste



-= Chaos Elite Troops =-
Inscription le 12-07-04
Messages : 3384



Homme  Age : 54 ans
Lieu de résidence : 20e Nuit Lutècienne

Pourquoi vous regardez ca ?
Membre Chaos Elite Troops   Javascripting a été posté le : 28/01/10 11:15
Bonjour à vous...
Ne voyant pas de sujet large sur les problèmes en JS et ne voulant pas créer un sujet sur mon seul problème du moment (il risque d'y en avoir d'autres), je lance un grand Q/R sur JS.

Tout le monde est libre d'exposer ici ses soucis JS.



Contexte du problème du moment:
- Page en XHTML strict.
- Fichier CSS externe.
- DEUX fichiers JS
- - un permanent
- - l'autre devant être généré à la volée par une appli C++

Le permanent doit appeler une fonction du généré à l'ouverture.
Le proto (nom, argts) de cette fonction est invariable, seul le contenu de celle-ci est produit par l'appli externe.

Tout marche pour UN nom de fichier JS généré entré en dur. L'appelant appelle la fonction du généré comme il se doit:
Citation :
var ctnr=document.getElementById("Poolbox");

var feedscrpt=document.createElement('script');
feedscrpt.src="Generated.js";
document.body.appendChild(feedscrpt);

feedPool(ctnr);
Et je pré-supposais que la ligne en gras (avec ou sans "body." ou "head.") jouait le rôle d'une ligne:
<script type="text/javascript" src="Generated.js"></script>
dans l'en-tête ou le corps du XHTML, mais...

Problème du moment:
A l'exception d'IE, qui prend tout et n'importe quoi, et Opera qui en est assez proche, FF et les browsers WebKit comme Safari requièrent en en-tête du XHTML la ligne:
<script type="text/javascript" src="Generated.js"></script>
sous peine de ne pas trouver la fonction appelée.

Malheureusement, pour les besoins de ce projet, Generated.js doit finir en variable et pouvoir être modifié par du script de l'appelant (sur récupération du nom de fichier balancé par l'appli). L'appli externe pouvant générer différents traitements à la volée avant d'afficher l'interface dans un browser (webkit en l'occurence).

Quelqu'un sait-il pourquoi j'ai besoin de cette ligne en en-tête pour que ça tourne sur mes cinq browsers de test, et s'il y a une ruse pour permettre l'appel de fonction dans X fichiers javascripts générés?

P.S. J'envisage une autre solution plus bourrine, mais niveau modularité/support, j'y perdrais grandement... donc... tout indice est bienvenu.

Merci.


--------------------
CREO ERGO SUM

"Commencez vous à voir quelle sorte de monde nous créons? [...] Un monde d'écraseurs et d'écrasés, un monde qui, au fur et à mesure qu'il s'affinera, deviendra plus impitoyable."
1984, Georges Orwell


      Retour en haut de la page IP Cachée  
MageGaHell

Vieux Con



-= Chaos Legions =-
Inscription le 13-05-02
Messages : 1318



Homme  Age : 46 ans
Lieu de résidence : Symbole de Paix

Pourquoi vous regardez ca ?
   Réponse au Sujet 'Javascripting' a été posté le : 28/01/10 17:04
Je ne suis pas un as en javascript, quand XHTML strict, c'est pour les intégristes et pas pour la vrai vie...

Néanmoins, peut être que comme ça, en rajoutant juste un "type" :
Dans ton cas, à la place de la fonction, tu devrais pouvoir mettre :
Citation :

var feedscrpt=document.createElement('script');
feedscrpt.type="text/javascript";
feedscrpt.src="Generated.js";
document.body.appendChild(feedscrpt);



NB : c'quoi ce blog de no-geek où y'a pas [code][/code] ^^

NB 2 : Dieu m'a soufflé cette fonction comme exemple :
Citation :

function addScript(src) {
var header = document.getElementsByTagName("head" );
var newScript = document.createElement("script" );
newScript.type="text/javascript";
newScript.src=src;
header[0].appendChild("script" );
}


En espérant que ça te serve (tiens, d'ailleurs moi j'aurais mis 2 variables, à cette fonction : scr et une variable pour définir où insérer mon bousin. Et j'aurais fait plutôt un getElementById).


Dernière mise à jour par : MageGaHell le 28/01/10 17:23

--------------------
"L'Infini ?
...Prenez la taille de mon ego et ça vous paraîtra petit..."

Aerth, récits fantastiques
...Et en plus il écrit et il blog...


      Retour en haut de la page IP Cachée  
Faeldihn

Pal pas triste



-= Chaos Elite Troops =-
Inscription le 12-07-04
Messages : 3384



Homme  Age : 54 ans
Lieu de résidence : 20e Nuit Lutècienne

Pourquoi vous regardez ca ?
Membre Chaos Elite Troops   Réponse au Sujet 'Javascripting' a été posté le : 28/01/10 19:58
Bien vu pour le type, je l'ai toujours pas intégré.
Par contre, dans le head, ça sert à rien, je sais pas pourquoi j'ai parlé de ça tout à l'heure. Au moment où on ouvre la page, le head est parcouru et le body chargé au lancement du script principal d'init qui appelle le secondaire.
Du coup, je peux l'ajouter que dans le body.

Par contre j'ai pigé une erreur. Il me faut garder le script d'init à part dans un premier JS permanent en head du HTML et le reste du code appelant les JS externes dans un autre JS permanent que je n'ajouterai au body qu'une fois l'ensemble des JS générés produits et appendés... sinon, pas moyen de les appeler. Banané le Faeldihn.

Bon, je finis mon parseur LUA, je casse mon JS en deux, j'ajoute le type et je te dis si ça tourne.

Merci MG!

P.S. Pour le XHTML... ben oui, je bosse avec un intégriste... comme ça on est deux. ;)


--------------------
CREO ERGO SUM

"Commencez vous à voir quelle sorte de monde nous créons? [...] Un monde d'écraseurs et d'écrasés, un monde qui, au fur et à mesure qu'il s'affinera, deviendra plus impitoyable."
1984, Georges Orwell


      Retour en haut de la page IP Cachée  
Faeldihn

Pal pas triste



-= Chaos Elite Troops =-
Inscription le 12-07-04
Messages : 3384



Homme  Age : 54 ans
Lieu de résidence : 20e Nuit Lutècienne

Pourquoi vous regardez ca ?
Membre Chaos Elite Troops   Réponse au Sujet 'Javascripting' a été posté le : 03/02/10 10:09
J'le voyais venir gros comme un camion... le nouveau hic.

Bon, le nouvel écueil est assez comique puisque maintenant que toute fonctionnalité est testée et validée sous webkit (et ne tourne plus sur IE), ce nouveau point ne tourne, lui, QUE sur IE. Alors j'ai fait quelques recherches mais ne trouve rien qui m'explique mon problème.

Contexte:
Classes personnelles créées (je cleane et renomme pour plus de lisibilité).
(Le problème reste avec la version cleanée)
Citation :
function Mom(nom)
{
this.name=nom;
this.toString=function() { return "aMom"; };
}


Je crèe une instance de cette chose
Citation :
var theMommy=new Mom('LaVieille');


J'associe LaVieille à un div du document en le collant dans un custom attribute de celui-ci, en en faisant un objet modèle...
Citation :
var obj=document.createElement("div");
obj.id="ObjetPourManipulerLaVieille";
obj.setAttribute("modelobj",theMommy);


Problème:
Et là, normalement, quand je clique sur l'objet et que j'affiche son contenu...
Citation :
var monobjvisible=document.getElementById("ObjetPourManipulerLaVieille");
var mdlobj=monobjvisible.getAttribute("modelobj");
alert("Modelobj["+mdlobj+"] Name["+mdlobj.name+"]");
...je m'attends à avoir au moins son nom:
Modelobj[aMom] Name[LaVieille]

Or, si ça marche sur IE... sur les autres (FF, Opera, Safari, etc...) je n'ai que:
Modelobj[aMom] Name[undefined]

Le fait que le toString s'affiche bien me semble confirmer que j'ai bien récupéré le bon objet, mais pourquoi ne trouve-t-il pas son nom?

Je me demandais s'il n'y avait pas un plan instantiation par copie un peu foireux au lieu d'une référence directe à l'objet par pointeur... mais je ne vois pas comment démèler le problème.

Edit:
Si je fais un display de l'instance, j'ai la bonne valeur, mais le but est ici de récupérer le modèle via un objet interface
Citation :
var mdlobj=theMommy;
alert("Modelobj["+mdlobj+"] Name["+mdlobj.name+"]");
sur tout browser donne bien:
Modelobj[aMom] Name[LaVieille]

Edit 2:
Le setAttribute de l'objet (ou setAttributeNode en créant un attrnd avec en valeur l'objet) ne marche pas sur eux visiblement car ils traitent son argument passé comme chaine de caractère... donc en fait, l'attribut contient le toString de l'objet au lieu de l'objet (contrairement à IE).
Le problème est donc alors que l'objet modèle n'étant pas dans le DOMtree, il n'est pas récupérable par les getElementBy.
Je crains de devoir faire un dico pour retrouver l'objet à partir de son toString... solution lente et crade.

Edit 3:
En attendant une suggestion, j'enliste dans un dico nom/objet, ça marche sur tous les browsers, mais beurk.


Dernière mise à jour par : Faeldihn le 03/02/10 13:31

--------------------
CREO ERGO SUM

"Commencez vous à voir quelle sorte de monde nous créons? [...] Un monde d'écraseurs et d'écrasés, un monde qui, au fur et à mesure qu'il s'affinera, deviendra plus impitoyable."
1984, Georges Orwell


      Retour en haut de la page IP Cachée  
Faeldihn

Pal pas triste



-= Chaos Elite Troops =-
Inscription le 12-07-04
Messages : 3384



Homme  Age : 54 ans
Lieu de résidence : 20e Nuit Lutècienne

Pourquoi vous regardez ca ?
Membre Chaos Elite Troops   Réponse au Sujet 'Javascripting' a été posté le : 09/07/10 11:22
Rebonjour...

J'ai un nouveau problème mais de communication JavaScript - PHP, cette fois.

En autodidacte surfeur de base, je récupère les indices que je peux sur différents sites et je ne trouve pas toujours d'info complètes ou simplement des exemples qui ne se comportent pas comme ils sont supposés le faire à la lecture des descriptifs/explications.

Mon problème ici...
J'appelle un code PHP (sur un évènement HTML DOM via JS) qui est supposé me retourner une valeur en réponse (à une requête XHR avec paramètre) que le JS doit pouvoir réutiliser.

Pour ce faire, les portions de codes relatives au problème sont (en version simplifiée mais toujours aussi peu fonctionnelle):
Citation :
Code JS

var dsp=<un div du document>;
var xhr=null;

function appel(){
var act="Codes/getResp.php?k="+encodeURIComponent(document.getElementById("keyFld").value);
// DANS L'INPUTTXT keyFld ON TAPE "clefA" OU "clefB" POUR CET EXEMPLE

if(xhr=newAjaxRequest()){
xhr.onreadystatechange=reception;
xhr.open("GET",act,true);
xhr.send();
}
}

function reception(){
if(xhr.readyState==4){
if(xhr.status==200){
var res=xhr.responseText;
if(res.length){
dsp.innerHTML=res;
}
else
dsp.innerHTML="REPONSE&nbsp;VIDE";
}
else
dsp.innerHTML="PAS&nbsp;DE&nbsp;REPONSE";
}
}
Citation :
Code PHP (Codes/getResp.php)
<?php

$a["clefA"]="ReponseA";
$a["clefB"]="ReponseB";
...

$clf=$_GET["k"];
$response="";

if(strlen($clf)>0)
{
$response=$a[$clf];
}

echo $response;
?>

Si je fais, côté PHP, une sauvegarde dans un fichier de $response juste avant l'echo, la variable contient bien "ReponseA" ou "ReponseB"...

D'après W3C, le echo $response est supposé faire le retour, si j'ai bien compris...

Or, côté JS, je me retrouve dans la reception() avec le readyState à 4 mais le status à 0, ce qui bien évidemment ne colle pas.
xhr.responseText est donc vide et xhr.responseXML nulle.

J'ai déjà une autre xhr qui tourne pour une autre fonctionnalité mais, même si je trouve dans responseText le contenu du fichier que j'ouvre côté serveur, là encore j'ai un status à 0.

Qu'est-ce qui explique que je n'ai jamais le status à 200, ni même 404, et comment, à défaut, récupérer une réponse du PHP?

Merci.


--------------------
CREO ERGO SUM

"Commencez vous à voir quelle sorte de monde nous créons? [...] Un monde d'écraseurs et d'écrasés, un monde qui, au fur et à mesure qu'il s'affinera, deviendra plus impitoyable."
1984, Georges Orwell


      Retour en haut de la page IP Cachée  
MageGaHell

Vieux Con



-= Chaos Legions =-
Inscription le 13-05-02
Messages : 1318



Homme  Age : 46 ans
Lieu de résidence : Symbole de Paix

Pourquoi vous regardez ca ?
   Réponse au Sujet 'Javascripting' a été posté le : 12/07/10 14:13
Hummm, j'ai pas trop le temps de faire quelques tests, aussi je te file ce que j'utilise habituellement comme fonctions, plus ou moins adapté pour coller avec ton cas.
D'abord, l'appel ajax :
Citation :

function appel(){
/* Création objet XMLHttpRequest */
var xhr = null;
if (window.XMLHttpRequest) { //Firefox ou IE >= 7.0
xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try { // essaie de charger l'objet pour IE
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try { // essaie de charger l'objet pour une autre version IE
xhr = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
window.alert("Votre navigateur ne prend pas en charge l'objet XMLHTTPRequest.");
}
}
}
/*Construction des paramètres*/
var build_url = "Codes/getResp.php?k="+encodeURIComponent(document.getElementById('keyFld').value);
/* Ecoutons les changements et lançons la fonction voulue */
xhr.onreadystatechange = function() { reception(xhr); }; // fonction à utiliser
xhr.open('GET', build_url, true); //methode, fichier à appeller, synchrone ou non (si oui, attente avant de poursuivre)
xhr.send(null); //entete http
}


Et pour l'affichage :
Citation :

function reception(xhr){
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var currentResultat = xhr.responseText; //recuperation de la reponse du fichier php
var dsp=document.getElementById('un div du document');
dsp.innerHTML = xhr.responseText;

} else {
alert('Un problème est survenu avec la requête.');
}
}
}



A voir si on rend dynamique dsp pour un affichage plus fin "là où l'on veut".
Mais normalement, ça devrait marcher (espérons).

Je ne suis pas spécialiste, mais quand je me bat contre le javascript, je met des alert un peu partout (notamment un alert(build_url); dans la première fonction, pour voir si ça me prends bien mes paramètres/mon chemin).


--------------------
"L'Infini ?
...Prenez la taille de mon ego et ça vous paraîtra petit..."

Aerth, récits fantastiques
...Et en plus il écrit et il blog...


      Retour en haut de la page IP Cachée  
Faeldihn

Pal pas triste



-= Chaos Elite Troops =-
Inscription le 12-07-04
Messages : 3384



Homme  Age : 54 ans
Lieu de résidence : 20e Nuit Lutècienne

Pourquoi vous regardez ca ?
Membre Chaos Elite Troops   Réponse au Sujet 'Javascripting' a été posté le : 12/07/10 15:04
C'est bien ce que je fais aussi, et je passe bien dans reception() si c'est l'idée.

J'ai depuis avant-hier soir un truc qui tourne sans que je sache pourquoi et CA, ça a sérieusement le don de m'énerver. Enfin... quand je dis ça tourne... ça tourne sans le test du status à 200, donc c'est pas propre non plus.
Et je ne trouve toujours pas ce qui fait que ce status reste à 0 en toutes circonstances.

Ce soir j'essaie ton astuce de:
xhr.onreadystatechange = function() { reception(xhr); };
que je réécrirai peut-être plutôt
xhr.onreadystatechange = function() { reception(this); };
si je dis pas de faeldihnerie...

Par contre j'ai règlé mon problème d'exécution bancale selon webkit apple (IE, FF, Ope et Chrm tournaient mais Safari était dans les choux pour une histoire de getElementById préféré à un référencement direct).


Dernière mise à jour par : Faeldihn le 12/07/10 15:06

--------------------
CREO ERGO SUM

"Commencez vous à voir quelle sorte de monde nous créons? [...] Un monde d'écraseurs et d'écrasés, un monde qui, au fur et à mesure qu'il s'affinera, deviendra plus impitoyable."
1984, Georges Orwell


      Retour en haut de la page IP Cachée  
Faeldihn

Pal pas triste



-= Chaos Elite Troops =-
Inscription le 12-07-04
Messages : 3384



Homme  Age : 54 ans
Lieu de résidence : 20e Nuit Lutècienne

Pourquoi vous regardez ca ?
Membre Chaos Elite Troops   Réponse au Sujet 'Javascripting' a été posté le : 15/07/10 13:50
Bon ben, la petite astuce ne change rien au problème qui reste.

Les XHRs balancées pour charger un contenu de fichier dans un div passent sans problème, tout navigateur confondu, même si certains ont un peu plus de mal que d'autres (status nul).

Quant aux XHRs appelant un code PHP pour récupérer un path, elles tournent sous FF et IE, mais les interfaces webkit-like comme Opera, Chrome et Safari ne répondent tout simplement pas avec de petites différences de l'une à l'autre de ces trois là, comme un retour de path vide pour Opera (qui opère quand même le logging par le code PHP), un "Failed to load resource" pour Safari et pas de retour du tout pour Chrome et pas de logging de l'exécution PHP pour ces deux là.
En résumé, on n'exécute même pas le code PHP avec Saf et Chr, il s'exécute mais on n'a pas de retour lisible avec Ope, et finalement, FF et IE prennent une réponse malgré un status qui traine à 0.
Rien de normal donc.

Seule différence constatée entre l'inspector des uns et le firebug de l'autre: les en-têtes de requête sont de deux lignes (referer, user-agent) pour les inopérants et complets avec les neufs champs pour ceux pour lesquels ça tourne, bien que la requête soit la même (vérifié à grands coups d'alert et de débug).

Je ne suis visiblement pas le seul avec ce soucis...

Soupçon sur le space dans lequel on se trouve avant, pendant et après le traitement de la XHR et l'exécution du code PHP, mais comment contourner une telle ambiguité... pfrrrrt!
Le caching interfèrerait-il?


Dernière mise à jour par : Faeldihn le 15/07/10 14:10

--------------------
CREO ERGO SUM

"Commencez vous à voir quelle sorte de monde nous créons? [...] Un monde d'écraseurs et d'écrasés, un monde qui, au fur et à mesure qu'il s'affinera, deviendra plus impitoyable."
1984, Georges Orwell


      Retour en haut de la page IP Cachée  
Faeldihn

Pal pas triste



-= Chaos Elite Troops =-
Inscription le 12-07-04
Messages : 3384



Homme  Age : 54 ans
Lieu de résidence : 20e Nuit Lutècienne

Pourquoi vous regardez ca ?
Membre Chaos Elite Troops   Réponse au Sujet 'Javascripting' a été posté le : 16/07/10 07:38
Il s'agit bien d'interférence mais pas du cache.

Un certain Markos a trouvé la raison:
On se sert en général d'une XHR pour récupérer un contenu de fichier, là, aucun problème... ou pour récupérer une réponse du serveur en fonction d'une donnée qu'on lui refile.
La donnée refilée en question est souvent une chaine entrée par l'utilisateur dans une entrée texte implicitement partie d'un formulaire (ce qui est, ironie chérie, la raison première de l'invention des XHRs et AJAX).
Or l'envoi d'une XHR sur un évènement sans bloquer la soumission du formulaire (avec un return false dans le submit, par exemple) entraine ce comportement bizarre.

L'origine du problème est donc dans le formulaire utilisé et le non-blocage de son submit (c.f. la piste trouvée).

J'aurais pu chercher longtemps, car aucun débugger ne donne de signe qui laisse penser de prime-abord à ce petit jeu de "j'te *******e sur les pompes" entre traitements.

Et j'ai beau relire la page de référence W3C pour la XHR... je ne vois pas l'évocation du problème.

Merci Markos.


--------------------
CREO ERGO SUM

"Commencez vous à voir quelle sorte de monde nous créons? [...] Un monde d'écraseurs et d'écrasés, un monde qui, au fur et à mesure qu'il s'affinera, deviendra plus impitoyable."
1984, Georges Orwell


      Retour en haut de la page IP Cachée  
Ajouter aux favoris - Envoyer ce Sujet par E-Mail - Imprimer ce Sujet
Dernier Message - Message le plus récent
Pages: [ 1 ]

Open Bulletin Board 1.X.X © 2002 Prolix Media Group. Tous droits réservés.
Version française, modules et design par Greggus - enhancement par Frater