지난번 포스트에서 canvas를 제어하는 javascript는 <canvas>태그 이후 정의해야만 했었다.
오늘은 정의위치와 상관없이 짜는 방법을 찾아보겠다.

아울러 이 방법은 javascript를 통한 canvas 캡슐화의 한 방법이기도 하니 알아두면 좋을 것이다.

(javascript에서 함수는 객체, var는 private으로 취급된다는걸 염두하면 당연한 일이다)



우선 지난번 만들었던 index.html과 javascript이다.

Index.html

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="UTF-8">

<title>Nagarry's HTML5</title>

<link type="text/css" rel="stylesheet" href="./css/Nagarry.css">

</head>

<body>

<canvas id="CANVAS_1" width="800" height="480">

Sorry, Your browser doesn't support HTML5 Canvas.

</canvas>

<script src="./script/Nagarry.js"></script>

</body>

</html>


Nagarry.js

var can1 = document.getElementById("CANVAS_1");

var context1 = can1.getContext("2d");

context1.fillStyle = "#ff0000";

context1.fillRect(50, 50, 360, 240);


canvas이후에 javascript가 위치한다.

javascript에서 canvas를 사용하므로, canvas가 정의된 이후에 javascript를 써야했던 것이다.


이걸 이렇게 고쳐보겠다.

우선 javascript 정의를 <canvas>훨씬 전인 <head>내부에 위치시켰고,

Index.html

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="UTF-8">

<title>Nagarry's HTML5</title>

<link type="text/css" rel="stylesheet" href="./css/Nagarry.css">

<script src="./script/Nagarry.js"></script>

</head>

<body>

<canvas id="CANVAS_1" width="800" height="480">

Sorry, Your browser doesn't support HTML5 Canvas.

</canvas>

</body>

</html>



javascript도 이렇게 바꾸겠다.

Nagarry.js

window.addEventListener("load", eventWindowLoaded, false);


function eventWindowLoaded()

{

var can1 = document.getElementById("CANVAS_1");

var context1 = can1.getContext("2d");

context1.fillStyle = "#ff0000";

context1.fillRect(50, 50, 360, 240);

}


index.html은 javascript정의 순서만 바뀌었는데,

javascript는 뭔가 바뀌었다.

바로 이녀석이 핵심이다.

window.addEventListener("load", eventWindowLoaded, false);


여기서 window란 윈도xp나 윈도7같은 OS가 아니고, DOM(Document Object Model)객체의 최상위 객체다.

window가 최상위 객체다보니 사실은 window.document.getElementById("CANVAS_1");이라도 해도 무방하나,

window는 보통 생략하고, 위 소스와 같이 document.getElementById("CANVAS_1");라고만한다.

이것을 window.addEventListener("load", eventWindowLoaded, false);에 적용시켜보면,

addEventListener("load", eventWindowLoaded, false);이라고 작성해도 무방하다는 말이다.

실제로 브라우저들은 아무문제없이 이를 처리한다.




<window는 DOM최상위 객체- http://www.w3.org/TR/DOM-Level-3-Events/>



결국 DOM최상의 레벨인 만큼 window는 html페이지 전체를 의미하고,

결국 html페이지를 의미하는 window으로부터 addEventListener()라는 것을 호출했다.


addEventListener()는 이벤트큐에 함수를 추가하는 기능을 하고 3개의 인자를 가진다.

첫째인자는 이벤트인데, window의 이벤트는 이미 다 정의되어 있기에 여기선 html페이지가 모두 로딩되면

호출되는 "load"를 사용했다.

