11491 sujets

JavaScript, DOM et API Web HTML5

Pages :
Bonjour,

Je réalise un site pour une alimentation biologique.
Sur une page (recette.html), je veux pouvoir lister des recettes selon le mois de l'année.
Ma liste des mois est dans un div cadré à droite.
Le comportement recherché :
1. afficher quand j'affiche la page recette pour la première fois la page du mois courant
2. affichage des recettes selon le clic sur le menu ; afficher les recettes du mois de décembre si je clique sur décembre...

Je souhaite que les recettes s'affiche à l'intérieur du conteneur recette dans la page recette.html.

J'ai beau tourner ce problème dans tous les sens je ne m'en sors pas. Smiley bawling

Si nécessaire je peux poster mon code.

Avec les frames j'y serai arrivé 'facilement' mais je ne veux pas utiliser les frames. Donc, que me reste-t-il ?

Merci pour votre assistance.

Cordialement.
Modifié par pidlas (16 Mar 2011 - 11:24)
Salut

Ajax est tout indiqué. Je fais la même chose mais avec des formulaires. Je n'utilise que jquery donc un exemple avec ce framework.


$(document).ready(function() {
  $('#recettes a').click(function() {
   // récupére le title du lien
    var title = $(this).attr('title');
    var url = '';
    switch(title) {
         case 'recette1' :
	url = 'includes/recette1.html';
	break;
         case 'recette2' :
	url = 'includes/recette2.html';
	break;
         default :
	url = 'includes/recette1.html';
    }
    
    $('#chargement').hide().load(url, function() {
      //appel de la fonction facultative
      charge();
       $(this).fadeIn();
    });
    return false;
  });
});

// fonction facultative, affiche un gif animé pendant l'attente du chargement
function charge() {
  var loader = $('<img/>').attr({'src': 'images/loader.gif','alt': 'Chargement en cours... Please wait...'});
  $('<div id="loader">'+loader+' Chargement en cours... please wait, load in progress...</div>')
    .insertBefore('#chargement')
    .ajaxStart(function() {
        $(this).show();
    }).ajaxStop(function() {
        $(this).hide();
        //$('.chargeForms').hide();
   });
}


les liens seront écrits comme suit:

<a href="#" title="recette1">titre recette1</a>

chaque recette est dans un html séparé avec ce code et placé dans un dossier, içi, includes. Il est aussi possible de les charger avec php ou autre mais c'est le principe. et sont chargés dans un div dont l'id est chargement. Le div des liens lui a un id recettes.

A noter, ces fichiers inclus ne contiennent pas de head ou body, juste les balises utiles car il vont êtres inclus dans une page déjà construite.
Modifié par keran (12 Mar 2011 - 01:14)
Merci pour cette réponse. Smiley biggrin

Je ne connais ni Ajax ni Jquery. C'est sur ma liste de formation.

Si j'ai bien compris le code que vous me proposez est du JQuery.

A quel endroit de ma page recette.html je dois intégrer ce code ?

Quel lien doit apparaître dans le <head> pour que ce code s'exécute correctement ?

Les recettes peuvent-elles être regroupées dans un fichier portant le nom d'un mois ?

Je joins la partie concernée du code de ma page recette.html pour que vous visualisiez au mieux ma question.


	<div id="corps">
	<h1>La recette du mois</h1>
	<p>Pour faciliter la recherche, nous avons classé les recettes mois par mois. Vous pouvez également utiliser le moteur de recherche en utilisant le nom d'un ingrédient ou le nom d'une recette par exemple.</p>

		<div id="menud">
			<ul>
				<li><a href="#jan">janvier</a></li>
				<li><a href="#fev">février</a></li>
				<li><a class="active" href="#mar">mars</a></li>
				<li><a href="#avr">avril</a></li>
				<li><a href="#mai">mai</a></li>
				<li><a href="#juin">juin</a></li>
				<li><a href="#juil">juillet</a></li>
				<li><a href="#aout">août</a></li>
				<li><a href="#sep">septembre</a></li>
				<li><a href="#oct">octobre</a></li>
				<li><a href="#nov">novembre</a></li>
				<li><a href="#dec">décembre</a></li>
			</ul>
		</div><!--conteneur menud-->


