11540 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

J'ai attaqué le javascript il y a un peu plus d'une semaine maintenant et j'ai développé mon premier "code" en fouillant un peu à droite pour comprendre le fonctionnement. J'ai finalement réussi a créer un code dont le fonctionnement global me convient (contenu dynamique sans rechargement de la page ou plutôt sans devoir créer 30 pages !!)

Seul problème, je ne peux pas accéder à un fragment précis dans mon code puisque je n'ai pas d'URL précise pour chacun de mes fragments. Il faudrait donc que j'arrive à intégrer une ancre pour chacun de mes fragments. J'ai essayé plusieurs solutions que j'ai trouvé sur le net mais je n'ai pas réussi à en faire marcher une seule d'entre elle (principalement parce que la plupart utilisait mon href que j'utilise déjà pour charger ma vidéo) ! Du coup, je me tourne vers la crème des crèmes : vous !

La question donc : comment intégrer une ancre dynamique (en rajoutant un array si besoin) pour chacune de mes pages et que ces fragments soient accessible si on tape l'URL complète avec l'ancre ... ?

J'ai simplifié le code pour pouvoir le poster ici mais le fonctionnement est bon.

<SCRIPT LANGUAGE="JavaScript">
/* Variable Definition */

vgn_movie_inline = 3;
movie_number = 1;

/*Array Definition*/
movie_vignet = new Array;
movie_description = new Array;
movie_big = new Array;
movie_title = new Array;

var HazMess=new Array();
	movie_title[0]= 'Episode 6'
	movie_description[0]= 'Description'
	movie_vignet[0]= 'image.jpg'
	movie_big[0]= 'http://www.youtube.com/embed/OahP1ehXzWg?rel=0'	
	

	movie_title[1]= 'Episode 5'
	movie_description[1]= 'Description'
	movie_vignet[1]= 'image.jpg'
	movie_big[1]= 'http://www.youtube.com/embed/OahP1ehXzWg?rel=0'

	movie_title[2]= 'Episode 4'
	movie_description[2]= 'Description'
	movie_vignet[2]= 'image.jpg'
	movie_big[2]= 'http://www.youtube.com/embed/OahP1ehXzWg?rel=0'
	
	
/*Function ChargeMovie*/
function ChargeMovie(num)
	{
	if(document.getElementById)
		document.getElementById("movie_dyn_mov").innerHTML = '<TABLE class="table_movie"><TR><TD class="td_movie"><h4 style="font-weight:bold;padding:0">'+movie_title[num]+'</h4><iframe width="450" height="253" frameborder="0" allowfullscreen="" src="'+movie_big[num]+'"></iframe><br /><div class="movie_description">'+movie_description[num]+'</div></TD></TR></TABLE>';
	else
		window.open(movie_big[num],"_blank")
	}


/*Write*/
document.write('<DIV ID=movie_dyn_mov><TABLE class="table_movie"><TR><TD class="td_movie"><h4 style="font-weight:bold;padding:0">'+movie_title[0]+'</h4><iframe width="450" height="253" frameborder="0" allowfullscreen="" src="'+movie_big[0]+'"></iframe><br /><div class="movie_description">'+movie_description[0]+'</div></TD></TR></TABLE></DIV>');


document.write('<hr color="#cccccc" /><table class="table_movie">');
for(a=0;a<movie_big.length;a++)
	{
	if(movie_number == 0)
		document.write('<tr>');
	else
		document.write('<td class="td_movie_vng">');
	document.write('<A HREF="javascript:ChargeMovie('+a+')"><IMG SRC="../'+movie_vignet[a]+'" style="margin:20px" ALT="'+movie_title[a]+'"><div style="margin: 20px">'+movie_title[a]+'</div></A></TD>')
	if(movie_number == vgn_movie_inline)
		{
		document.write('</Tr>');
		movie_number=3;
		}
	movie_number++;
	}
document.write('</table>');
</SCRIPT>


Merci d'avance pour votre aide ! J'en peux plus, j'essaye depuis plus d'une journée et je commence à voir du code devant mes yeux quand je les ferme !
Bonjour,

Il y a tellement à dire sur ton code que j'ai du mal à voir par où commencer.

Allons-y :

1 Toujours utiliser le mot clef var lorsque tu déclares une fonction en javascript.

2. Trop de variables globales, il ne faut en règle générale, jamais polluer le contexte global. (voir module pattern ou fonction anonyme).

3. Tu as oublié les parenthèses après 'new Array', d'ailleurs 'var variable = [];' fait la même chose.

4. document write est à bannir, c'est trop peu performant, impossible à exécuter Cross-domain. (voir manipulation du DOM en javascript, c'est nettement préferable)

5. Les tableaux html, doivent être utilisé pour présenter du contenu tabulaire et rien d'autre.

