[jQuery]plugin - accordion

웹 & 안드로이드/HTML5|2014. 7. 29. 11:09

댓글()

[CSS]div로 요소 세로 가운데 정렬

웹 & 안드로이드/HTML5|2014. 7. 24. 09:55
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<style>
#tableDiv{
    height:100%;
    display : table;
}
 
$cellDiv{
    display : table-cell;
    vartical-align : middle;
}
</style>
 
<div id="tableDiv">
    <div id="cellDiv">
        <img src="#">
    </div>
</div>

 

 

display : table, table-cell은 table, td태그와 같은 효과를 부여하여 table-cell내 요소의 세로 정렬을 가능하게 만들어 준다.

 

댓글()

[jQuery]요소를 추가하는 메소드(append, prepend, after, before)

웹 & 안드로이드/HTML5|2014. 7. 23. 10:33

append : 요소내의 맨 마지막에 새로운요소를 추가

prepend : 요소내의 맨 처음에 새로운 요소를 추가

after : 요소의 뒤에 추가

before : 요소의 앞에 추가

댓글()

[jQuery]썸네일을 만들어주는 플러그인 NailThumb

웹 & 안드로이드/HTML5|2014. 7. 23. 10:29

다운로드 : http://www.garralab.com/nailthumb.php

 

사용법

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 다운 로드 받은 js와 css파일을 추가. 당연히 jquery도 포함되어야 한다. -->
<script src="jquery.nailthumb.1.1.min.js"></script>
<link rel="stylesheet" href="jquery.nailthumb.1.1.min.css">
 
 
<div class="thumb">
    <img src="이미지 주소">
</div>
 
<script>
    $('.thumb').nailthumb();
</script>

 

 

아주 간단하게 썸네일 이미지를 모여줄 수 있다.

댓글()

websocket 정리(작성중..)

웹 & 안드로이드/HTML5|2014. 7. 8. 18:28

내가만든 java용 webSocketServer library

wakeup5_JavaWebSocketServer_v0.1.jar

 

1. 웹소켓 지원 브라우저 