L'idée étant que quand je clique sur février, j'affiche toutes les recettes du mois de février.

De plus, comment au moment où j'affiche la page recette.html pour la première fois être sûr que les recettes affichées correspondent au mois en cours ?

Dans l'attente de votre réponse.

Cordialement.

PS : une bonne méthode pour apprendre Ajax ou Jquery ??
salut pidlas,


Je te prépare une réponse avec un exemple, elle và être longue alors je vais prendre le temps. Rendez-vous en fin d'après-midi.
Une question me pose problème. Utilises tu php? Une base de données? Si non, comment sont stockées les recettes?
Pour l'instant je n'ai pas de bases de données.
Les recettes sont pour l'instant sur papier et j'envisage simplement de les stocker dans des pages html. A terme j'envisage de développer une telle base et donc d'utiliser php. Mais mes compétences ne sont pas encore au niveau et les propriétaires du magasin n'ont pas beaucoup de temps à consacrer à la partie dynamique du site.
Je dois donc développer un maximum sans trop compter sur des possibilités de mises-à-jour importantes.
Cependant, je dois penser à l'avenir et faire en sorte que ce que je développe puisse être étendu vers plus d'interaction.
En espérant avoir répondu à ta question ...
Administrateur
Bonjour,

j'ai lu rapidement mais un gestionnaire de contenu (CMS) classera ça très bien. Dotclear, Wordpress ou autre. Chaque recette est un billet avec une date, l'affichage par date n'est qu'un simple réglage ensuite.
Bonjour Felipe,

Merci pour ta réponse. Je n'ai pas encore investigué les logiciels de gestion de contenus. Je fais mes armes pour l'instant avec les langages 'standards' html/css. A ce propos quel tuto, quel site me conseillerais-tu pour avoir une idée que ce que les CMS apportent et surtout comment les intégrer avec un site existant ?

Merci pour ta réponse et tes vues sur le sujet.

Cordialement.

PS : j'attends la réponse de keran qui va intéresser bcp d'internautes me semble-t-il. Smiley cligne
pidlas,

Alors. C'était un peu long mais il faut bien bossé un peu;)

a écrit :
Si j'ai bien compris le code que vous me proposez est du JQuery


Oui, c'est du javascript formaté pour jquery qui est un mini framework pour javascript. Il simplifie énormement l'implémentation d'ajax, en autre.

Voir ici pour les détails

a écrit :
A quel endroit de ma page recette.html je dois intégrer ce code ?


Idéalement dans un fichier séparé et appelé dans le head. Comme çà :


<!--chargement de jquery-->
<script type="text/javascript" src="js/jquery-1.4.4.min.js"></script>
<!--chargement de l'appel ajax pour le chargement dynamique des recettes-->
<script type="text/javascript" src="js/ajaxRecette.js"></script>
[/html]

[quote]
Les recettes peuvent-elles être regroupées dans un fichier portant le nom d'un mois?
[/quote]

Bien sur, ce serait plus simple. Mais plus le nombre est important moins c'est gérable;) Mais comme tu n'utilise pas php çà limite fortement les possibilités de gestion. En fait ajax permet de ne charger qu'une partie du fichier en utilisant par exemple un id par bloc/recette/mois, ce que tu veux.

Un exemple simple mais éfficace.

