jQuery.random()

Un petit plugin jQuery qui permet de mélanger un groupe d'éléments

Le plugin est encore en construction, tous les commentaires sont les bienvenus, et il est sur gitHub !

J'ai besoin, pour le prochain site de l'entreprise qui m'emploie (les cordonniers, tout ça…), de sélectionner un élément au hasard dans un ensemble de nœuds sélectionnés via jQuery.

Après avoir trop rapidement cherché (en fait, un plugin existe déjà. Et j'ai trouvé une autre solution via :random qui ne m'a pas plu), j'ai décidé de coder mon petit plugin personnel :


jQuery.fn.random = function(options) {
	var elements = this;
	var numberOfElements;
	var elementsToReturn = jQuery([]);
	var settings = {
		howManyElementsToReturn: 'all'
	}
	
	if(options) {
		if (typeof(options) == 'number') {
			settings.howManyElementsToReturn = options;
		} else {
			jQuery.extend(settings, options);
		}
	}

	if (settings.howManyElementsToReturn != 'all') {
		settings.howManyElementsToReturn = parseInt(settings.howManyElementsToReturn);
		if (isNaN(settings.howManyElementsToReturn) || settings.howManyElementsToReturn < 1) {
			return null; // FIXME : ce morceau de code ne sert pas pour l'instant
		}
	}

	numberOfElements = elements.size();

	if (settings.howManyElementsToReturn >= numberOfElements || settings.howManyElementsToReturn == 'all') {
		settings.howManyElementsToReturn = numberOfElements;
	}

	while(settings.howManyElementsToReturn > 0 && numberOfElements > 0) {
		var rand = Math.round( Math.random() * (numberOfElements-1));
	
		elementsToReturn = elementsToReturn.add(elements.eq(rand));
		elements = elements.not(':eq('+rand+')');
	
		numberOfElements = elements.size();
		settings.howManyElementsToReturn = settings.howManyElementsToReturn-1;
	}

	return elementsToReturn;
};

J'ai aussi codé une rapide démo du fonctionnement du plugin.

J'ai le sentiment de passer à côté de quelque chose en ne parvenant pas à utiliser .pushStack(), le add().clone() ne me semble pas propre… MàJ : tellement pas propre que j'ai finalement retiré le .clone(), il cassait le chaînage.

Enfin, j'ai aussi publié le code du plugin sur gitHub (et c'est une première pour moi) !

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

La discussion continue ailleurs

URL de rétrolien : http://www.lespacedunmatin.info/blog/index.php?trackback/954

Fil des commentaires de ce billet