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) !