11540 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

J'utilise sur un site le script pajinate.js (https://github.com/wesnolte/Pajinate, https://github.com/wesnolte/Pajinate/wiki).
Une page de démo : http://dl.dropboxusercontent.com/u/4151695/html/pajinate/examples/example1.html

Ce script transforme donc une liste d'éléments en une liste paginée, avec un menu de navigation pour passer d'une page à l'autre. Du très classique.

Ca fonctionne donc très bien, mais, parce qu'il y a un mais, on me demande de modifier le comportement pour qu'en plus, les pages défilent automatiquement, sur le principe d'un slider en fait : Toutes les 4 secondes, changement de page, et si la souris est positionnée sur la liste, suspension du défilement automatique.
Le script ne présente pas ce paramètre.

Ma question est donc : Comment puis-je créer le défilement automatique ? La piste que je suivais était d'identifier les fonctions appelées lorsqu'on fait page suivante ou page précédente et les jouer toutes les x secondes, mais je n'y arrive pas ...

Ou alors, parce que je suis ouvert à toute proposition (en tout bien tout honneur Smiley smile ), connaitriez-vous déjà un script de pagination qui aurait dans ses paramètres, à la fois la pagination et le défilement automatique ?

D'avance merci.

Manu
Modérateur
Bonjour,

L'idée, c'est d'ajouter dans pajinate.js :
- un setInterval qui démarre un défilement automatique en exécutant un showNextPage() toutes les 4s,
- un handler à l'event mouseover sur l'objet $page_container, qui stoppe le défilement automatique avec un clearInterval,
- un handler à l'event mouseout sur l'objet $page_container, qui relance le défilement automatique avec un setInterval.

Au niveau du code, c'est un peu alambiqué car il faut mélanger du jquery avec des setInterval/clearInterval. Par exemple, en supposant qu'on ajoute une option maison que j'ai appelée "auto_show_next_page" pour activer le défilement automatique, on peut dans pajinate.js (juste après la ligne if (!options.wrap_around) tagNextPrev();) insérer le code suivant :


if (options.auto_show_next_page)
{
	$.fn.autoshownextpage=function(){
		showNextPage(this.find('.next_link'));};
	$page_container.attr(
		'intervalId',
		setInterval("$('#"+$(this).attr('id')+"').autoshownextpage()",4000)
	);
	$page_container.mouseover(function(ev){
		clearInterval($(this).attr('intervalId'));
	});
	$page_container.mouseout(function(ev){
		$(this).attr(
			'intervalId',
			setInterval("$('#"+$(this).attr('id')+"').autoshownextpage()",4000));
	});
}


Et pour qu'une liste ait cette fonctionnalité, il faut que ses options wrap_around (qui permet de revenir à la première page après avoir affiché la dernière) et auto_show_next_page (qui permet de disposer du défilement automatique) soient à true. Par exemple, si on applique ça à la liste 9 de l'exemple, ça donne :


$(document).ready(function(){
	$('#paging_container9').pajinate({
		num_page_links_to_display : 3,
		items_per_page : 6,
		wrap_around: true,
		show_first_last: false,
		auto_show_next_page: true
	});
});


Note : dans les spécifications, il faudrait sans doute rajouter ce qu'on voudrait obtenir lorsque la machine de l'internaute n'a pas de souris (parce qu'en l'état, rien n'est prévu pour stopper le défilement automatique en l'absence de souris).

Amicalement,
a écrit :
Note : dans les spécifications, il faudrait sans doute rajouter ce qu'on voudrait obtenir lorsque la machine de l'internaute n'a pas de souris (parce qu'en l'état, rien n'est prévu pour stopper le défilement automatique en l'absence de souris).

+10. Tu vas avoir des problèmes avec les utilisateurs de lecteur d'écran, les dislexiques qui mettent plus de temps à lire, peut-ête les épileptiques, mais aussi plus simplement les gens qui naviguent sur téléphone portable ou tablette vu qu'ils n'ont pas de moyen de contrôle.

Les slideshow automatiques sont tout simplement à éviter, ou ne doivent tout au moins pas véhiculer de contenu important.
Modifié par QuentinC (15 Jun 2014 - 07:17)
Modérateur
Bonjour,

Au cas où on aurait plusieurs listes en défilement automatique dans la même page (on ne sait jamais Smiley cligne ), il faut modifier légèrement le code que j'avais proposé précédemment, par exemple comme ci-dessous (mais on a bien sûr pas mal d'autres choix possibles) :


if (options.auto_show_next_page)
{
	$.fn["auto"+$(this).attr('id')]=function(){
		showNextPage(this.find('.next_link'));
	};
	$page_container.attr(
		'intervalId',
		setInterval("$('#"+$(this).attr('id')+"').auto"+$(this).attr('id')+"()",4000)
	);
	$page_container.mouseover(function(ev){
		clearInterval($(this).attr('intervalId'));
	});
	$page_container.mouseout(function(ev){
		$(this).attr(
			'intervalId',
			setInterval("$('#"+$(this).attr('id')+"').auto"+$(this).attr('id')+"()",4000));
	});
}


Amicalement,
Merci beaucoup pour ces pistes !

Je vais me plonger la-dedans.
Effectivement, il peut y avoir plusieurs listes dans une même page, il faut que j'y pense.

Par contre, je n'ai pas la contrainte du lecteur d'écran, du téléphone et de la tablette, au moins pour l'instant : il s'agit d'une appli desktop dans laquelle je viens m'intégrer. S'il n'y a pas de souris sur le poste de travail, il y a tellement de trucs qui ne marcheront pas que ce ne sont pas mes pauvres listes qui y changeront quelque chose Smiley smile
Par contre, je me note ça dans un coin, ça me servira sûrement en 2015 ça ^^


Pour les slideshow automatiques qui sont à éviter, je suis totalement d'accord. Mais il y a pire que le client qui réclame ça à corps et à cris : il y a le supérieur hiérarchique ! Smiley smile
Donc bon, quand les 2 sont d'accord pour réclamer la fonctionnalité ... on finit par la livrer en marquant bien dans la doc de livraison les pbs soulevés, pour pouvoir leur dire dans un grand sourire quand ça commence à râler : je vous avais prévenu Smiley langue


Je regarde tout ça, et je reviendrais donner des nouvelles lorsque j'aurai réussi à arriver à quelque chose.
Encore merci.

Manu