(참고 : http://www.w3.org/TR/DOM-Level-3-Events/)

두번째 인자는 함수명이다. 이벤트가 발생하면 호출되는 함수인데, 여기선 html페이지가 load되면 eventWindowLoaded()라는 함수를 호출하게 된다.

셋째 인자는 useCapture이다. DOM하위로 이벤트를 보낸건지 말건지 결정한다.

여기선 false이므로 더이상 하위로 보내지않는다.


셋째인자인 useCapture와 상관없이 프로그램을 짜려면

window.addEventListener("load", eventWindowLoaded, false);

부분을 다르게 바꿀 수 있다. window.[on이벤트]라는 방식이다.


이렇게 말이다.

window.onload = function()

{

eventWindowLoaded();

}

이건 다시 한줄로 이렇게 표한할 수도 있다.

window.onload = eventWindowLoaded();


아지만 나는 .NET프로그램을 짜던 내 습관과 가장 유사한 이 방식이 가장 내 맘에 든다.

window.addEventListener("load", eventWindowLoaded, false);// 이게 잘 맘에 듬

(물론 형태에 따라 저장후 호출되는 함수이냐 즉시실행함수이냐 등의 차이는 있으나, 아직은 무시하자)


다시 말하면 결국 이 코드는...

Nagarry.js

window.addEventListener("load", eventWindowLoaded, false);


function eventWindowLoaded()

{

var can1 = document.getElementById("CANVAS_1");

var context1 = can1.getContext("2d");

context1.fillStyle = "#ff0000";

context1.fillRect(50, 50, 360, 240);

}


html페이지가 모두 로딩되면,

eventWindowLoaded()라는 함수를 호출하게 되고,

그 함수안에서 canvas와 context를 사용하게 되는 것이다.


이렇게 canvas변수를 이벤트 함수안에 넣어 캡슐화하면, 혹시나 모를 다른 변수나 함수와의 충돌을 피할 수 있다.

Google AdSense

'끄적끄적 > HTML5' 카테고리의 다른 글

HTML5 Canvas 이미지 처리  (1) 2014.03.07
HTML5 Canvas 이미지/스프라이트  (2) 2014.03.06
HTML5 개발툴 끝판왕(?) - Liveweave  (2) 2014.03.02
[HTML5] Javascript로 canvas제어하기  (0) 2014.03.01
HTML5 시작하기  (0) 2014.03.01

HTML5 작성을 하면서 아쉬운점이...

대부분의 툴들이 CANVAS와 같은 HTML5 최신 요소들을 제대로 지원해주지 않는다는 것이다.





코드 어시스트 기능에 익숙해진 나같은 개발자에게...

"객체."이후 관련 멤버값을 자동으로 표시해주지 않는 것은 엄청난 스트레스였다.


예전처럼 개발할때마다 객체의 프로퍼티나 메서드를 알아보기 위해....

일일히 MSDN같은 Document를 뒤지는 것은 피곤한 일이 아닐 수 없다.


그런데 이것을 보라!!!!


세상에 canvas객체에도 점하나 찍으니 관련 코드들이 어시스트 되고 있다!!!!!

Liveweave라는 녀석인데, 내 PC에 설치한 프로그램도 아니다.

그냥 웹이다. 주소는....

http://liveweave.com/


화면이 4구역으로 나뉘어져 있는데,

좌상단은 HTML5, 우상단은 Javascript,

좌하단은 CSS, 우하단은 브라우저 화면이다.


코딩을 하면 우하단의 브라우저화면에 즉각 반영이 되는 것은 물론!!


Tools하부 메뉴로 가면 1개의 파일로 저장 또는 3개의 파일을 zip으로 압축해서 저장하는 것도 가능하다.

(zip확장자 없이 다운로드 되는데, ".zip"을 붙여서 사용하면 된다)


인터넷에 접속만 할 수 있다면,

eclipse, coda, XDK, Dreamweaver, visual web developer 2010 express 뭐 이런 프로그램 다~~~ 필요없다.


PS. Internet Explorer 9에서 확인해보니 정상 작동하지 않는다.

인터넷 익스플로어 사용자는 HTML5를 본격지원하는 10버젼 이상을 사용해야할듯하다.

Google AdSense

이전 포스트에서 index.html, Nagarry.css를 만들었다.

이젠 Javascript파일 Nagarry.js를 추가해서 Canvas를 제어해 보겠다.




canvas는 말 그대로 뭔가를 그릴 수 있는 도화지 같은 바탕일 뿐이기에

크기 이외의 모든 것은 Javascript를 통해 이루어진다.


아래와 같은 index.html과 Nagarry.css파일을 준비하자.

(이전 포스트에서 작성했던 내용이다.)

Index.html

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="UTF-8">

<title>Nagarry's HTML5</title>

<link type="text/css" rel="stylesheet" href="./css/Nagarry.css">

<script src="./script/Nagarry.js"></script>

</head>

<body>

<canvas id="CANVAS_1" width="800" height="480">

Sorry, Your browser doesn't support HTML5 Canvas.

</canvas>

</body>

</html>

Nagarry.css

@CHARSET "UTF-8";

body

{

background:#555555;

margin:20px;

}


#CANVAS_1

{

background:#ffffff;

border:1px solid #000000;

}



이제 아무 의심없이 아래와 같은 Javascript파일을 만들어보자.

Nagarry.js

var can1 = document.getElementById("CANVAS_1");

var context1 = can1.getContext("2d");

context1.fillStyle = "#ff0000";

context1.fillRect(50, 50, 360, 240);


이 javascript가 문제없이 동작한다면....

canvas내의 50, 50좌표에 360*240 크기의 붉은 사각형이 나타날 것이다.

(이 구문의 설명은 밑에서 하겠다)


브라우저를 통해 실행해보라.

지난 포스트에서 봤던거랑 달라진게 있는가???


없다. 붉은 사각형이 나타나지 않는다.

왜그럴까?

index.html파일을 다시 보겠다.

Index.html

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="UTF-8">

<title>Nagarry's HTML5</title>

<link type="text/css" rel="stylesheet" href="./css/Nagarry.css">

<script src="./script/Nagarry.js"></script>

</head>

<body>

<canvas id="CANVAS_1" width="800" height="480">

Sorry, Your browser doesn't support HTML5 Canvas.

</canvas>

</body>

</html>


javascript에서는 분명 "CANVAS_1"이라는 것을 당겨썼지만,

"CANVAS_1"보다 먼저 javascript가 호출되었기 때문이다.


달리말해 <canvas>태그가 정의된 후에 javascript가 정의되거나 호출되어야 한다는 것이다.

그래서 수정하자면 아래와 같다.

Index.html

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="UTF-8">

<title>Nagarry's HTML5</title>

<link type="text/css" rel="stylesheet" href="./css/Nagarry.css">

</head>

<body>

<canvas id="CANVAS_1" width="800" height="480">

Sorry, Your browser doesn't support HTML5 Canvas.

</canvas>

<script src="./script/Nagarry.js"></script>

</body>

</html>


수정후 브라우저를 통해 보면 이젠 사각형이 나올 것이다.


이제야 의도한 대로 동작한다.


그럼 javascript 문장을 살펴보겠다.

첫줄부터 마지막줄까지 설명한다.(이런 친절한 설명은 처음이자 마지막이 아닐까 싶다ㅎㅎㅎㅎ)

Nagarry.js

var can1 = document.getElementById("CANVAS_1");

var context1 = can1.getContext("2d");

context1.fillStyle = "#ff0000";

context1.fillRect(50, 50, 360, 240);


var can1 = document.getElementById("CANVAS_1");

can1이란 변수에 id가 "CANVAS_1"이라고 정의된 녀석을 대입한다.

이것으로 can1이 canvas가 되는것이다.


var context1 = can1.getContext("2d");

context1이란 변수에 canvas의 2d context를 대입한다.

context란 웹브라우저에서 제공하는 canvas용 그리기 영역이다.

하나의 canvas에는 하나의context가 있어, context와 canvas는 1:1매칭이 되고,

context를 통해 canvas에 이것 저것을 채워넣을 수 있다.

canvas의 다른 메서드는 젤 밑부분 "1)부가설명"을 보라.


context1.fillStyle = "#ff0000";

context에서 채우기 기능을 할 경우 채움색을 지정한다.

"#ff0000"이니 뭐든 채우기를 할 경우 붉은 색이 될 것이다.


context1.fillRect(50, 50, 360, 240);

사각형 채우기 기능을 한다.

x좌료 50, y좌표 50에서 시작하는 가로 360, 세로 240 사각형을 그린다.



자, 그럼 여기서 드는 의문.

<canvas>를 제어하는 javascript는 언제나 <canvas>태그 이후에 정의 되어야 하는가???

아니다. 방법이 있다.

<canvas>보다 앞에서 정의되더라도 얼마든지 제어할 수 있다.

다음 포스트에서 살펴보도록 하겠다.



---------------------------------------------------------------------------------------

1)부가설명

