"display: none" sur les exercices suite à l'ajout d'un script

Bonjour,
J’ai réalisé un script qui est placé dans skin>js>skin.js
les lignes « offensantes » (offending) sont les suivantes:

var lkd = document.getElementsByTagName('span');
for(var i = 0; i < lkd.length; i++)
{lkd[i].addEventListener('click', go, false);}

Le code fonctionne sans accros sur une page de présentation de cours, mais les exercices deviennent invisibles.
Ils sont bien « lancés » et fonctionnels (je les ai testés), mais ils ont tous un « display:none », qui est bien sûr facile de modifier… dans l’inspecteur.
Par exemple pour un exercice QCU j’ai:

<div id="qELMQtkURFVduesGriMAc_Aswitch_A" style="**display:none**;"><div id="qELMQtkURFVduesGriMAc_Aswitch_N_play"><p>Vous allez à présent effectuer une série d'exercices d'auto-évaluation.</p><p>Une synthèse vous sera présentée à la fin de cette série d'exercices.</p><p><a role="button" title="Commencer l'évaluation..." href="#" onkeydown="scDynUiMgr.handleBtnKeyDwn(event);" onkeyup="scDynUiMgr.handleBtnKeyUp(event);" onclick="qELMQtkURFVduesGriMAc_Aswitch.onActionN4b(this); return false;" class="btnStartE "><span>Commencer le test...</span></a></p></div><div 

Précision: le script en question ne s’exécute que si la « class » de la page est « default module expUc », ce qui rend l’incompatibilité plus étrange (de mon point de vue).

Toute piste me serait fort utile :slight_smile:
Merci

Pour info, le script js qui apparaît dans l’inspecteur pour l’exercice:


````var qELMQtkURFVduesGriMAc_Aswitch = {

	fId : "qELMQtkURFVduesGriMAc",
	fCurSeq : null,
	initSeq : function(pCodeSeq){
	try {
		if(pCodeSeq==null) return;
		if(this.fCurSeq!=null) this.closeSeq();
		this.fCurSeq = pCodeSeq;
		switch(this.fCurSeq) {

	case "play" : {
scAssmntMgr.setMode(sc$("qELMQtkURFVduesGriMAc_Aswitch_N_play"), "visible");
scAssmntMgr.setMode(sc$("qELMQtkURFVduesGriMAc_Aswitch_N_pending"), "collapsed");
scAssmntMgr.setMode(sc$("qELMQtkURFVduesGriMAc_Aswitch_N_results"), "collapsed");

		break;
	}

	case "pending" : {
scAssmntMgr.setMode(sc$("qELMQtkURFVduesGriMAc_Aswitch_N_play"), "collapsed");
scAssmntMgr.setMode(sc$("qELMQtkURFVduesGriMAc_Aswitch_N_pending"), "visible");
scAssmntMgr.setMode(sc$("qELMQtkURFVduesGriMAc_Aswitch_N_results"), "collapsed");

		break;
	}

	case "results" : {
scAssmntMgr.setMode(sc$("qELMQtkURFVduesGriMAc_Aswitch_N_play"), "collapsed");
scAssmntMgr.setMode(sc$("qELMQtkURFVduesGriMAc_Aswitch_N_pending"), "collapsed");
scAssmntMgr.setMode(sc$("qELMQtkURFVduesGriMAc_Aswitch_N_results"), "visible");

		break;
	}

		}
	}catch(e){alert("failed:::"+e)};
	},
	onActionN4b : function(pButton){
		if(scAssmntMgr.isDisabled(pButton)) return;
scServices.assmntMgr.setCompletionStatus(this.fId, "eval", "attempt"); 
window.location.assign("tat.html");

		scServices.assmntMgr.commit();
	},
	onActionN78 : function(pButton){
		if(scAssmntMgr.isDisabled(pButton)) return;
window.location.assign("tat.html");

		scServices.assmntMgr.commit();
	},
	onActionN91 : function(pButton){
		if(scAssmntMgr.isDisabled(pButton)) return;
var vSess="eval";
scServices.assmntMgr.resetResponses(this.fId, vSess);
scServices.assmntMgr.setPts(this.fId, vSess, null, null, null); 
I27I7ZK1KsioXbcqEWA0Sc_Areset.fct_reset(); 
jLClDJUNf3fpaYXpB1dq4c_Areset.fct_reset(); 
Yz1i5s5yAhiWEsNMyZqZkh_Areset.fct_reset(); 
kJ293iEoDslyMwv57LjBec_Areset.fct_reset(); 
vM34RPUT9ukTVZf0VqQ6dc_Areset.fct_reset(); 
t4PTzzEmmVc4GvuV8v9zij_Areset.fct_reset(); 
IAt4SjQ3mLh31Ykdprpmtb_Areset.fct_reset(); 
zVXmSeyJHKgOSGp9oxVXvg_Areset.fct_reset(); 
o8KRHv6OnyiQSwUj9Y8Ord_Areset.fct_reset(); 
window.location.assign("tat.html");

		scServices.assmntMgr.commit();
	},
	onActionNc3 : function(pButton){
		if(scAssmntMgr.isDisabled(pButton)) return;
window.location.assign("_Eval_2.html");

		scServices.assmntMgr.commit();
	},
	onActionNdc : function(pButton){
		if(scAssmntMgr.isDisabled(pButton)) return;
var vSess="eval";
scServices.assmntMgr.resetResponses(this.fId, vSess);
scServices.assmntMgr.setPts(this.fId, vSess, null, null, null); 
I27I7ZK1KsioXbcqEWA0Sc_Areset.fct_reset(); 
jLClDJUNf3fpaYXpB1dq4c_Areset.fct_reset(); 
Yz1i5s5yAhiWEsNMyZqZkh_Areset.fct_reset(); 
kJ293iEoDslyMwv57LjBec_Areset.fct_reset(); 
vM34RPUT9ukTVZf0VqQ6dc_Areset.fct_reset(); 
t4PTzzEmmVc4GvuV8v9zij_Areset.fct_reset(); 
IAt4SjQ3mLh31Ykdprpmtb_Areset.fct_reset(); 
zVXmSeyJHKgOSGp9oxVXvg_Areset.fct_reset(); 
o8KRHv6OnyiQSwUj9Y8Ord_Areset.fct_reset(); 
scServices.assmntMgr.setCompletionStatus(this.fId, "eval", "attempt"); 
window.location.assign("tat.html");

		scServices.assmntMgr.commit();
	},

	closeSeq: function(){
		var vForm = document.forms.qELMQtkURFVduesGriMAc_Aswitch_form;
		switch(this.fCurSeq) {

	case "play" : {

		break;
	}

	case "pending" : {

		break;
	}

	case "results" : {

		break;
	}

		}
		this.fCurSeq = null;
	},
	getOnLoadSeq:function() {

	if(scServices.assmntMgr.getCompletionStatus(this.fId, "eval") == "notAttempt" && true) return "play";
	if(scServices.assmntMgr.getCompletionStatus(this.fId, "eval") == "attempt" && true) return "pending";
	return "results";
	},

	
	refreshScoresFeedbacks : function(){

	},
	onLoad: function(){
		this.initSeq(this.getOnLoadSeq()); 
		var vNodeRoot = sc$("qELMQtkURFVduesGriMAc_Aswitch_A");
		vNodeRoot.style.display = "block"; 
	},
	onUnload: function(){
		this.closeSeq();
	},

	loadSortKey: "B9893",
	unloadSortKey: "B9893"};

