Monday, November 29, 2010

2:01 AM
As I continue to learn jQuery, I think it's important that I begin by porting over scripts I've created using MooTools. One of those scripts is my Color Palette Generator script, which debuted on Eric Wendelin's blog. For those of you that missed it, my script analyzes all of the colors on the page (minus images) and builds a palette of colors. Here it is in some jQuery goodness.


<input type="button" id="get-colors" value="Get Colors" class="button" />
<div id="colors-wrapper"></div>

All we need to begin with is the button that triggers the palette generation and a DIV container that will hold all of the DIVs my jQuery creates.


.dcolor { height:40px; }
.dtext {  }
.dwrapper { width:200px; float:left; padding:10px; margin:0 20px 20px 0; border:1px solid #ccc; }

These CSS classes act as containers for the text DIV I generate and the color-displaying DIV I generate. Those two DIVs are held in one wrapping DIV.

The jQuery JavaScript

/* when the dom is ready */
$(document).ready(function() {
$('#get-colors').click(function() {  
//my colors array
var colors = new Array();
//get all elements
$('*').each(function() {
if($(this).css('background-color') && $(this).css('background-color') != 'transparent') { colors.push($(this).css('background-color')); }
if($(this).css('color')) { colors.push($(this).css('color')); }
if($(this).css('border-color')) { colors.push($(this).css('border-color')); }
//remove dupes and sort
//create a color block for all of them
jQuery.each(colors,function(it,value) {
if(!$('div[rel=\'' + value + '\']').length)
//inject the wrapper
var wrapper_id = 'w' + it;
$('<div class="dwrapper" id="' + wrapper_id + '" rel="' + value + '"> </div>').appendTo('#colors-wrapper');
//inject the color div
$('<div class="dcolor" style="background-color:' + value + '"> </div>').appendTo('#' + wrapper_id);
//inject text div
$('<div class="text">' + value + '</div>').appendTo('#' + wrapper_id);

When someone clicks the "Get Colors" button, I grab every element in the DOM and collect its color, background-color, and border-color. Once I've cycled through all of the elements, cycle through all of the colors and display them as DIVs inside my colors-wrapper element. You'll note that I utilized therel attribute to prevent duplicates.