6. Le style en ligne c'est mal, préfère utiliser des 'class'

7. Les iframes c'est le mal (en général) aussi, ici l'utilisation n'en requiert pas l'utilisation.

8. Même si aprés un if ou un else qui n'execute qu'une ligne les '{}' (trou de mémoire je sais plus le nom)ne sont pas obligatoire, elles sont vivement conseillées, pour une meilleure lecture et maintenabilité du code.

9. Tu fais une sur utilisation des tableaux en javascript, tu gagnerais en souplesse avec une notation objet, moins gourmande en ressource.


var monObjet = {}

var monObjet.video1 = {
id : 'tonid',
url : 'tonurl',
etc : 'etc'
}


(déjà dit mais pas une seule fois var dans ton code, tu vas avoir des problèmes (j'en connais qui ont essayés))

Globalement attaches toi à écrire un code, plus propre et efficace, (apprends mieux javascript en 1 jours tu ne peux pas tout savoir c'est normal).

EDIT: En l'état actuel des choses la base est tellement malsaine, qu'il ne vaut mieux pas te laisser perdurer dans cette voie, et t'apporter une solution bancale, basée sur un code (pardon) bancal.

Ce que tu souhaites réaliser passe obligatoirement par un gestionnaire d’évènement et par délégation d’évènement. C'est assez loin dans l'apprentissage du javascript ou sinon voir du coté d'un framework (jquey par exemple, mais apprends les bases car jquery permet un certain laxisme qui va te faire écrire du code abject.)

Cordialement.
Modifié par rs459 (15 Mar 2012 - 20:37)
Salut rs459,

Merci bien pour ta réponse !

Je sais que la partie code html est vraiment pas propre mais j'ai pas vraiment le choix malheureusement. En fait, je travail sur un système en coldfusion codé par une agence externe et quand je passe par les feuilles de style j'ai souvent des conflits avec les feuilles déjà mise en place et je suis obligé de passer par du style en ligne pour les annuler dû à la priorité. C'est un peu galère mais j'ai pas vraiment le choix ...

Pour la partie tableau la raison vient de la même chose en fait. J'utilise plus des div et class généralement pour placer mes objets mais les conflits sont trop nombreux sur mon CMS donc du coup, je passe par les tableaux ... (j'ai pas accès au code pure du site, que aux zones d'édition ...)

Pour l'Iframe, c'est pour intégrer les vidéo youtube. J'ai le choix entre iframe et embed mais si embed est mieux, je vais l'appliquer ! Je sais que Iframe est le mal surtout pour le référencement !

Pour le reste merci des conseils, je vais les appliquer et revenir quand mon propre sera plus propre ! Le site sur lequel je travaille utilise jquery déjà donc je vais essayer de m'en approcher !

Merci pour tout !
fanfoue a écrit :

Je sais que la partie code html est vraiment pas propre mais j'ai pas vraiment le choix malheureusement. En fait, je travail sur un système en coldfusion codé par une agence externe et quand je passe par les feuilles de style j'ai souvent des conflits avec les feuilles déjà mise en place et je suis obligé de passer par du style en ligne pour les annuler dû à la priorité. C'est un peu galère mais j'ai pas vraiment le choix ...

Pour la partie tableau la raison vient de la même chose en fait. J'utilise plus des div et class généralement pour placer mes objets mais les conflits sont trop nombreux sur mon CMS donc du coup, je passe par les tableaux ... (j'ai pas accès au code pure du site, que aux zones d'édition ...)


Ils ont mis des !important partout même sur les div et span ? limite pousse au crime Smiley lol , c'est ça quand une boite demande à un dev back-end d'etre ergonome graphiste intégrateur admin dba admin sys dev php/ruby/java, ca conduit à du grand n'importe quoi parce que les gens n'ont pas d'expertise dans un domaine précis au point
de faire tout et surtout n'importe quoi... Si en plus il pouvait être simplement stagiaire... Surement un !important sur des propriétés CSS d'un élément parent.

Vires/changes l'id, la classe par manipulation du DOM, ça m'étonnerait beaucoup qu'il soit beaucoup plus haut que le parent de ton contenu. Aprés il faudrait voir le code pour vraiment te dire quoi faire ou ne pas faire.

a écrit :
Pour l'Iframe, c'est pour intégrer les vidéo youtube. J'ai le choix entre iframe et embed mais si embed est mieux, je vais l'appliquer ! Je sais que Iframe est le mal surtout pour le référencement !


Dans ce cas là autant pour moi, effectivement iframe est approprié. je pensais que le contenu était fournit par tes serveurs.

a écrit :
Pour le reste merci des conseils, je vais les appliquer et revenir quand mon propre sera plus propre ! Le site sur lequel je travaille utilise jquery déjà donc je vais essayer de m'en approcher !

Merci pour tout !


Smiley cligne

la fonction 'on()' ('.delegate()' si Jquery < 1.7) devrait t'aider pour intercepter les évènements sur un enfant chargé dynamiquement.

Ensuite pour que tes utilisateurs puissent revenir sur ta page avec la vidéo, et utiliser le back forward du navigateur, il faut au moment du chargement checker l'url pour y trouver une REGEX souvent #! et s'il le trouve il execute une fonction de traitement du hash. Des plugins javascript font ça très bien.

Voir du coté du plugin Jquery BBQ peut être. (en fonction des besoins, mots clefs pour te mettre sur la voie 'hashchange' 'jquery history').
Ouai c'est exactement ça ! Tu as des !important mais pas partout, juste sur quelques contenus, mais j'en ai !

J'ai pas encore testé de supprimer une classe par la manipulation du DOM mais d'après ce que j'ai compris, cela n'a pas l'air trop compliqué !

Bon, j'ai un peu commencé à changer le code et ça donne ça !
<div id="ancre"></div>
<TABLE class="table_movie">
	<TR>
		<TD class="td_movie">
			
			<div id="title_movie"><h4></h4></div>
			<div id="iframe_movie"></div>
			<br /><div id="description_movie" class="movie_description"></div>
		</TD>		
	</TR>
</TABLE>

<SCRIPT LANGUAGE="JavaScript">
/* Variable Definition */

var vgn_movie_inline = 3;
var movie_number = 1;

/*Array Definition*/
var movie_vignet = [];
var movie_description = [];
var movie_big = [];
var movie_title = [];
var ancre= [];
	
	movie_title[0]= 'Episode 6',
	movie_description[0]= 'Description',
	movie_vignet[0]= 'image.jpg',
	movie_big[0]= 'http://www.youtube.com/embed/OahP1ehXzWg?rel=0',
	ancre[0]= 'ancre0',

	movie_title[1]= 'Episode 5'
	movie_description[1]= 'Description1'
	movie_vignet[1]= 'image.jpg'
	movie_big[1]= 'http://www.youtube.com/embed/OahP1ehXzWg?rel=0'
	ancre[1]= 'ancre1'

	movie_title[2]= 'Episode 4'
	movie_description[2]= 'Description2'
	movie_vignet[2]= 'image.jpg'
	movie_big[2]= 'http://www.youtube.com/embed/OahP1ehXzWg?rel=0'
	ancre[2]= 'ancre2'

/*Function ChargeMovie*/
function ChargeMovie(num)
	{
	if(document.getElementById){
		document.getElementById("ancre").innerHTML = '<a id="'+ancre[num]+'">';
		document.getElementById("iframe_movie").innerHTML = '<iframe width="450" height="253" frameborder="0" allowfullscreen="" src="'+movie_big[num]+'"></iframe>';
		document.getElementById("title_movie").innerHTML = movie_title[num];
		document.getElementById("description_movie").innerHTML = movie_description[num];
		}
	else{
		Window.open(movie_big[num],"_blank");
		}
	}

/*Write*/
document.getElementById("iframe_movie").innerHTML = '<iframe width="450" height="253" frameborder="0" allowfullscreen="" src="'+movie_big[0]+'"></iframe>';
document.getElementById("title_movie").innerHTML = movie_title[0];
document.getElementById("description_movie").innerHTML = movie_description[0];


document.write('<hr color="#cccccc" /><table class="table_movie"><tr>');
for(a=0;a<movie_big.length;a++)
	{
	if(movie_number == 0){
		}
	else{
		document.write('<td class="td_movie_vng"><A onclick="ChargeMovie('+a+'); return false;" href="#'+ancre[a]+'"><IMG SRC="../'+movie_vignet[a]+'" style="margin:20px" ALT="'+movie_title[a]+'"><div style="margin: 20px">'+movie_title[a]+'</div></A></TD>')
		}
	if(movie_number == vgn_movie_inline){
		document.write('</Tr>');
		movie_number=0;
		}
	movie_number++;
	}
document.write('</table>');
</SCRIPT>


Pour l'instant, mon mode de fonctionnement, c'est enlevé petit à petit les éléments du javascript pour les mettre en html. Je sais qu'il n'est pas du tout propre encore mais c'est toujours ça de gagner ! Smiley lol !

Pour la seconde partie, j'ai pas réussi à supprimer les document.write où plutôt, dés que je les supprime j'ai plus le bon comportement. C'est surtout que j'ai pas réussi à faire répéter l'élément des vignettes ce qui m'a bien gonflé toute la journée ! Le code marche comme ça même en étant dégueulasse ! Le seul truc, c'est cette navigation que je n'arrive pas à faire marcher ... Les fonctions que j'ai trouvées utilisent le onclick de ma balise <a> (tu remarqueras d'ailleurs que j'ai changé par moi même car avant, c'était noté sur la balise href="javascript:..." mais j'ai lu que c'était le mal ça aussi !) et du coup, je ne sais pas comment lancer le chargement de deux fonctions javascript en même temps ...

El là mon mal de crâne m'oblige à m'arrêter pour aujourd'hui !

Merci pour ton aide en tout cas !
Je vais te mettre un peu sur la voie, ne t'occupes pas du javascript pour les liens maintenant. Comme je te l'ai dit les gestionnaires viennent après, d'abord apprends à manipuler le DOM.

Je t'invite à explorer les documentations techniques pour les fonctions que tu ne comprends pas dans le code suivant.

  
(function(){

// je trouve le parent dans lequel je souhaite insérer mon code, et qui servira ensuite pour la délégation d'evenement.
   var parentEl = document.getElementById('main-content');
   
   //createDocumentFragment est là pour des raisons de performances, les manip du DOM coûtent chère en mémoire, cela va créer un élément en dehors du DOM un fragment, avec lequel travailler pour au final l’insérer dans le navigateur (voir "memory repaint reflow" ).
   var docFrag = document.createDocumentFragment();
   var hrEl = document.createElement('hr');
   hrEl.className = 'special-color-hr'; // dans le css .special-color-hr { color : #cccccc;}
   docFrag.appendChild(hrEl);
   var tableMovieEl = document.createElement('table');
   tableMovieEl.className = "table_movie";
   
   //pour l'exemple à retirer ensuite.
   var movie_big = ["test","test1","test2"];
   // fin exemple
   
   // var movieBigLen = movie_big.length; // si jamais grand tableau.
   // si grand tableau for ([#darkred]var[/#] i = 0 , i < movieBigLen ; i++)
   for ([#darkred]var[/#] i = 0; i < movie_big.length; i++) {
   		var trEl = document.createElement('tr');
   		var tdEl = document.createElement('td');
   		
   		// ici tu édites tdEL, cherches tu vas trouver.
   		// aEl doc createEl ; aEl.href ; tdEl appendChild a 
   		// imgEl doc createEl ; imgEL.src ; tdEl appendChild imgEL
   		
   		var text = document.createTextNode(movie_big\[i\]); // les \ devant les crochets doivent être retirés.
   		tdEl.appendChild(text);
   		
   		
   		// ici on insére.
   		trEl.appendChild(tdEl);
   		tableMovieEl.appendChild(trEl);
   }
   
   docFrag.appendChild(tableMovieEl);
   

   // j'insère le fragment dans le parent.
   parentEl.appendChild(docFrag);

}();


C'est déjà plus propre même si à mon avis plutôt qu'un tableau tu pourrais utiliser des 'DIV' et span. Si tu peux en utiliser dans ta table je vois difficilement pourquoi tu ne pourrais pas les utiliser ailleurs.

EDIT: correction.
Modifié par rs459 (17 Mar 2012 - 00:32)
Par la suite je te conseille de revoir ta manière de stocker tes videos.

par exemple :


var video = { 

"movie" : [ {
 
		movie_title : "Episode 1",

		movie_description : "Description",

		movie_vignet : "image.jpg",

		movie_big : "http://www.youtube.com/embed/OahP1ehXzWg?rel=0",

		ancre : "ancre0"
},
{
 
		movie_title : "Episode 2",

		movie_description : "Description",

		movie_vignet : "image.jpg",

		movie_big : "http://www.youtube.com/embed/OahP1ehXzWg?rel=0",

		ancre : "ancre0"
},
{
 
		movie_title : "Episode 3",

		movie_description : "Description",

		movie_vignet : "image.jpg",

		movie_big : "http://www.youtube.com/embed/OahP1ehXzWg?rel=0",

		ancre : "ancre0"
},
{
 
		movie_title : "Episode 4",

		movie_description : "Description",

		movie_vignet : "image.jpg",

		movie_big : "http://www.youtube.com/embed/OahP1ehXzWg?rel=0",

		ancre : "ancre0"
	}
	]
}

//alert(video.movie[2].movie_title);
//alert(video.movie[3].movie_description);
var ElToAdd = document.createElement('img');
ElToAdd.src = video.movie[1].movie_vignet;
ElToAdd.className = "maClasseSuperEfficace"
ElToAdd.id = "monIdMagnifique"
document.body.appendChild(ElToAdd);


Modifié par rs459 (16 Mar 2012 - 23:37)
Super ! Merci bien ! Je vais étudier un peu tout ça cette semaine ! Je pense que j'en ai déjà pour quelque jours devant moi pour tout comprendre ! Smiley lol ! Merci pour ton temps en tout cas et je reviens une fois que mon code sera plus propre ! Pour les tables, j'ai vu avec mon agence et on va désactiver les feuilles CSS qui sont en conflit avec mon code pour cette page donc je vais tout refaire en div.

Merci