1

Bon, je rencontre un problème de merde...
[source=js] /* Passe toutes les valeurs de base, et la met dans destination lorsqu'elle vaut value (utilisé pour donner une bonne valeur et un bon texte affiché pour les options */
function add_selectedValue(value, base, destination)
{
var src = document.getElementById(base);
var dest = document.getElementById(destination);

for (var idx=0; idx<src.options.length; idx++)
{
//alert(parseFloat(src.options[idx].value) == parseFloat(value));
if (parseFloat(src.options[idx].value) == parseFloat(value))
{
var newOption = document.createElement('option');
newOption.text = src.options[idx].text;
newOption.value = src.options[idx].value;
dest.options[dest.length]=newOption;
}
}
}[/source]
Value est un entier (10, 20, 30...).
base est l'id d'un select simple
destination est l'id d'un select multiple

Mon select "base" est peuplé avec des données de type "00010", "00020", "00030"... et de textes descriptifs divers.

Je veux que lorsque je rencontre une valeur dans "base" qui est égale à "value", je duplique cette valeur (et le texte descriptif) de "base" vers "destination".

Ca chie, sauf lorsque je mets un alert n'importe où avant (et même si cet alert n'a rien à voir avec la choucroute, ou est juste après les déclarations de src et dest). Si au moins ça chiait tout le temps, je me dirais que je fais de la merde, mais là...
avatar

2

Bon, a priori le problème vient de là : http://stackoverflow.com/questions/10725746/javascript-code-that-doesnt-work-without-an-alert-before-it-otherwise-it-works
En mettant un "alert", ça finalise le DOM... comment faire simple... x_x
avatar

3

