My very tiny vector graphics application is improving at a snail pace.
I managed to make a colour picker using jQuery and the HTML range input element.
The code isn’t exactly succinct, but it gets the job done.
Because the program is growing larger, I’m trying to use the OOP facets of JavaScript and put the functions in their respective objects as much as possible, the loose functions in the posfunc.js file creates the dialog:
function color_selector_form(color) { frgb = color.get_fill_rgb(); srgb = color.get_stroke_rgb(); var red_slider = "<input class='fill_slider' id='red_slider' value="+frgb[0]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='rfval' >"+frgb[0]+"</div><br> "; var green_slider = "<input class='fill_slider' id='green_slider' value="+frgb[1]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='gfval' >"+frgb[1]+"</div><br>"; var blue_slider = "<input class='fill_slider' id='blue_slider' value="+frgb[2]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='bfval' >"+frgb[2]+"</div><br>"; var fcbox = "<span id=\"fillbox\" style=\"background-color: "+color.fill+"; display: block; height: 50px; width: 50px;\"> </span>"; var red_stroke_slider = "<input class='stroke_slider' id='red_stroke_slider' value="+srgb[0]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='rsval' >"+srgb[0]+"</div><br> "; var green_stroke_slider = "<input class='stroke_slider' id='green_stroke_slider' value="+srgb[1]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='gsval' >"+srgb[1]+"</div><br>"; var blue_stroke_slider = "<input class='stroke_slider' id='blue_stroke_slider' value="+srgb[2]+" type=\"range\" min=\"0\" max=\"255\"> <br> <div id='bsval' >"+srgb[2]+"</div><br>"; var scbox = "<span id=\"strokebox\" style=\"background-color: "+color.stroke+"; display: block; height: 50px; width: 50px;\"> </span>"; var retval = "<table><tr><td>Fill<br><br>"; retval += "Red: <br>" + red_slider + "Green: <br>" + green_slider + "Blue: <br>" + blue_slider + "<br>" + fcbox; retval += "</td><td>   </td><td>Stroke<br><br>"; retval += "Red: <br>" + red_stroke_slider + "Green: <br>" + green_stroke_slider + "Blue: <br>" + blue_stroke_slider + "<br>" + scbox; retval += "</td></tr></table>"; return retval; }
While the pos.js has the $(document).ready() functions for the dynamically created elements:
jQuery(document).on("change mousemove", ".fill_slider", function() { selected_color.update_fill(jQuery(this).val(), jQuery(this).attr("id")); var id = jQuery(this).attr("id"); //console.log(id + " " +jQuery(this).val()); if(id.substring(1, 2) == "r") { jQuery("#red_val").html(jQuery(this).val()); } else if(id.substring(1, 2) == "g") { jQuery("#green_val").html(jQuery(this).val()); } else if(id.substring(1, 2) == "b") { jQuery("#blue_val").html(jQuery(this).val()); } });
Which in turn calls the appropriate methods in the MyColor object.
MyColor.prototype.update_fill = function(colorval, id) { var hexredval = parseInt(colorval).toString(16); if(hexredval.length < 2) hexredval = "0" + hexredval; var channel = id.substring(0,1); if(channel == "r") this.fill = (this.fill.substring(0, 1) + hexredval.substring(0, 2) + this.fill.substring(3)).toUpperCase(); else if(channel == "g") this.fill = (this.fill.substring(0, 3) + hexredval.substring(0, 2) + this.fill.substring(5)).toUpperCase(); else if(channel == "b") this.fill = (this.fill.substring(0, 5) + hexredval.substring(0, 2)).toUpperCase(); jQuery("#" + channel + "fval").html(colorval); jQuery("#fillbox").css("background-color", this.fill); update_color(this); }
As you can see, the code isn’t really DRY, but I find that making a clumsy solution is a great way to start a project and get anything done whatsoever, and then improve on it (or just keep it until it becomes cluttered).