LoginSignup
1
1

More than 5 years have passed since last update.

html backbone.js colorpicker

Posted at

backbone.js の練習で作った colorpicker です。
もうちょっとうまいやり方がある気がします。
クリックで背景色が変わって
ダブルクリックで、パレットの色を変更できます。
localstorage にパレットを保存します。
backbone.js の例の中のひとつとしてみてください。
(荒削りですが)

colorpicker.html
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <style type="text/css">
      <!--
      a.colorpicker
      {
      display: block;
      text-decoration:none;
      width: 12px;
      height: 12px;
      border: solid 1px #888888;
      }
      a.colorpicker:hover
      {
      border: solid 1px #aaaaaa;
      }
      div.class01
      {
      position: absolute;
      top:17px; left:20px;
      display: none;
      }
      a.class02
      {
      position: relative;
      top: 0px; left: 0px;
      }
      -->
    </style>
    <script language="JavaScript" type="text/javascript" src="javascripts/jquery-1.9.0.min.js"></script>
    <script language="JavaScript" type="text/javascript" src="javascripts/underscore-min.js"></script>
    <script language="JavaScript" type="text/javascript" src="javascripts/backbone-min.js"></script>
    <script language="JavaScript" type="text/javascript" src="javascripts/backbone.localStorage-min.js"></script>
    <script type="text/javascript" language="JavaScript">
      <!--
      function showColorpicker() {
        document.getElementById('pickupcolor').style.display = 'block';
        document.getElementById('changecolor').style.display = 'none';
      }
      //-->
    </script>
  </head>
  <body>
<script type="text/template" id="colorink">
 <a href='#' class='colorpicker' style='background-color: <%- name %>'></a> 
</script>

    <a href="#" class="class02" onclick="showColorpicker();"></a>

    <div style="position:absolute;display:none;float:left;border:1px solid #000000;" id="pickupcolor">
      <table>
        <tr>
          <td colspan="8" align="right">
          <input type="button" value="×" style="width:16px;height:16px;padding: 0px;" onclick="document.getElementById('pickupcolor').style.display='none';">
          </td>
        </tr>
        <tbody id="palette">
        </tbody>
      </table>

      <div style="position:absolute;none;float:left;border:1px solid #000000;" id="changecolor">
        <table>
          <tr>
            <td colspan="2" align="right">
            <input type="button" value="×" style="width:16px;height:16px;padding: 0px;" onclick="document.getElementById('changecolor').style.display='none';">
            </td>
          </tr>
          <tr>
            <td>
            <input type="text" value="#ffffff" id="inkcode" onchange="setColor(this);" />
            </td>
            <td>
            <input type="button" value="OK" onclick="changeInk(document.getElementById('inkcode').value);document.getElementById('changecolor').style.display='none';"/>
            </td>
          </tr>
        </table>
      </div>

    </div>

    <script src="javascripts/colorpicker.js"></script>
  </body>
</html>
colorpicker.js
var colorarray = 
[
  ['#000000',1,'black']
  ,['#0000CD',1,'mediumblue']
  ,['#0000FF',1,'blue']
  ,['#006400',1,'darkgreen']
  ,['#008000',1,'green']
  ,['#008080',1,'teal']
  ,['#008B8B',1,'darkcyan']
  ,['#00BFFF',1,'deepskyblue']
  ,['#00CED1',1,'darkturquoise']
  ,['#00FA9A',1,'mediumspringgreen']
  ,['#00FF00',1,'lime']
  ,['#00FF7F',1,'springgreen']
  ,['#00FFFF',1,'aqua']
  ,['#00FFFF',1,'cyan']
  ,['#8B0000',1,'darkred']
  ,['#800000',1,'maroon']
  ,['#F08080',1,'lightcoral']
  ,['#BC8F8F',1,'rosybrown']
  ,['#CD5C5C',1,'indianred']
  ,['#B22222',1,'firebrick']
  ,['#A52A2A',1,'brown']
  ,['#FFE4E1',1,'mistyrose']
  ,['#FA8072',1,'salmon']
  ,['#FF6347',1,'tomato']
  ,['#E9967A',1,'darksalmon']
  ,['#FF7F50',1,'coral']
  ,['#FF4500',1,'orangered']
  ,['#FFA07A',1,'lightsalmon']
  ,['#A0522D',1,'sienna']
  ,['#FFF5EE',1,'seashell']
  ,['#8B4513',1,'saddlebrown']
  ,['#F4A460',1,'sandybrown']
  ,['#FFDAB9',1,'peachpuff']
  ,['#CD8541',1,'peru']
  ,['#FAF0E6',1,'linen']
  ,['#D2691E',1,'chocolate']
  ,['#FFE4C4',1,'bisque']
  ,['#FF8C00',1,'darkorange']
  ,['#DEB887',1,'burlywood']
  ,['#D2B48C',1,'tan']
  ,['#FAEBD7',1,'antiquewhite']
  ,['#FFDEAD',1,'navajowhite']
  ,['#FFEBCD',1,'blanchedalmond']
  ,['#FFEFD5',1,'papayawhip']
  ,['#FFE4B5',1,'moccasin']
  ,['#FFA500',1,'orange']
  ,['#FDF5E6',1,'oldlace']
  ,['#F5DEB3',-1,'wheat']
  ,['#FFFAF0',-1,'floralwhite']
  ,['#B8860B',-1,'darkgoldenrod']
  ,['#DAA520',-1,'goldenrod']
  ,['#FFF8DC',-1,'cornsilk']
  ,['#FFD700',-1,'gold']
  ,['#FFFACD',-1,'lemonchiffon']
  ,['#EEE8AA',-1,'palegoldenrod']
  ,['#F0E68C',-1,'khaki']
  ,['#BDB76B',-1,'darkkhaki']
  ,['#FFFFF0',-1,'ivory']
  ,['#FFFFE0',-1,'lightyellow']
  ,['#F5F5DC',-1,'beige']
  ,['#FAFAD2',-1,'lightgoldenrodyellow']
  ,['#FFFF00',-1,'yellow']
  ,['#808000',-1,'olive']
  ,['#9ACD32',-1,'yellowgreen']
  ,['#6B8E23',-1,'olivedrab']
  ,['#556B2F',-1,'darkolivegreen']
  ,['#B1FF2F',-1,'greenyellow']
  ,['#7FFF00',-1,'chartreuse']
  ,['#7CFC00',-1,'lawngreen']
  ,['#F0FFF0',-1,'honeydew']
  ,['#98FB98',-1,'palegreen']
  ,['#90EE90',-1,'lightgreen']
  ,['#32CD32',-1,'limegreen']
  ,['#8FBC8F',-1,'darkseagreen']
  ,['#228B22',-1,'forestgreen']
  ,['#3CB371',-1,'mediumseagreen']
  ,['#2E8B57',-1,'seagreen']
  ,['#F5FFFA',-1,'mintcream']
  ,['#66CDAF',-1,'mediumaquamarine']
  ,['#7FFFD4',-1,'aquamarine']
  ,['#40E0D0',-1,'turquoise']
  ,['#20B2AA',-1,'lightseagreen']
  ,['#48D1CC',-1,'mediumturquoise']
  ,['#FAFFFF',-1,'azure']
  ,['#E0FFFF',-1,'lightcyan']
  ,['#2F4F4F',-1,'darkslategray']
  ,['#AFEEEE',-1,'paleturquoise']
  ,['#5F9EA0',-1,'cadetblue']
  ,['#B0E0E6',-1,'powderblue']
  ,['#ADD8E6',-1,'lightblue']
  ,['#87CEEB',-1,'skyblue']
  ,['#87CEFA',-1,'lightskyblue']
  ,['#F0F8FF',-1,'aliceblue']
  ,['#4682B4',-1,'steelblue']
  ,['#1E90FF',-1,'dodgerblue']
  ,['#778899',-1,'lightslategray']
  ,['#708090',-1,'slategray']
  ,['#B0C4DE',-1,'lightsteelblue']
  ,['#6495ED',-1,'cornflowerblue']
  ,['#4169E1',-1,'royalblue']
  ,['#FF0000',0,'red']
];
/*
 * 色名が正しいかどうか
 * str : 色名
 * array : 使用できる色名の配列
 */