Solution très sale : <html> <head> [...] </head> <body onload='postesValues()'> [...] <script language="javascript" type="text/javascript" charset="utf-8"> [...] function postesValues() { <?php foreach($myPostes as $myPoste) { //$myPoste_value = str_pad($myPoste["num_poste"], 5, "0", STR_PAD_LEFT); $myPoste_value = $myPoste["num_poste"]; echo "add_selectedValue($myPoste_value, 'postesDispos', 'postesSelect');\n"; } ?> } </script> </form> </body> </html>
avatar

4

Dans ton premier cas tu appelais ta fonction quand, en plein milieu de la page ? Parce que si c'est ça, comme tu n'as pas le droit de toucher au DOM tant qu'il n'a pas fini de se charger, la bonne solution consiste effectivement à lancer ton traitement dans le "onload" (tu pourrais te brancher plus finement sur un évènement mieux adapté mais peu importe, ça fonctionnera comme ça).
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

Oui, dans le courant de la page, mais après la déclaration des éléments du formulaire que je manipulais (et je pensais que ça suffisait).
avatar

6

du coup, ce n'est pas très sale, c'est plutôt recommandé en fait grin

et si tu fais du JS, regarde du côté de jquery, ça rajoute pas mal de trucs sympa pour te faciliter la vie (entre autres au niveau des onload).
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

7

Ça ne répond pas à la question, mais comme ta page a l'air d'être générée dynamiquement via du PHP, à moins qu'elle ne soit ajaxifiée de partout ça ne serait pas plus simple de la générer directement avec les bonne <options> dans les bonnes listes, plutôt que de faire ça par JavaScript après coup ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

8

Elle est ajaxifiée de partout grin En fait, je fais ces traitements pour me permettre d'appeler justement les mêmes appels ajax que ceux déclenchées par l'utilisateur au moment d'une saisie manuelle.
flanker (./6) :
et si tu fais du JS, regarde du côté de jquery, ça rajoute pas mal de trucs sympa pour te faciliter la vie (entre autres au niveau des onload).
Ouais, c'est ce que je me dis de plus en plus, mais là j'ai 6 heures pour finir la version de test du produit, donc je ne vais pas me mettre à jquery tout de suite grin
avatar

9

T'as 6 heures pour finir, et du coup tu traînes sur yN ? C'est bien parti grin
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

10

Chut embarrassed (c'est mort, je dois faire la présentation à 14h30 x_x)
avatar

11

là il doit être le nez dans le guidonclavier pour tenter de finir en 5 minutes cheeky
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

12

Elle est arrivée à 14h15, du coup elle a pu voir la récupération auto des données, l'interface de saisie, et l'enregistrement... et ça lui va cheeky

(le reste étant plein d'infos de debug, le pdf généré à moitié cassé... donc bon grin)
avatar

13

Bon bah ce qui marchait ne marche plus et je ne comprends pas pourquoi...
Je fais bien la méthode décrite dans mon ./3, mais j'ai toujours le même problème. Pire encore :
- Ca ne fonctionne pas du tout sous IE8
- Sous Firefox, ça ne fonctionne pas au premier chargement, mais si je recharge, ça marche trifus
- Si j'ajoute un alert() avant les fonctions dans le body onload=... ça fonctionne partout

J'ai essayé en utilisant window.onload, mais le comportement est strictement le même.
Du coup, je ne comprends plus du tout... soit mon body ne finit jamais de se charger et alors je ne devrais jamais avoir le alert() de lancé lorsque je le rajoute, soit mon DOM devrait être bouclé à partir du moment où se lance le onload donc je ne devrais pas avoir de problème...

J'ai aussi pensé à une erreur Javascript qui interromprait l'interprétation, mais je n'ai rien ni sous IE ni sous Fx (et le fait que l'alert se lance ne va pas dans ce sens).

Une piste ?
avatar

14

Edit : en fait non...

Bon, j'avance (un peu), grâce à l'inspecteur DOM de Firefox... a priori, j'ai bien les bonnes valeurs dans mon select, mais elles n'apparaissent pas à l'écran trifus
avatar

15

Solution super (mais alors super) sale :
ob_start();
--mon code
ob_en_flush();
sleep(1);

Et ça fonctionne, sous IE8 comme sous Fx... (ça ne fonctionne pas sans le dernier sleep).
avatar

16

ton code ne s'appliquerait-il pas avant la fin du chargement du dom ?
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

17

Normalement non, vu qu'il n'est appelé que par le body onload=... ou window.onload, ce qui (si j'en crois les docs) garantit que le DOM soit chargé.
avatar

18

essais de mettre ton code à la toute fin du body
et la le mec il le pécho par le bras et il lui dit '

19

window.addEvent('domready', function(){...


wink
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

20

Sauf que domready n'est pas standard et que ça implique de se reposer sur un framework... par contre, du coup, je vais peut-être regarder du côté de document.readyState.
avatar

21

ce n'est peu être pas super propre mais le code à la fin du body t'assure que l’intégralité du dom à été chargé avant
Nil (./13) :
- Sous Firefox, ça ne fonctionne pas au premier chargement, mais si je recharge, ça marche

ca ressemble à qq chose pris du cache la seconde fois
tu touche à des images avant leur chargement ?
un fichier externe éventuellement non chargé au lancement du js ?
et la le mec il le pécho par le bras et il lui dit '

22

C'est un peu plus compliqué que ça... je charge des plans en haute résolution (enfin, tout est relatif, hein grin c'est du noir et blanc et les dimensions sont raisonnables) pour faire de la localisation. Comme certains ne rentrent pas sur un écran, j'ai un système de zoom sur une image réduite (c'est la même image qui me sert pour le zoom et l'aperçu réduit pour éviter un chargement).
J'ai un map cliquable réalisé sur l'image à 100%, pour pouvoir paramétrer comme je veux mon aperçu réduit. Mais du coup, il fait que je recalcule toutes les dimensions du mapping en fonction de la taille finale des images. Mais ça, je ne peux le faire que lorsque je suis assuré d'avoir tout chargé, donc je le fais dans le onload. Mais ça, ça fonctionne très bien... c'est la récupération en Ajax d'autres informations qui déconne...

Je pense qu'il y a aussi un problème de config d'Apache (peut-être avec la mise en cache de la page avant envoi), parce qu'une fois passé en prod (pas la même version, pas le même paramétrage), je n'ai plus de souci.
avatar

23

fait gaffe le onload du body c'est simplement pour la structure "html", rien d'autre, pour les images tu à aussi un event de load, avec aussi ses blèmes

sur la version online si tu utilise un navigateur tout frais, sans rien en cache, ça marche la première fois ?

vu que c'est online, les requêtes ajax vont mettre plus de temps qu'en local, du code va certainement s’exécuter avant, alors qu'en local il s’exécute peut être après, ce qui peut tout changer

l'onglet "network" du débugger de chrome est super bien fait pour trouver des soucis du genre
et la le mec il le pécho par le bras et il lui dit '

24

robinHood (./23) :
sur la version online si tu utilise un navigateur tout frais, sans rien en cache, ça marche la première fois ?
Bah avec mon hack tout pourri, ça marche partout cheeky
Les requêtes Ajax interrogent d'autres serveurs (qui ne sont pas à l'intérieur de notre infrastructure réseau), que ça soit en prod ou en test.
avatar

25

lol tu à laissé le sleep ? grin tu mérites un #point-r043v# cheeky

à la limite quitte à laisser un delay fait le plutôt en js via un setTimeout que par ce pauvre php ^^
et la le mec il le pécho par le bras et il lui dit '

26

Ok, j'ai trouvé le problème, maintenant il faut que je mette en place des points de contrôle...
En fait, ce qui doit être exécuté après le onload dépend en partie d'informations qui arrivent dans le cadre d'une demande en Ajax... et celle-ci arrive après le onload (gneuh)... du coup, c'est tout con : il faut que je temporise non seulement par rapport au chargement du DOM mais aussi par rapport à l'arrivée des données...
(et je pense que lors d'un F5, il doit y avoir une mise en cache soit de la requête SQL, soit du XML généré et récupéré en Ajax).
avatar

27

en vanilla javascript ta bien un callback après ta requête ajax ?

je te met l’équivalent en jquery (grin) le vanilla js c'est pas mon truc

[source=js]$(document).ready(function(){ // body.onload
$.get("/getMyXml.php",{opt:value, opt2:value2},function(){ // ton ajax
// ici ce que tu faisais dans ton body.onload
});
});[/source]
et la le mec il le pécho par le bras et il lui dit '

28

Oui, j'ai bien un callback, mais il arrive bien après le chargement du DOM, donc après les actions levées à ce moment-là...
avatar

29

ou un truc comme ca qui décompte les étapes d'init

[source=js]var initStep = 3;

function monInit(){
// le code que tu avais dans le body.onload
}

$.get("/getMyXml.php",{opt:value, opt2:value2},function(data){ // ton ajax
// utilise data
if(-- initStep === 0) monInit();
});

$.post("/getMyXml2.php",{opt:value, opt2:value2},function(data){ // ton ajax2
// utilise data
if(-- initStep === 0) monInit();
});

$(document).ready(function(){
// dom loaded
if(-- initStep === 0) monInit();
});[/source]
et la le mec il le pécho par le bras et il lui dit '

30

C'est +/- ce que je suis en train de faire happy
avatar