[code=html]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr-FR">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta http-equiv="Content-Language" content="fr-FR" dir="ltr" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>tests ajax</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {   
$('#menud a').click(function() {    
  // récupére le title du lien     
  var title = $(this).attr('title');     
  var url = '';     
  switch(title) {         
	case 'janv' :     
		url = 'includes/janv.html';     
		break;          
	case 'fev' :     
		url = 'includes/fev.html';     
		break;
	case 'mars' :     
		url = 'includes/mars.html';     
		break;
	//etc, un case par mois
	default :     
		url = 'includes/mars.html';     
  }          
  $('#chargement').hide().load(url, function() {       
    //appel de la fonction facultative       
    charge();        
    $(this).fadeIn();     
  });     
  return false;   
  }); 
});  
// fonction facultative, affiche un gif animé pendant l'attente du chargement 
function charge() {   
  var loader = $('<img/>').attr({'src': 'images/loader.gif','alt': 'Chargement en cours... Please wait...'});   
  $('<div id="loader">'+loader+' Chargement en cours... please wait, load in progress...</div>')     
   .insertBefore('#chargement')     
   .ajaxStart(function() {         
   $(this).show();     
  }).ajaxStop(function() {         
      $(this).hide();    
  }); 
}
</script>
</head>
<body>
<div id="corps">
<h1>La recette du mois</h1>     
<p>Pour faciliter la recherche, nous avons class&eacute; les recettes mois par mois. Vous pouvez &eacute;galement utiliser le moteur de recherche en utilisant le nom d'un ingr&eacute;dient ou le nom d'une recette par exemple.</p>          
<div id="menud">             
	<ul>
	    <!-- les titles des liens servent de base pour les chargements -->
		<li><a href="#" title="janv">janvier</a></li>
		<li><a href="#" title="fev">f&eacute;vrier</a></li>
		<li><a class="active" href="#" title="mars">mars</a></li>                 
		<li><a href="#" title="avr">avril</a></li>                 
		<li><a href="#" title="mai">mai</a></li>                 
		<li><a href="#" title="juin">juin</a></li>                 
		<li><a href="#" title="juil">juillet</a></li>                 
		<li><a href="#" title="aout">ao&ucirc;t</a></li>                 
		<li><a href="#" title="sept">septembre</a></li>                 
		<li><a href="#" title="oct">octobre</a></li>                 
		<li><a href="#" title="nov">novembre</a></li>                 
		<li><a href="#" title="dec">d&eacute;cembre</a></li>           
	</ul>         
</div><!-- menud -->
<!-- ici se chargeront les recettes par mois -->
<div id="chargement">
	<!-- on charge par défaut, ajax se charge de changer le contenu -->
	<h3>Les recettes de mars</h3>
	<p>
	Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
	Sed sed lectus tortor. Suspendisse venenatis congue dolor, ut 
	pulvinar tellus ultrices at. Nullam porttitor mauris quis eros 
	congue dictum. In blandit, urna at fringilla hendrerit, erat neque 
	iaculis ante, ac aliquam odio nibh ut justo. Nulla facilisi. 
	Donec sed nisi ac nisi volutpat ullamcorper. Suspendisse in risus 
	ac dui mollis varius sit amet ut nisi. Vivamus porta magna quis elit 
	imperdiet nec adipiscing tortor condimentum. Pellentesque a enim ut 
	magna lacinia dapibus in non nunc. Curabitur molestie lorem ac nulla 
	posuere id sodales nisi accumsan. In hac habitasse platea dictumst
	</p>
</div><!-- chargement -->
</div><!-- corps -->
</body>
</html>


Les fichiers inclus ressemblent à ceci, comme je l'ai dit plus haut, rien que le nécessaire.


<h3>Les recettes de janvier</h3>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Sed sed lectus tortor. Suspendisse venenatis congue dolor, ut 
pulvinar tellus ultrices at. Nullam porttitor mauris quis eros 
congue dictum. In blandit, urna at fringilla hendrerit, erat neque 
iaculis ante, ac aliquam odio nibh ut justo. Nulla facilisi. 
Donec sed nisi ac nisi volutpat ullamcorper. Suspendisse in risus 
ac dui mollis varius sit amet ut nisi. Vivamus porta magna quis elit 
imperdiet nec adipiscing tortor condimentum. Pellentesque a enim ut 
magna lacinia dapibus in non nunc. Curabitur molestie lorem ac nulla 
posuere id sodales nisi accumsan. In hac habitasse platea dictumst
</p>