(출처 - http://caniuse.com/#feat=websockets)

Current에 있는 것이 현재 버전이고

초록색이 지원, 분홍색이 미지원 브라우저.

(현재 대부분의 브라우저가 지원을 하는데 안드로이드는 이제야 지원하는 것 보니 왜 진즉에 안했나 싶음.. 유저에게 업데이트를 강제할 수도 없고 ㅡ.,ㅡ)

 

2. 웹소켓의 접속 과정

먼저 클라이언트에서 접속 요청을 보내고, 서버에서 요청을 받아 요청 정보를 핸드쉐이크 후 응답을 하면 소켓이 연결이 된다. 그 이후 소켓 통신처럼 스트림을 이용해 데이터를 주고 받을 수 있다.

 

2-1. 웹소켓의 접속

웹소켓의 접속은 브라우저에서 이루어지며 접속 방법은 다음과 같다.

var ws= new WebSocket('ws://localhost:8080/resources');

접속url은 ws:// 혹은 wss://(http://와 https://랑 같다), 접속할 host와 포트, /이후의 리소스로 이루어 진다.

 

2-2. 웹소켓 오픈 핸드쉐이크

먼저 요청을 보내고, 서버에서는 요청 헤더를 보고 적절히 응답을 보내야 한다. 이러한 과정을 핸드쉐이크라고 한다.

요청 헤더

        GET /{resources} HTTP/1.1
        Host: server.example.com
        Upgrade: websocket
        Connection: Upgrade
        Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
        Origin: {host}
        Sec-WebSocket-Version: 13

 

응답 헤더

        HTTP/1.1 101 Switching Protocols
        Upgrade: websocket
        Connection: Upgrade
        Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

응답 헤더는  HTTP/1.1 101 Switching Protocols로 시작하며

Upgrade: websocket
Connection: Upgrade

Sec-WebSocket-Accept:

이 세개의 키값은 반드시 포함하여야 한다.

Sec-WebSocket-Accept의 값 만드는 방법

1. 요청 헤더의 Sec-WebSocket-Key 값에 미리 정의된 문자열을 ("258EAFA5-E914-47DA-95CA-C5AB0DC85B11")를 붙여 새로운 문자열을 만든 후,

2. 새로운 문자열을 SHA-1로 암호화.

3. 암호화 된 값을 다시 BASE64로 인코딩 하고 Sec-WebSocket-Accept를 키로하는 응답 헤더를 작성.

 

여기까지가 연결 핸드쉐이크이며 응답을 받은 클라이언트에서 Sec-WebSocket-Accept값을 비교하여 값이 일치 할 경우 소켓이 연결되며, 데이터를 주고 받을 수 있다.

 

2-3 웹소켓의 데이터.

 

 

0. 웹소켓 정보

웹소켓 api - http://www.w3.org/TR/2011/WD-websockets-20110419/#websocket

웹소켓 문서 - http://tools.ietf.org/html/rfc6455

 : 웹소켓 정보에 대해 아주 자세히 나와있으나 영어.. ㅠㅠ

댓글()

label 태그를 이용하여 폼 컨트롤 다루기.

웹 & 안드로이드/HTML5|2014. 6. 9. 21:41

일반적으로 잘 사용하지 않는 태그 중 LABEL 태그가 있다. 이 LABEL 태그를 잘 활용하면 라디오 버튼, 체크 박스, 입력 상자 등의 폼 컨트롤을 직접 선택하지 않고 텍스트만 눌러도 폼 요소가 선택이 되는 효과를 줄 수가 있다.

먼저 실행 결과부터 살펴 보도록 하자.

라디오 버튼을 직접 선택하지 않고, "예", "아니오" 같은 텍스트를 선택해도 체크 박스가 선택됩 니다.
LABEL 태그를 사용해 본 적이 있습니까?


 

체크박스를 직접 선택하지 않고, "네트웍 프로그래밍" 같은 텍스트를 선택해도 체크 박스가 선 택됩니다.
관심분야를 선택하세요!

 

 

아래 "주소를 입력하세요"란 텍스트를 클릭하면 입력 상자가 선택이 됩니다.

 

 

위 실행 결과에 대한 소스는 다음과 같다:

<STYLE>
LABEL {
cursor:hand;
color: black;
}
</STYLE>
 
<p>라디오 버튼을 직접 선택하지 않고, "예", "아니오" 같은 텍스트를 선택해도 체크 박스가 선택됩니다.<br>
<b>LABEL 태그를 사용해 본 적이 있습니까?</b>
<FORM>
<INPUT TYPE=radio ID=FirstButton NAME=radio1>
<LABEL FOR=FirstButton TITLE="있으면 예를 선택하세요!"></LABEL>
<BR>
<INPUT TYPE=radio ID=SecondButton NAME=radio1>
<LABEL FOR=SecondButton TITLE="없으면 아니오를 선택하세요">아니오</LABEL> </p>

<p>체크박스를 직접 선택하지 않고, "네트웍 프로그래밍" 같은 텍스트를 선택해도 체크 박스가 선택됩니다.<br>
<b>관심분야를 선택하세요!</b><br>
<INPUT TYPE="checkbox" NAME="INT" ID="int1">
<LABEL FOR="int1" TITLE="관심분야 : 네트웍 프로그래밍">네트웍 프로그래밍</LABEL>
<INPUT TYPE="checkbox" NAME="INT" ID="int2">
<LABEL FOR="int2" TITLE="관심분야 : 웹 프로그래밍">웹 프로그래밍</LABEL>
<INPUT TYPE="checkbox" NAME="INT" ID="int3">
<LABEL FOR="int3" TITLE="관심분야 : CS 프로그래밍">CS 프로그래밍</LABEL></p>

<p>아래 "주소를 입력하세요"란 텍스트를 클릭하면 입력 상자가 선택이 됩니다.<br>
<b><LABEL FOR="addr" TITLE="당신의 주소를 입력하세요!">주소를 입력하세요!</LABEL></b><br>
<INPUT TYPE="text" NAME="ADDR" ID="addr"> </p>

</FORM>

 

사용 방법은 간단하다. LABEL 태그의 속성으로 FOR를 사용하여 연결된 폼 컨트롤의 ID를 할당해 주면 된다.

 

댓글()

[Canvas] canvas를 이용한 좌표계 그리기

웹 & 안드로이드/HTML5|2014. 6. 3. 21:20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <canvas id="canvas" style="border:1px solid #000000;">
    </canvas> 
    <script type="text/javascript">
    
    function Coordinate(width, height, scaleToPixel){
        
        var pixel = scaleToPixel || 1;
        width = width || 500;
        height = height || 500;
        
        var canvas = document.getElementById("canvas");
        canvas.width = width;
        canvas.height = height;
        var context = canvas.getContext("2d");
        
        init();
        function init(){
            line(-width/2, 0, width/2, 0);
            line(0, -height/2/pixel, 0, height/2/pixel);
            
            text(-width/2/pixel, -10/pixel, parseInt(-width/2/pixel) + ", 0");
            text((width-55)/2/pixel, -10/pixel, parseInt(width/2/pixel) + ", 0");
            
            text(5/pixel, (-height+5)/2/pixel, "0, " + parseInt(-height/2/pixel));
            text(5/pixel, (height-20)/2/pixel, "0, " + parseInt(height/2/pixel));
            
            text(2.5/pixel, -10/pixel, "0");
        }
        
        this.allReset = function reset(){
            canvas.width = canvas.width;
        }
        
        this.drawLine = line; 
        function line(startX, startY, endX, endY){
            //console.log(startX, startY);
            
            context.beginPath();
            context.moveTo(dx(startX), dy(startY));
            context.lineTo(dx(endX), dy(endY));
            context.closePath();
            context.stroke();
        }
        
        this.drawText = text;
        function text(x, y, text, fontSize){
            context.beginPath();
            context.font = (fontSize || 10)+"px Arial";
            context.fillText(text, dx(x), dy(y));
        }
        
        function dx(x){
            return (x * pixel + width/2);
        }
        function dy(y){
            return (-y * pixel + height/2);    
        }
        
    }
    
    window.onload = function(){
        
        var maxX = 501, maxY = 501;
        var pixel = 100;
        var c = new Coordinate(maxX, maxY, pixel);
        var i = -maxX / 2 / pixel;
        f = setInterval(function(){
            var u = 0.1;
            c.drawLine(i, Math.sin(i), i+u, Math.sin(i+u));
            i += u;
            //console.log(i+", "+Math.sin(i) +" : "+ (i+u)+", "+ Math.sin(i+u));
            if(i * pixel >= maxX/2){
                clearInterval(f);
            }
        }, 20);
        
    }
    
    </script>
</body>
</html>

 

canvas를 이용하여 만든 좌표계 객체로 사인파를 그려본 것.

댓글()

[Canvas] 연습

웹 & 안드로이드/HTML5|2014. 6. 2. 23:21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<script type="text/javascript">
    
    var maxX = 500; maxY = 500;
    var centerX = maxX/2, centerY = maxY/2;
    var x = 0, y = 0;
    var drawX = function(xx){
        
        return (xx || x) + centerX;
    };
    var drawY = function(yy){
        return (-yy || -y) + centerY;    
    }
    window.onload = function(){
        
        c = getCanvasContext(maxX, maxY);
        
        drawLine(0, centerY, maxX, centerY);
        drawLine(centerX, 0, centerX, maxY);
        
        x = 10;
        y = 20;
        
        drawLine(centerX, centerY, drawX(), drawY());
        drawText(drawX(), drawY(), x + ", " + y);
 
        x = -100;
        y = -50;
        
        drawLine(centerX, centerY, drawX(), drawY());
        drawText(drawX(), drawY(), x + ", " + y, 20);
        
        c.stroke();
    }
    
    function getCanvasContext(x, y){
        var cv = document.getElementById("myCanvas");
        cv.setAttribute("width", x);
        cv.setAttribute("height", y);
        
        return cv.getContext("2d");
    }
    
    function drawLine(startX, startY, endX, endY){
        c.moveTo(startX, startY);
        c.lineTo(endX, endY);
    }
    
    function drawText(x, y, text, fontSize){
        c.font = (fontSize || 10)+"px Arial";
        c.fillText(text, x, y);
    }
</script>
<canvas id="myCanvas" style="border:1px solid #000000;">
</canvas> 

 

 

결과물

 

댓글()

[Javascript] let - 변수 스코프를 조절하는 키워드.

웹 & 안드로이드/HTML5|2014. 5. 29. 09:51
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(function(){
    
    var total = 0;
    for(var i = 1; i < 11; i++){
        var temp = i;
        total += temp;
    }
    
    console.log("total : " + total);
    
   //블록 내에 선언된 변수들이지만 호출이 가능하다..
    console.log("temp : " + temp);
    console.log("i : " + i);
    
})();

결과 :

total : 55

temp : 10

i : 11

 

자바스크립트는 함수 내의 블록내(if문이나 for문 등)에 선언되어도 변수의 스코프가 함수 전체로 되어버린다. 

그러나 var대신 let이라는 키워드를 사용하면 일반 자바나 c#처럼 블록내에서만 사용할 수 있는 변수가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(function(){
    
    var total = 0;
    for(let i = 1; i < 11; i++){
        let temp = i;
        total += temp;
    }
    
    console.log("total : " + total);
    
   //밖에서는 정의되지 않았기 때문에 호출하려고 하면 에러가 난다..
    console.log("temp : " + temp);
    console.log("i : " + i);
    
})();

