Web Application

Javascript을 이용한 Drag & Drop

3월 7, 2018 Javascript No comments

javascript에서 drag & drop 구현 하기

1.index.html 파일 생성 및 div로 id=target으로 추가. 추후 Drop Area로 windows의 explorer에서 file을 Drag & Drop 예정

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    #target {
        background-color: lightgreen;
    }
</style>
</head>
<body>
<h1>Test nginx1</h1>
    <script type="text/javascript"></code>
    <div id="target"><p>&nbsp;</p><p>Drop Aread</p><p>&nbsp;</p></div>
</body>
</html>

2. dragover, drop handler 함수 구현. drop effect를 move로 설정

function dragover_handler(ev) {
    ev.preventDefault();
    // dropEffect를 move로 설정.
    ev.dataTransfer.dropEffect = "move"
}

function drop_handler(ev) {
    ev.preventDefault();
    console.log(ev);
}

3.div tag에 drag, drop event 연결

<div id="target" ondrop="drop_handler(event);" ondragover="dragover_handler(event);">

4.결과 화면. 외부 파일을 drag후 over시 이동 이라고 effect 확인

svj.js interaction sample

1월 11, 2018 svg.js 1 comment

svj.js를 활용한 interaction 예제 구현

1.초기 Frame영역 설정, rect형태로 Frame size 선언

var SVG = require('svg.js');
var svgdraw = SVG("drawing").size(300, 300);
var rectFrame = {
    left:   0,
    top:    0,
    right:  svgdraw.width(),
    bottom: svgdraw.height()
};

2.svg line 객체로 frame 그리기, 추후 line svg를 통해 intersecion 검사 수행

var frameLines = []
frameLines.push(svgdraw.line(rectFrame.left, rectFrame.top, rectFrame.left, rectFrame.bottom).attr({stroke:"black"}));
frameLines.push(svgdraw.line(rectFrame.left, rectFrame.bottom, rectFrame.right, rectFrame.bottom).attr({stroke:"black"}));
frameLines.push(svgdraw.line(rectFrame.right, rectFrame.bottom, rectFrame.right, rectFrame.top).attr({stroke:"black"}));
frameLines.push(svgdraw.line(rectFrame.right, rectFrame.top, rectFrame.left, rectFrame.top).attr({stroke:"black"}));

3. browser의 refresh에 맞춰 draw 추가

function OnDraw() {
    window.requestAnimationFrame(OnDraw);
    // svgdrawing code goes here
    frameCount++;
}
OnDraw();

4. 1초 단위로 frame rate 출력

///Frame Rate
var textFrameRate = svgdraw.text('Frame Rate: 0 f/s');
textFrameRate.move(svgdraw.width()-150, svgdraw.height()-25);

//Frame rate
setInterval(function(){ 
    frameRate = frameCount;
    frameCount = 0;
    textFrameRate.text("Frame Rate: " + frameRate + " f/s");
}, 1000);

5. Random하게 circle svg 객체 생성 하기

circleSize = 20;
circleCount = 6;
colors = ["red", "blue", "yellow", "black","#F80","#80F"]
for(var i=0; i<circleCount; i++)
{
    posX[i] = Math.floor((Math.random() * svgdraw.width()) - circleSize);
    posY[i] = Math.floor((Math.random() * svgdraw.height()) - circleSize);
    if(posX[i] < 0) posX[i]=0;
    if(posY[i] < 0) posY[i]=0;
    circles[i] = svgdraw.circle(circleSize).attr({fill: colors[i]}).move(posX[i], posY[i]);
}

6. source circle객체 마다 다른 cicle객체 충돌 검사, frame 외벽 검사 수행

for(var src=0; src<circles.length; src++)
{
    var isIntersect = false;
    var srcObj, destObj;
    srcObj = circles[src];

    ///Circle
    for(var dest=0; dest<circles.length; dest++)
    {
        if(src == dest) continue;
        if(intersectRect(circles[src], circles[dest]))
        {
            isIntersect = true;
            destObj = circles[dest];
            break;
        }
    }
    
    ///Frame
    if(!isIntersect)
    {
        for(var f=0; f<frameLines.length; f++)
        {
            if(intersectRect(circles[src], frameLines[f]))
            {
                isIntersect = true;
                destObj = frameLines[f];
                break;
            }
        }
    }
}

7. 충돌이라고 판단되면, 방향 전환
원래는 충돌 면에 따라 움직이는 방향을 정해야 하지만, 임시 테스트 이기에 충돌 없을때까지 무작위로 수행