canvas의 메서드는 아래와 같다.

메서드 

내용 

  getContext() 

  canvas의 context를 반환한다. 

  toDataURL(type, quality)

  데이터 URL을 반환한다. <img>태그의 src속성에 쓰일 수 있는데,

  첫 인자인 type은 image/jpeg, image/png같은 이미지 타입을 지정한다.

  두번째 인자인 quality는 0.0~1.0으로 이미지 품질수준을 지정한다.

  toBlob(callback, type, args...)

  캔버스의 이미지 파일을 나타내는 Blob을 생성한다.

  첫 인자인 callback은 호출하는 함수,

  두번째 인자인 type은  image/png같은 이미지 타입,

  세번째 인자는 0.0~1.0으로 이미지 품질수준을 지정하고...

  이미지 특성을 제어하기 위해 다른 인수를 추가할 수 있다.



2)부가설명

HTML태그인 canvas의 속성은 딱 2가지 밖에 없다.

속성 

 내역

타입 

기본값 

 width

canvas의 너비 

음이 아닌 정수 

300 

 height

canvas의 높이 

음이 아닌 정수 

150 


아래와 같이 기술했다면, html을 통해 할 수 있는 모든것을 다한 셈이다.

<canvas id="CANVAS_1" width="800" height="480">Canvas지원하는 최신 브라우저 쓰세요</canvas>