결과 :

total : 55

error! : 'temp'이(가) 정의되지 않았습니다.

 

let keyword refference - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let 

댓글()

[에러].submit() is not function - form 객체 submit()이 안될 때

웹 & 안드로이드/HTML5|2014. 5. 18. 10:00
<script type="text/javascript">
    window.onload = function(){
        document.querySelector("input[type=button]#button1")
        .addEventListener("click", function(){
            var pw = document.querySelector("input[type=password]#pw").value;
            var pw2 = document.querySelector("input[type=password]#pw2").value;
            
            console.log(pw + pw2);
              
            if(pw == pw2){
                document.form1.submit();
            }
        });
    }
</script>

<form name="form1" action="${contextPath}/member/join" method="post">
    id : <input type="text" name="id" required="required"/>
    pw : <input type="password" id="pw" name="pw" required="required"/>
    pw 확인 : <input type="password" id="pw2" required="required"/>
    <input type="button" id="submit" value="입력"/>
</form>

비밀번호 두개를 비교하여 같으면 submit하는 스크립트이다.

하지만 이 상황에서는 submit이 함수가 아니라며 submit이 되지 않는다..

그 이유는 20번 줄에 버튼의 id에 submit이라는 값을 주었기 때문... submit이라는 값을 주지 않으면 정상적으로 동작한다..

댓글()