Je n'interviens pas pour donner une solution : Bovino et Iakou s'en sont chargés.
Mais j'ai remarqué quelque chose.

Envoyé par
hannibal974
Voilà le tableau que je possède dans ma page (j'utilise Symfony2) avec l'appel à mon fichier SelectPlage.js :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <table class="cal_calendrier">
<tr>
...
</tr>
{% for a in 0..5 %}
<tr>
{% for b in 0..6 %}
<td class="cal_calendrier_td">
{% if tab[a][b] is defined %}
<p onclick="SelectPlage('{{tab[a][b]}}', '{{chaine}}', '{{date}}')">{{tab[a][b]}}</p>
{% endif %}
</td>
{% endfor %}
</tr>
</br>
{% endfor %}
</table> |
Symfony c'est du code serveur. Tes variables serveur {{chaine}} et {{date}} sont-elles correctes au moment où tu les utilises ? Montre-nous un extrait du code HTML généré s'il-te-plaît (Ctrl+U dans ton navigateur). Ça va peut-être révéler un problème avec le onclick qu'on n'avait pas encore repéré.
Tiens d'ailleurs, petit conseil pour l'ergonomie :
p[onclick] { cursor: pointer; }
Autre chose : ce </br> qui est à la fois syntaxiquement incorrect (c'est <br />) et incongru ici : tu n'as pas besoin de faire un saut de ligne entre deux rangs de tableau.
Une remarque à propos de la tentative d'include que tu as mise en commentaire. Ça ne peut pas marcher avec document.write : ça va juste vider ta page et tu seras bien embêté.
Voici la version non destructrice de ce que tu voulais faire :
1 2 3
| var $script = document.createElement("script");
$script.src = './Post.js';
document.head.appendChild($script); |
(Note : document.head est relativement récent, j'aurais pu écrire document.getElementsByTagName("head")[0] mais je ne voulais pas surcharger mon exemple.)
Si tu mets ces trois lignes de code au début de ta fonction SelectPlage, voilà ce qui va se passer :
- L'exécution de SelectPlage est interrompue ;
- Le fichier "Post.js" est recherché, puis éventuellement téléchargé s'il est sur un serveur distant, en tout cas il est chargé en mémoire ;
- Quand le chargement du fichier se termine, il est passé à l'interpréteur qui va l'interpréter de manière asynchrone pour permettre à SelectPage de reprendre son exécution ;
- Par conséquent, quand l'exécution de SelectPage reprend, la fonction post n'est pas encore disponible car le fichier est en cours d'interprétation.
Bien entendu, la solution proposée par Bovino et Iakou est la meilleure, car de loin la plus simple. Cependant, si un jour tu as besoin de charger dynamiquement un script, la solution est de surveiller l'évènement load que le script doit lancer quand il est prêt, c'est-à-dire quand il a été chargé et interprété et exécuté. Voici un exemple :
Le fichier HTML, nommé test.html :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <script>
function test( ){
var $script = document.createElement("script");
$script.addEventListener("load", function( ){
console.log("externe.js a lance son load"); // 3
});
$script.src = 'externe.js';
document.head.appendChild($script);
console.log("fin de l'execution de test"); // 1
}
</script>
<input type=button value=test onclick="test()"> |
Le fichier JavaScript à charger, nommé externe.js :
console.log("externe.js a ete execute"); // 2
Quand tu charges la page HTML et que tu cliques sur le bouton de test, la console affiche ceci :
1 2 3
| "fin de l'execution de test" test.html:12
"externe.js a ete execute" externe.js:1
"externe.js a lance son load" test.html:6 |
Ce qui montre bien dans quel ordre les choses se sont déroulées.
Partager