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;