Google AdSense

HTML, CSS 2개의 파일로 구성되는 HTML5 기본 페이지를 만들어 보겠다.

(Index.html, css/Nagarry.css)

Index.html

Nagarry.css





Index.html

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="UTF-8">

<title>Nagarry's HTML5</title>

<link type="text/css" rel="stylesheet" href="./css/Nagarry.css">

<script src="./script/Nagarry.js"></script>

</head>

<body>

<canvas id="CANVAS_1" width="800" height="480">

Sorry, Your browser doesn't support HTML5 Canvas.

</canvas>

</body>

</html>

HTML5는 이전 HTML과 차이가 있는데, 윗부분에 파랗게 마크한 부분이다.


첫째. <!DOCTYPE html>

HTML5 표준을 따르는 문서라는 뜻이다. HTML5문서를 작성할때 항상 첫줄에 두어야한다.


둘째. <html lang="ko">

<html>해더에 사용언어 명시


셋째. <meta charset="UTF-8">

문자가 깨지는 것을 방지하기 위해 "euc-kr", "utf-8"등 캐릭터셋을 명시해야한다.


넷째. <script src="./script/Nagarry.js"></script>

더이상 <script> 태그내에 type="text/javascript"라는 구문은 필요없다.

Javascript가 표준이기 때문에 생략이 되었다.


다섯째. <canvas id="CANVAS_1" width="800" height="480"></canvas>

HTML5에는 새로운 태그들이 추가되었고, 그 중 대표적인 태그인 <Canvas>이다.

<canvas ...> </canvas> 사이에 "Sorry, ..."라는 부분이 있는데, 이것은 <canvas>태그를 표현하지 못하는 브라우저를 위한것이다.

구형 브라우저는 <canvas ...>태그를 인식하지 못하므로 <canvas ...></canvas>사이에 있는 문장을 브라우저에 그대로 노출시킨다.