Bien sur avec php on peut faire beaucoup, beaucoup mieux, bien que l'on peut le faire avec javascript, la gestion des menus, et des chargements.

Edit: pas compris le formatage du post Smiley ohwell Bon ben c'est un bug puisque tout est correct.
Modifié par keran (14 Mar 2011 - 19:19)
Je reposte, désolé mais le post précédent est mal formaté, je ne sais pas pourquoi.

Les recettes, elles pourraient être chargées comme ceci :


<div id="clafoutis"
<h3>clafoutis aux cerises</h3>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.Sed sed lectus tortor. Suspendisse venenatis congue dolor,
</p>
</div>
<div id="omelette"
<h3>omelette aux cèpes</h3>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.Sed sed lectus tortor. Suspendisse venenatis congue dolor,
</p>
</div>


le lien dans le switch du js lui, appelle le clafoutis, par exemple


url = 'includes/mars.html#clafoutis';


je récupére ainsi le div clafoutis. La page dans laquelle se trouvent ces divs est elle, une page complète et valide html ou xhtml.

L'idée de felipe n'est pas mauvaise non plus mais t'éloigne de ton but initial, chargé du contenu sans quitter la page appellante.

a écrit :
De plus, comment au moment où j'affiche la page recette.html pour la première fois être sûr que les recettes affichées correspondent au mois en cours ?


çà, c'est le plus gros morceau...avec php, c'est ultra simple, avec jquery/ajax il y à get mais pour l'instant je ne vois pas trop comment modifié le script pour ajouter la gestion de cette variable. Je vais voir çà.

quant à apprendre jquery, la doc, est très bien faite et il existe des milliers de code tout près et de plugins, de forums. au pire, revient nous voir Smiley cligne
Modifié par keran (14 Mar 2011 - 20:18)
Bonsoir,

Super réponse. Merci bcp keran. Smiley biggrin Bon je récupère tout ça et je teste.

Une question reste cependant : comment faire en sorte que le mois par défaut soit une variable qui dépende du mois en cours ?

Je pense savoir le faire en javascript avec l'objet document.LastModified. Le code sera-t-il le même en jquery ?

Je teste ce soir. Smiley murf

Retour demain après-midi après les courses.
a écrit :
Une question reste cependant : comment faire en sorte que le mois par défaut soit une variable qui dépende du mois en cours ?


Je viens de modifier le post précédent pour répondre à cette question, tu as était plus vite que moi.
Bonsoir,

Super bonne nouvelle, ça marche au petits oignons.
Un peu de CSS à faire pour que l'affichage corresponde à ce que je veux faire.
Je vais essayer le php pour obtenir l'affichage du mois courant.
Si tu veux me faire parvenir la même chose en ajax je suis preneur.
Je suis super content et un grand merci encore. Smiley biggrin

Une question subsidiaire : l'affichage semble être progressif. Dans quelle partie du code cela est-il gérer ? Quelles options existent-ils sans aller chercher des choses trop extravagante ?

Smiley biggrin Smiley biggrin Smiley biggrin

C'est tout pour aujourd'hui. A demain donc.
de l'utilité du dynamisme des langages serveurs, php ou autres.

<li><a class="active" href="#" title="mars">mars</a></li> 


Comment tu vas faire le mois prochain à part modifier à la main ta classe active? Toujours garder à l'esprit que javascript peut être désactivé ou inexistant, bien que ce soit un peu moins courant qu'on veux bien le dire, c'est toujours possible et que ce n'est pas solution à tout.

le code final avec chargement du mois courant avec un lien du genre

mapage.html?mois=mars

Pour les tests utilise http://localhost/mondossier/mapage.html?mois=mars

à condition évidement d'avoir un serveur local installé. Si tu te lance dans le dev web/internet je te le conseille fortement, wamp, au hasard, tu auras ainsi php/mysql/apache d'un seul coup.