scOnLoads[scOnLoads.length] = qELMQtkURFVduesGriMAc_Aswitch;
scOnUnloads[scOnUnloads.length] = qELMQtkURFVduesGriMAc_Aswitch;`

Le plus simple serait de publier un exemple quelque-part pour mieux comprendre.

C’est juste.
Je reviendrai quand ce sera disponible.
Cheers

En préparant un exemple visible pour tous je me suis rendu compte que ma ligne de code présumée coupable, était introduite par un
window.onload
J’ai fait un nouvel essai avec une introduction légèrement différente:
document.addEventListener('DOMContentLoaded', function()
…et là tout se met à fonctionner.
Il semble bien qu’il y ait une différence de temporalité entre les deux (voir ici)
Mais je serai bien curieux de comprendre pourquoi mon script génère un « display:none » quand il n’intervient qu’après le chargement total de la page
window.onload
et pas quand il intervient avant ou en même temps avec
DOMContentLoaded'
En tout cas merci pour l’encouragement à aller plus loin et j’espère que cette remarque aidera d’autres initiateurs :slight_smile:
Cheers

Bonjour

Dans scenari les scripts (déclarés comme des objets) sont mis en mémoire dans une variable scOnLoads avant d’être effectivement chargés. Le but étant de pouvoir gérer finement l’ordre d’exécution de ces scripts.
C’est pourquoi si vous regardez les différents scripts existants, vous verrez le plus souvent :

scOnLoads[scOnLoads.length] = {
...
onLoad : function() {

},

...
}

En faisant ça vous vous assurez normalement que le script sera chargé en prenant en compte les autres scripts existants dans la page.

Difficile d’être sur sans voir réellement l’erreur que vous avez eu mais selon moi, le problème que vous avez rencontré est que votre script s’exécutait avant la suppression du display none et empêchait l’exécution du script gérant cette affichage

Ainsi d’une manière générale quand vous ajoutez un script dans le skin.js
Plutôt que d’utiliser le window.onload ou DOMContentLoaded vous pouvez utiliser l’exemple que je vous ai fourni au dessus.
Cela dit si cela fonctionne avec DOMContentLoaded qui s’exécute après que le DOM ait été chargé pas la peine de tout changer :wink:

Cordialement

1 « J'aime »

Pour plus d’infos sur le JS dans scenari :
https://doc.scenari.software/SCENARIbuilder@5.0/reference/fr/#js
Et plus précisément :
https://doc.scenari.software/SCENARIbuilder@5.0/reference/fr/#events

1 « J'aime »

Merci Nicolas :slight_smile:
(mieux vaut tard…)