하지만, <canvas>를 인식하는 브라우저는 <canvas>만을 표현하고, <canvas ...>와 </canvas>사이의 문장은 그냥 무시하게 된다.


Nagarry.css는 아래와 같고...

Nagarry.css

@CHARSET "UTF-8";

body

{

background:#555555;

margin:20px;

}


#CANVAS_1

{

background:#ffffff;

border:1px solid #000000;

}



지금까지의 결과를 브라우저에서 보면 이렇게 보일꺼다.


만약 Canvas영역(흰색 사각영역)이 나타나지 않고,

"Sorry, Your browser doesn't support HTML5 Canvas."라는 구문만 보인다면, 브라우저를 바꾸어야 한다.

크롬, 사파리, 파이어폭스, 오페라 브라우저를 사용한다면 별 탈없이 잘 보이지만,

(꽤 오래된 버젼이 아니라면 말이다)

인터넷익스플로어는 최소 9버젼 이상을 사용해야한다.


참고로, 브라우저의 HTML5지원 정도를 알아보고 싶으면

http://html5test.com/ 를 방문하면 된다. 보편적으로 어느 OS에서나 크롬이 젤 괜찮은 지원을 보여준다.

<550점이 만점의 html5 지원정도 -출처 : html5test.com)



다음포스팅에서는 Canvas를 javascript로 기초적으로 제어하는 포스팅을 할 예정이다.

Google AdSense

HTML5 CANVAS를 이용해서 이것저것 짜볼려고 하는데,

윈도우즈나 맥 모두 무료로 개발툴을 제공하고 있어 이를 이용하면 된다.



맥에는 Xcode가 있고, 윈도에는 Visual Express시리즈인 Visual Web Developer 2010 Express가 있다.

하지만, Windows7와 OSX 두OS 모두를 사용하는 내 입장에선

Windows/맥 둘다 항상 같은 환경에서 개발이 하고 싶었다.


그래서 인터페이스가 어디에서나 똑같은 이클립스를 사용하기로 했다.

이클립스 다운로드 링크 --> http://www.eclipse.org/downloads/


EE(Enterprise Edition)말구 용량이 적은 Standard를 설치했더니,

기본적인 HTML이나 Javascript포맷이 지원되지 않는다.

<마법사는 HTML, Javascript를 내놓지 않는다 ㅡㅡ;;)



결국 HTML5를 위해 기본적인 Plug-In를 하나 설치한다.

[Help]-[Eclipse Marketplace]에서 html5로 검색을 해보면,

아래와 같이 나오는데 그중 첫번째인 "HTML Editor"를 설치해본다.

<EE버젼을 설치했다면 기본으로 있었을 HTML Editor>



설치하고 Eclipse를 재시작하고 나면, 이렇게 Javascript와 Web이라는 항목이 지원된다.

<이제 JavaScript, CSS, HTML 포맷이 다 지원되는군>


PS1. 이클립스는 Java를 설치해야 동작하기 때문에 intel에서 배포중인 XDK도 참 좋은 도구이다.

windows/Mac/Linux 모두 지원되고, 해보진 않았지만, 스마트폰/태블릿 포팅도 지원하는 듯 하다.

http://software.intel.com/en-us/html5/tools


PS2. 아무래도 편리성과 코드 어시스트면에서 최고의 웹개발툴은  liveweave인듯 하다.

HTML5를 지원하는 브라우저에서 http://liveweave.com 가서 사용하기만 하면 되는 웹어플

Google AdSense

'끄적끄적 > HTML5' 카테고리의 다른 글

Event 처리를 통한 Canvas 캡슐화  (0) 2014.03.04
HTML5 개발툴 끝판왕(?) - Liveweave  (2) 2014.03.02
[HTML5] Javascript로 canvas제어하기  (0) 2014.03.01
HTML5 시작하기  (0) 2014.03.01
HTML5 지원 브라우저 현황  (0) 2013.05.02

+ Recent posts