en effet, il est fort probable qu'internet explorer, refuse l'ouverture directe à cause des get. Ou utilise firefox qui lui, autorise une url du genre

C:/Program%20Files/wamp/www/perso/tests/ajax.html?mois=mars

Finalement c'est formateur de répondre à certains posts Smiley smile J'aurais moi aussi appris quelque chose et récupéré un super plugin tout léger mais vraiment sympà. Smiley murf

Pour l'affichage progressif c'est le fadeIn sur cette ligne :

$(this).fadeIn();


Il n'est pas obligatoire et d'autres effets sont possible, cherche ici mais c'est de l'affichage, donc, pas tant que çà. On peut faire plus optimisé mais tu as ici toute la base et testée. çà fonctionne Smiley lol



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr-FR">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta http-equiv="Content-Language" content="fr-FR" dir="ltr" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>tests jquery</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
	//plugin trouvé ici :  http://fr.w3support.net/index.php?db=so&id=439463
 
	// il récupére les variables get, bien sympà
	jQuery.extend({     
		'Q' : window.location.search.length <= 1 ? {}         
	: function(a){             
		var i = a.length,                  
		r = /%25/g,                  
		h = {};             
		while(i--) {                 
			var p = a[i].split('=');                 
			h[ p[0] ] = r.test( p[1] ) ? decodeURIComponent( p[1] ) : p[1];             
			}             
		return h;         
		}
		(window.location.search.substr(1).split('&')) 
	});//fin plugin
	// test le mois issu de la variable get
	switch ($.Q.mois) {
		case 'janvier':
			urlMois = 'includes/janvier.html';
			break;
		case 'fevrier':
			urlMois = 'includes/fevrier.html';
			break;
		case 'mars':
			urlMois = 'includes/mars.html';
			break;
		default :
			$('#chargement').html('paramètres incorrect');
		
	}
	$('#chargement').hide().load(urlMois, function() {       
	  $(this).fadeIn();     
	});	
		  
$('#menud a').click(function() {    
  // récupére le title du lien     
  var title = $(this).attr('title');     
  var url = '';     
  switch(title) {         
	case 'janv' :     
		url = 'includes/janv.html';     
		break;          
	case 'fev' :     
		url = 'includes/fev.html';     
		break;
	case 'mars' :     
		url = 'includes/mars.html';     
		break;
	//etc, un case par mois
	default :     
		url = 'includes/mars.html';     
  }          
  $('#chargement').hide().load(url, function() {       
    //appel de la fonction facultative       
    charge();        
    $(this).fadeIn();     
  });     
  return false;   
  }); 
});  
// fonction facultative, affiche un gif animé pendant l'attente du chargement 
function charge() {   
  var loader = $('<img/>').attr({'src': 'images/loader.gif','alt': 'Chargement en cours... Please wait...'});   
  $('<div id="loader">'+loader+' Chargement en cours... please wait, load in progress...</div>')     
   .insertBefore('#chargement')     
   .ajaxStart(function() {         
   $(this).show();     
  }).ajaxStop(function() {         
      $(this).hide();    
  }); 
}
</script>
</head>
<body>
<div id="corps">
<h1>La recette du mois</h1>     
<p>Pour faciliter la recherche, nous avons class&eacute; les recettes mois par mois. Vous pouvez &eacute;galement utiliser le moteur de recherche en utilisant le nom d'un ingr&eacute;dient ou le nom d'une recette par exemple.</p>          
<div id="menud">             
	<ul>
	    <!-- les titles des liens servent de base pour les chargements -->
		<li><a href="#" title="janv">janvier</a></li>
		<li><a href="#" title="fev">f&eacute;vrier</a></li>
		<li><a class="active" href="#" title="mars">mars</a></li>                 
		<li><a href="#" title="avr">avril</a></li>                 
		<li><a href="#" title="mai">mai</a></li>                 
		<li><a href="#" title="juin">juin</a></li>                 
		<li><a href="#" title="juil">juillet</a></li>                 
		<li><a href="#" title="aout">ao&ucirc;t</a></li>                 
		<li><a href="#" title="sept">septembre</a></li>                 
		<li><a href="#" title="oct">octobre</a></li>                 
		<li><a href="#" title="nov">novembre</a></li>                 
		<li><a href="#" title="dec">d&eacute;cembre</a></li>           
	</ul>         
