02.3 JavaScriptの変更

1. rootオジェクトの定義

root = {
        // context
        "ctx":null,

        // ccanvasの初期化
        "init":function () {
                var cnvs = document.getElementById('canvas');
                this.ctx = cnvs.getContext('2d');
        },

        // 描画処理
        "draw":function (x, y, cnvBold, cnvColor ) {
                this.ctx.lineWidth = cnvBold;
                this.ctx.strokeStyle = 'rgba('+cnvColor+')';
                // 初回処理の判定
                if (globalThis.clickFlg == "1") {
                        globalThis.clickFlg = "2";
                        this.ctx.beginPath();
                        this.ctx.lineCap = "round";  // 線を角丸にする
                        this.ctx.moveTo(x, y);
                } else {
                        this.ctx.lineTo(x, y);
                }
                this.ctx.stroke();
        },

        // canvasの背景色を設定(指定がない場合にjpeg保存すると背景が黒になる)
        "setBgColor":function( bgColor){
                const cnvWidth = 500;
                const cnvHeight = 500;

                this.ctx.fillStyle = bgColor;
                this.ctx.fillRect(0,0,cnvWidth,cnvHeight);
        }
};

1.1 JSONオブジェクによる定義

 root:{
    "ctx":null,
    "init":function () { ... }
       "draw":function (x, y, cnvBold, cnvColor ) { ... }
       "setBgColor":function( bgColor){  ... }
  };

 JSONオブジェクトはオブジェクトリテラルの記法を基にしている
・オブジェクトリテラルの中には、数値リテラル、文字リテラル、オブジェクトリテラル、配列リテラル、関数リテラル、正規表現リテラルが持てる
・JSONオブジェクトは JSON文字列とJSON値から成る
・JSON値の中には、JSONオブジェクト、JSON配列、JSON文字列、JSON数値、のほかtrue,false,nullが持てる

1.2 globalThis.clickFlg
関数内なので、グルーバル変数であることを明示的にする

1.3 this.ctx
this.ctx は root.ctxと同一

1.4 this.ctx.lineWidth, this.ctx.strokeStyle
 this.ctx.lineWidth = cnvBold;
 this.ctx.strokeStyle = ‘rgba(‘+cnvColor+’)’;
JavaScriptでは、オブジェクトにプロパティが定義されていなくても、代入可能
・新たなプロパティが代入時に生成される

2.初期化プログラムinit()
2.1 初期化プログラムinit()のfunction定義

function init () {
    // canvas

    globalThis.clickFlg = 0;  // クリック中の判定 1:クリック開始 2:クリック中
    // 変数宣言
    var cnvColor = "255, 0, 0, 1";  // 線の色
    var cnvBold = 5;  // 線の太さ
    var bgColor = "rgb(255,255,255)";

    // canvasの背景色を設定(指定がない場合にjpeg保存すると背景が黒になる)
    root.init();
    root.setBgColor(bgColor);



    // canvas上でのイベント
    $("#canvas").mousedown(function(){
      globalThis.clickFlg = 1; // マウス押下開始
    }).mouseup(function(){
      globalThis.clickFlg = 0; // マウス押下終了
    }).mousemove(function(e){
      // マウス移動処理
      if(!globalThis.clickFlg) return false;
      root.draw(e.offsetX, e.offsetY, cnvBold, cnvColor);
    });


/*
    // 色の変更
    $(".color a").click(function(){
      cnvColor = $(this).data("color");
      return false;
    });
*/

        let cElements = document.getElementsByClassName('color');
        var c_elms;
        for (let i = 0; i < cElements.length; i++) {
                c_elms = cElements[i].childNodes;

                for (let j = 0; j < c_elms.length; j++) {
                        if(c_elms[j].tagName != 'A') {
                                continue;
                        }
                        c_elms[j].onclick = function() {
                                cnvColor = this.getAttribute( "data-color" ) ;
                                console.log("cnvColor ="+cnvColor );
                        }
                }
        }


/*
    // 線の太さ変更
    $(".bold a").click(function(){
      cnvBold = $(this).data("bold");
      return false;
    });
*/

        let bElements = document.getElementsByClassName('bold');
        var b_elms;
        for (let i = 0; i < bElements.length; i++) {
                b_elms = bElements[i].childNodes;

                for (let j = 0; j < b_elms.length; j++) {
                        if(b_elms[j].tagName != 'A') {
                                continue;
                        }
                        b_elms[j].onclick = function() {
                                cnvBold = this.getAttribute( "data-bold" ) ;
                                console.log("cnvBold ="+cnvBold );
                        }
                }
        }


    // 描画クリア
    $("#clear").click(function(){
      root.ctx.clearRect(0,0);
      root.setBgColor(bgColor);
    });

    // canvasを画像で保存
    $("#download").click(function(){
      canvas = document.getElementById('canvas');
      var base64 = canvas.toDataURL("image/jpeg");
      document.getElementById("download").href = base64;
    });
}

2.1 globalThis.clickFlg
init関数内なので、グルーバル変数であることを明示的にする

2.2 jQueryからの置き換え
bdfore:

    // 線の太さ変更
    $(".bold a").click(function(){
      cnvBold = $(this).data("bold");
      return false;
    });

after:

        let bElements = document.getElementsByClassName('bold');
        var b_elms;
        for (let i = 0; i < bElements.length; i++) {
                b_elms = bElements[i].childNodes;

                for (let j = 0; j < b_elms.length; j++) {
                        if(b_elms[j].tagName != 'A') {
                                continue;
                        }
                        b_elms[j].onclick = function() {
                                cnvBold = this.getAttribute( "data-bold" ) ;
                                console.log("cnvBold ="+cnvBold );
                        }
                }
        }

3.ソースをすべて読み込んでからinitを実行させる

window.onload = init;