function colorformat(str,array)
{
    if(str.match(/^#[0-9|a-f|A-F]{6}/))
      return true;
    else if(str.match(/^#[0-9|a-f|A-F]{3}/))
      return true;
    else
      for(i=0;i<array.length;i++)
            if(str.toLowerCase() == array[i][2])
                return true;
    return false;
}
function setColor(obj)
{
  if(colorformat(obj.value,colorarray))
  {
    obj.style.backgroundColor = obj.value;
  }
}
function changeInk(inkcode)
{
  if(colorformat(inkcode,colorarray))
  {
    colorbuffer.model.set('code',inkcode);
    colorbuffer.model.set('name',inkcode);
    colorbuffer.el.childNodes[1].style.backgroundColor = inkcode;
    colorbuffer.model.save();
  }
}
/*
 * use backbone.js
 */
var colorbuffer;
var colors;
(function(){
  /* model */
  var Color = Backbone.Model.extend({
    defaults:
    { 
        code: "#ffffff"
        ,order: -1
        ,name: "white"
    }
  });
  /* model view */
  var ColorView = Backbone.View.extend({
    tagName: 'td'
    ,events:{
      "dblclick": "showChangeInkColor"
      ,"click": "setColor"
    }
    ,showChangeInkColor: function(){
      colorbuffer = this;
      $('#changecolor').show();
    }
    ,setColor: function(){
      console.log(this.model.get('code'));
      $('body').css('background', this.model.get('code'));
    }
    ,template: _.template($('#colorink').html())
    ,render: function()
    {
      var template = this.template(this.model.toJSON());
      this.$el.html(template);
      return this;
    }
  });
  /* collection */
  var ColorList = Backbone.Collection.extend({
    model: Color
    ,localStorage: new Backbone.LocalStorage('items')
  })
  colorList = new ColorList;
  /* collection view */
  var ColorsView = Backbone.View.extend({
    tagName: 'tr'
    ,initialize: function()
    {
      colorList.fetch();
    }
    ,render: function()
    {
      this.collection.each(function(color)
      {
        var colorView = new ColorView({model: color});
        this.$el.append(colorView.render().el);
      },this);
      return this;
    }
  });
  /* make collection */
  colorList.fetch();
  if(0 == colorList.length)
  {
    for(i=0;i<colorarray.length;i++)
    {
      if(-1 < colorarray[i][1])
      {
        colorList.create({
          code:colorarray[i][0]
          ,order:colorarray[i][1]
          ,name:colorarray[i][2]
        });
      }
    }
    colorList.fetch();
  }
  //tr の中に td 8 のテーブル……
  var colorsView = new ColorsView({collection: colorList});
  var str = colorsView.render().el;
  var tds = $(str).find('td');
  var tr;
  for(i=0;i<40;i++)
  {
    if(i % 8 == 0)
      tr = document.createElement('tr');
    tr.appendChild(tds[i]);
    if(i % 8 == 7)
    {
      $('#palette').append(tr);
    }
  }
})();//end of $function 

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1