if(isIntersect)
{   
    var tryCount = 0;
    while(intersectRect(srcObj, destObj))
    {
        if(tryCount++ > 10)
            break;
        changeDirection(src);
        moveCircle(src);
    }
}

8.초기 생성시에 random위치 생성시 서로 충돌 나는 예외처리 추가
반복적으로 생성 하면서 충돌시 재생성

for(var i=0; i<circleCount; i++)
{
    var cir = createCircle(i);
    for(var dest=0; dest<circles.length; dest++)
    {
        if(!intersectRect(cir.circle, circles[dest]))
            break;
        cir.circle.remove();
        dest--;
        cir = createCircle(i);
    }
    posX[i] = cir.posX;
    posY[i] = cir.posY;
    circles[i] = cir.circle;

    dirs[i] = Math.floor((Math.random() * 4));
    changeDelta(i, dirs[i]);
}

9.전체 source는 github에 (https://github.com/scanhand/test_svgjs)

10.결과 화면

svj.js draggable 사용

1월 10, 2018 svg.js No comments

svg.draggable1. svg.draggable.js 설치

$npm install -save svg.draggable.js

2.초기 간단한 frame border 그리기

var SVG = require('svg.js');
var draw = SVG('drawing').size(300, 300);
var frame = draw.rect(300, 300).attr({stroke: 'black', fill: 'none'});
var circle = draw.circle(100).attr({ fill: '#3B3'});

3. svg.draggable.js require() 추가 및 움직이고자 하는 object에 draggable 추가

var svgdrag = require('svg.draggable.js');
circle.draggable();

4.결과 화면



svj.js npm + webpack 사용

1월 9, 2018 svg.js No comments

npm + webpack을 이용한 svg.js 사용

1. npm init을 통해 초기화 수행

$ npm init

2. svg.js 설치

$ npm install -save svg.js

3. webpack 설치 / 추후 debugging을 위해 source-map-loader 설치

$ npm install -save webpack source-map-loader 

4. webpack.config.js 파일 추가
entry fileindex.js로 설정

module.exports = {
    entry: './index.js',
    output: {
        path: __dirname,
        filename: 'bundle.js'
    },

    module: {
            loaders: [
                // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
                { enforce: "pre", test: /\.js$/, loader: "source-map-loader" }
            ]
    },

    resolve: {
        extensions: ['.js']
    }
};

5. index.js 파일 작성

var SVG = require('svg.js');
var draw = SVG('drawing').size(300, 300);
var circle = draw.circle(100).attr({ fill: '#3B3'});

6. weppack 수행

$ webpack
Hash: f1b01a8441b3b6f4f17f
Version: webpack 3.10.0
Time: 290ms
    Asset    Size  Chunks             Chunk Names
bundle.js  150 kB       0  [emitted]  main
   [0] ./index.js 127 bytes {0} [built]
    + 1 hidden module

7.index.html파일에 bundle.js 파일 추가

    <body>
        <div id="drawing"></div>   
        <script type="text/javascript" src="bundle.js"></script>
    </body>

8.결과 화면

svg.js 시작 하기

1월 9, 2018 svg.js No comments

svj.js? svg javascript libarary

javascript을 이용한 svg.js 사용

1.index.html 파일 수정

<html>
    <head>
        <title>test svg.js</title>
    </head>
    <body>
    </body>
</html>

2. body아래에 svg.js cdn link 추가, 작업용 index.js 파일 추가

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.3/svg.js"></script> 
<script type="text/javascript" src="index.js">

3. index.js 간단한 sample용 code 추가
-간단한 예제로 div id darwing를 가지는 SVG instance를 생성
-그 이후 svg에 rect 객체 생성후 fill attribute 설정

var draw = SVG('drawing').size(300, 300);
var rect = draw.rect(100, 100).attr({ fill: '#f06' });

4. index.html에 drawing id를 가지는 div 추가

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.3/svg.js"></script> 
<script type="text/javascript" src="index.js">
<div id="drawing"></div>

5.nginx를 통해 실행시 아래와 같은 error발생

6.원인은 body아래 script가 load된 시점 이전에 div tag가 없기에 해당 node를 찾을 수 없다는 error가 발생
즉, div tag를 index.js 상단으로 위치 이동

<div id="drawing"></div>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.3/svg.js"></script> 
<script type="text/javascript" src="index.js">

7.결과 화면

nginx 시작 하기

1월 8, 2018 nginx No comments

1. nginx를 먼저 download
link : https://nginx.org

2.압축을 풀면 별거 없음. 단지, 약 3 Mbyte nginx.exe가 핵심

3.기본 program concept이 singleton 개념으로 별도의 shell에서 start, 별도의 shell에서 stop수행…

4.우선 시작 하기

$ nginx 

5. 중지를 원하면 별도 shell에서

$ nginx -s stop 

6.시작된 html root위치는
C:\nginx\html

7.conf폴더에 폼함된 nginx.conf 파일을 이용하여 기본 다양한 설정 가능 (ex, index page변경, port 변경,…)

server {
        listen       80;
        server_name  localhost;
        ...

8. index.html 실행 예제 (http://localhost)

table 추가

1월 8, 2018 bootstrap No comments

1. 기존 Table과 동일하게 생성

2. Hearer는 thead 사용

3. body는 tbody 사용

4. tr, td는 동일

5. example source

<table class="table table-dark">
  <thead>
    <tr>
      <th scope="col">#</th>
      <th scope="col">First</th>
      <th scope="col">Last</th>
      <th scope="col">Handle</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">1</th>
      <td>Mark</td>
      <td>Otto</td>
      <td>@mdo</td>
    </tr>
    <tr>
      <th scope="row">2</th>
      <td>Jacob</td>
      <td>Thornton</td>
      <td>@fat</td>
    </tr>
    <tr>
      <th scope="row">3</th>
      <td>Larry</td>
      <td>the Bird</td>
      <td>@twitter</td>
    </tr>
  </tbody>
</table>

6.결과

carousel slider 추가

carousel slider 추가

1.class carrousel slide 추가, id 설정 및 data-ride=”carousel” 설정

<div id="carouselExampleControls" class="carousel slide" data-ride="carousel">

2. div class=carousel slide , div class=carousel-inner 추가

<div class="carousel slide" data-ride="carousel">
<div class="carousel-inner">

3. 추가하고자 하는 slider item carousel-item을 추가 후, 안에 img 추가

<div class="carousel-item active"><span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span> 
    <img class="d-block w-100" width="400px" height="500px" src="first.png" alt="First Slide"> 
</div>

4. 좌우 page 전환 `prev, next button` 추가

<a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
</a>

5.최종 추가된 sample

<div id="carouselExampleControls" class="carousel slide" data-ride="carousel">
    <div class="carousel slide" data-ride="carousel">
        <div class="carousel-inner">
            <div class="carousel-item active">
                <img class="d-block w-100" width="400px" height="500px" src="first.png" alt="First Slide">
            </div>
            <div class="carousel-item">
                <img class="d-block w-100" width="400px" height="500px" src="second.png" alt="Second Slide">
            </div>
            <div class="carousel-item">
                <img class="d-block w-100" width="400px" height="500px" src="third.png" alt="Third Slide">
            </div>
        </div>
        <a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev">
                    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
                    <span class="sr-only">Previous</span>
        </a>
        <a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next">
                    <span class="carousel-control-next-icon" aria-hidden="true"></span>
                    <span class="sr-only">Next</span>
        </a>
    </div>
</div>

7. 최종 sample output

bootstrap 처음 사용

bootstrap 사용

참고 site : https://getbootstrap.com

최초 index.html 파일 생성

<html> 
 <head> 
 <title>Test bootstrap</title>
 </head>
 <body>
 <h1>Test bootstrap</h1>
 </body>
</html>

bootstrap files link 추가 body tag 안에 추가

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/js/bootstrap.min.js" integrity="sha384-a5N7Y/aK3qNeh15eJKGWxsqtnX/wWdSZSKp+81YjTmS15nvnvxKHuzaWwXHDli+4" crossorigin="anonymous"></script>

button 추가

<button type="button" class="btn btn-primary">Primary</button>

primary_button

Raphael Click 및 Mouse Over Event Test

Raphael을 사용하여 Circle 그리기

for(var i=0; i<10; i++) 
{ 
    paper = Raphael(0, 0, 500, 500); 
    var circle = paper.circle(50, i*50, width); 
}

출력화면

circle_1

여기서 circle에 click 및 mouse over event 연동 추가


    circle .click(function(this : any){
        this.attr({fill : '#0F0'});
    })

    circle.mouseover(function(this : any){  
        this.attr({fill : '#F00'});
    })

이때, 문제 발생

  1. Mouse Click 및 Over Event가 Random하게 인식되는 현상.
  2. 한번 전체적으로 Mouse Over를 통해 인식된 이후 부터는 정상 인식되는 현상

원인 ㅡㅡ;

최초 circle의 attribute가 없어서 line으로만 인식,,,…..ㅡㅡ;;;

최초 circle 생성시

attr({fill : '#000'})

추가 후 정상적으로 잘 작동 됨