</div><!-- menud -->
<!-- ici se chargeront les recettes par mois -->
<div id="chargement"></div><!-- chargement attention de ne rajouter de retour à la ligne sur ce div -->
</div><!-- corps -->
</body>
</html>
[/i]
Modifié par keran (14 Mar 2011 - 22:45)
Bonjour matinal,

a écrit :

Comment tu vas faire le mois prochain à part modifier à la main ta classe active?


Pas pratique en effet. Je me demandais si une fonction portant sur cet attribut ne permettrait pas de réaliser ce petit tour de passe-passe automatiquement sur la détection du mois courant ? Quitte à utiliser js autant 'tout' faire en js. Bon si c'est vraiment de l'ordre de la machine infernale, laisse béton. Smiley lol

Oui j'utilise lampserver et c vraiment très bien ainsi que ubuntu + firefox.

a écrit :
Pour les tests utilise http://localhost/mondossier/mapage.html?mois=mars


La question que je me pose encore. En fait, si je comprends bien, je dois générer ce type de lien (voir citation) quand j'appelle ma page recette.html afin que je puisse afficher la page de recette correspondant au mois courant.

Donc je dois dans les pages qui appellent la page recette.html trouver ce mois courant avec un petit programme en php ou en js pour pouvoir le passer sous la forme du lien cité plus haut.

Je préfère attendre ta réponse avant de me lancer là-dedans.

En tout état de cause, BRAVISSIMO keran pour ton aide. Smiley biggthumpup
Bonjour,

Petit souci avec le dernier plugin pour obtenir le mois passé par get.
Ca ne fonctionne pas dans mon environnement.
Pourtant localhost fonctionne, j'ai copié/collé le code dans le .js en faisant attention de ne pas dupliquer la première ligne de commande.
Puis test en utilisant le lien avec ?mois=fevrier ajouté à la fin et rien ne se passe.
La page recette.php s'affiche sans la recette du mois de février.

Une idée ? un conseil ? qu'est-ce que j'ai oublié ou pas fait ?

Merci par avance Smiley biggrin
salut pidlas

En fait, là, le dernier code à changer. j'ai testé à part le plug avant de le rajouter

urlMois = 'includes/janvier.html';


alors qu'avant c'était écrit, includes/janv.htm

il n'y a aucune raison que çà ne fonctionne pas si c/c correct donc c'est là le problème.
Gasp,

J'avais bien remarqué qu'il fallait changer janvier.html par jan.html.

Malheureusement ça ne fonctionne toujours pas.

Quel moyen je peux mettre en route pour debugger ce plugin et suivre l'évolution des variables tout au long de l'exécution ?

Cela peut-il venir d'une configuration du serveur Apache ? J'ai pas fait de modif. depuis son installation. Je dois donc être dans une config. standard.

Une idée, une piste à me donner ?

Bon je dois m'absenter 2 heures. Donc c'est normal si vous (keran + autres aides si dispo.) n'entendez pas parler de moi avant 16h00.

Merci pour votre aide. Smiley smile
pidlas a écrit :
Bonjour Felipe,

Merci pour ta réponse. Je n'ai pas encore investigué les logiciels de gestion de contenus. Je fais mes armes pour l'instant avec les langages 'standards' html/css. A ce propos quel tuto, quel site me conseillerais-tu pour avoir une idée que ce que les CMS apportent et surtout comment les intégrer avec un site existant ?


Regarde mon site et imagine que chaque billet est une recette. Smiley cligne

Il y a moyen de changer le /post/ des urls par /recette/ par exemple. Smiley smile
Pages :