/*

 * IMC 의 장비 가동상태바 를 도시하기 위한 플러그인

 * by MHD

 */


$.widget( "imc.barchart", {

// default options

options: {

margin : 20,

statusColor: {

auto : "#219244"

, idling : "#eb9934"

, setup : "#595858"

, change : "#00a0e9"

, alarm : "#ca1134"

, off : "#9e9e9f"

, defaultColor : "#FFFFFF"

},

oee : {

second : "second"

, startDateTime : "start_date"

, status : "status"

},

tickColor : "#AAAAAA",

tickWidth : 1,

dutyTime : "00:00",

hourTxt : '시간' ,

minTxt : '분' ,

toolTipPosition : 'up', // tooltip의 위치 up, down

isShowTooltip : true ,

isLimitMoveTooltip : false,

// callbacks

onChangedDate: null ,  //function(e, addDays){}  param  +1 다음날, -1 전날 날짜 변환 이벤트 발생 function(e, addDays) 

// 선언되지 않으면 날짜 변경이 되지 않음 .. 즉 당일꺼만 볼 경우... 날짜이동이 없는 경우

onClickBarChart : null ,// functiono(e, timeTxt) 클릭시 콜백 timeTxt 값을 리턴

onChangedViewType : null ,//function(e, t){}  t = 'day', 'hour', 'min'

onChangedTooltip : null, // functiono(e, left, timeTxt, isShow) left 위치좌표, top 은 필요없음, isShow 로 마우스 over 상태 확인, txt 로 시간 체크

onDrawBar : null // function(e, oeeResult) oeeResult 안에는 각 상태별 시간과 count 값이 json 구조로 저장되어 있음

},

      

_oeeType : {

day:{

rate:24*60*60, 

txt: function(){

this.options.hourTxt;

return 24 + this.options.hourTxt;

},

getPointTimeTxt:function(lastPoint, width){ // 속도 때문에 width 를 매번 계산하지 않는다 차이가 좀남

var rate =this._cunrrentType.rate/60/width;

return this.DateUtil.DateType.Min.execute(this._convertPx(lastPoint*rate + this.oeeTimeTxt[0].data("timepixel")));

}

} , 

hour:{

rate:60*60, 

txt: function(){

this.options.hourTxt;

return 1 + this.options.hourTxt;

},

getPointTimeTxt:function(lastPoint, width){

return this._oeeType.day.getPointTimeTxt.call(this, lastPoint, width);

}

} , 

min:{

rate:12*60, 

txt: function(){

this.options.hourTxt;

return 12 + this.options.minTxt;

},

getPointTimeTxt:function(lastPoint, width){

var rate =this._cunrrentType.rate/width;

var x = lastPoint*rate + this.oeeTimeTxt[0].data("timepixel")*60;

return this.DateUtil.DateType.Second.execute(x >= 60*60*24 ? x%(60*60*24) : x, true);

}

},

_cunrrentType : null,

_lastData : [],

// the constructor

_create: function() {

this._setCurrentType("day");

this.oeeBar = $("<div>",{"class":"imc-oee-bar"});

this.oeeBar.css({height : this.element.height()-30, width:this.element.width()-this.options.margin*2, "marginLeft":this.options.margin});

this.oeeTimeTick = $('<svg  xmlns="http://www.w3.org/2000/svg" height=50 width='+this.element.width()+'>');

this.tooltip = $("<div>",{"class":"imc-oee-tooltip " + this.options.toolTipPosition}).append(this._tooltipHtml())

this.oeeTimeTxt = [];

this.element

 .addClass( "imc-oee" )

 .disableSelection().append(this.oeeBar).append(this.oeeTimeTick).append(this.tooltip);

this._drawTimeTick();

this.tooltipManager.initialize.call(this);

},

_refresh: function() {

    this._drawbar(this._lastData, this.oeeTimeTxt[0].data("timepixel"));

this.tooltip.empty().append(this._tooltipHtml());

this.tooltipManager.initialize.call(this);

},

 

_destroy: function() {

this.oeeBar.remove();

this.oeeTimeTick.remove();

this.tooltip.remove();

this.element

 .removeClass( "imc-oee-bar" )

 .enableSelection()

 .css( "background-color", "transparent" ).empty();

},

_setOptions: function() {

this._superApply( arguments );

this._refresh();

},

_setOption: function( key, value ) {

if("dutyTime" == key && !/[0-9]{2}.[0-9]{2}/.test(value)){

return;

if(/oee|statusColor/.test(key)){

value = $.extend({}, this.options[key], value);           

}

this._super( key, value );

},

_drawTimeTick : function(){

var w = this.element.width();

var h = this.element.height();

var style = "stroke:"+this.options.tickColor+";stroke-width:"+this.options.tickWidth

this.oeeTimeTick.append(this._makeSVG('line', {

x1 : this.options.margin ,

x2 : w-this.options.margin,

y1 : 0 ,

y2 : 0 ,

style : style

}));

for(var i = 0 ; i <= 24 ; i++){

var x = this.options.margin + (w-this.options.margin*2)/24*i;

this.oeeTimeTick.append(this._makeSVG('line', {

x1 : x ,

x2 : x ,

y1 : 0 ,

y2 : 10 ,

style : style

}));

if( i % 6 == 0 ) {

this._drawTimeTxt(x, i / 6, this._createTime(x));

}

}

this._updateTimeTxt(0, this.oeeTimeTxt[0].data("orgpixel"));

},

_drawTimeTxt : function(x, index, $time){

var times = this.options.dutyTime.split(":");

var hour = parseInt(times[0]) + index * 6;

hour = hour > 24 ? hour % 24 : hour;

$time.data("orgpixel", parseInt(times[0])* 60 + parseInt(times[1]));

$time.data("timepixel", parseInt(times[0])* 60 + parseInt(times[1]));

this.element.append($time);

},

_createTime : function(x){

this.oeeTimeTxt[this.oeeTimeTxt.length] = $("<time>",{"class":"imc-oee-timetxt",text:"00:00",

style :["left:", (x-18), "px;top:", ( this.element.height()-10), "px;"].join("")});

return this.oeeTimeTxt[this.oeeTimeTxt.length-1];

},

_updateTimeTxt : function(x, startTime){

var rate = this._cunrrentType.rate/60, DateUtil = this.DateUtil, _convertPx = this._convertPx;

startTime += startTime < this._getSecond(this.options.dutyTime)/60 ? 1440 : 0;

x = parseInt(x/rate) * rate + (startTime ? startTime : 0), rate /= 4;

$.each(this.oeeTimeTxt, function( index, $this ) {

var px = x + index * rate;

$this.text(DateUtil.getString(DateUtil.DateType.Min, _convertPx(px), false));

$this.data("timepixel", px)

});

},

_findStartPoint : function(html, data, startMin, w, status, oeeResult){

var startSec = startMin*60, seconds = 0, dutySec = this._getSecond(this.options.dutyTime), pixel = 0;

startSec += (startSec < dutySec ?  60*60*24 : 0)

for (var i = 0, len = data.length; i < len; i++) {

seconds = this._getSecond(data[i][this.options.oee.startDateTime])

seconds = startSec > seconds && dutySec > seconds ? (seconds += 60*60*24) : seconds;

if(seconds > startSec){

pixel = (seconds- startSec)/this._cunrrentType.rate * w;

if(i > 0){

status = data[i-1][status];

this._addOeeResult(oeeResult[status], seconds- startSec);

}else{

status = "defaultColor";

}

return this._checkOverFirstPixel(html, status, pixel, w, i)

}else if(i == len -1 && seconds < startSec && startSec < seconds + parseInt(data[i][this.options.oee.second])){

pixel = (seconds + parseInt(data[i][this.options.oee.second])-startSec)/this._cunrrentType.rate * w;

return this._checkOverFirstPixel(html, data[i][status], pixel, w, -1)

}

}

return {index : -1, pixel : pixel};

},

_checkOverFirstPixel : function(html, status, pixel, w, i){

if(pixel > w){ // pixel 이 넓이 보다 큰 경우

i = -1, pixel = w;

}

this._addbaritem(html, status, pixel, w);

return {index : i, pixel : pixel}

},

_drawbar : function(data, startMin) {

var html = [], w = this.oeeBar.width(), oeeResult = this._getOeeTemplete(), totalPixel = 0, pixel, leakPixel=0,

status = this.options.oee.status, second = this.options.oee.second, startDateTime = this.options.oee.startDateTime;


for (var i = 0, len = data.length; i < len; i++) {

if(i == 0 && (this.oeeTimeTxt[0].data("orgpixel") != startMin || this.oeeTimeTxt[0].data("orgpixel") != this._getSecond(data[i][startDateTime])/60)){

var first = this._findStartPoint(html, data, startMin, w, status, oeeResult);

totalPixel =+ first.pixel;

i = first.index;

if(first.index < 0) break;

}

pixel = (data[i][second]/this._cunrrentType.rate) * w;

if(totalPixel + pixel > w){

pixel = w - totalPixel;

this._addOeeResult(oeeResult[data[i][status]], parseInt(pixel*this._cunrrentType.rate/w));

this._addbaritem(html, data[i][status], pixel, w); 

break;

}

leakPixel += pixel;

pixel = leakPixel - leakPixel%1;

leakPixel = leakPixel - pixel;

totalPixel += pixel;

if(len - 1 == i && leakPixel > 0){ // 잃어버린 1px 을 찾아서

pixel += 1;

}

this._addOeeResult(oeeResult[data[i][status]], data[i][second]);

this._addbaritem(html, data[i][status], pixel, w); 

}

this._bindEvent(this.oeeBar.empty().append(html.join('')).children(":not(.defaultColor)"));

if(this._cunrrentType == this._oeeType.day){ // day 는 굳이 다시 그릴필요 없음

this._trigger("onDrawBar", null , [oeeResult]);

}

},

_bindEvent: function(bar){

bar.on({mousemove: $.proxy(this.tooltipManager.calculatePoint, this), 

mouseleave: $.proxy(this.tooltipManager.hideToolTip, this), 

click : $.proxy(this.tooltipManager.clickPoint, this),

dblclick : $.proxy(this.tooltipManager.nextProgress, this)

}); // 이벤트는 우선 그냥 다 tooltip 에서 처리하자

},

_addbaritem : function(htmlarray, status, pixel, width) {

if(pixel > 0){

htmlarray.push('<span class="', status,  '" style="width:', pixel, 'px;background-color:',this.options.statusColor[status] ,'"></span>');

}

},

_makeSVG :function(tag, attrs) {

        var el= document.createElementNS('http://www.w3.org/2000/svg', tag);

        for (var k in attrs)

            el.setAttribute(k, attrs[k]);

        return el;

    },

_tooltipHtml : function(){

return ['<time>00:00</time>','<button type="button" data-value="day" class="on"><span>',this._oeeType.day.txt.call(this),'</span></button>'

            ,'<button type="button" data-value="hour"><span>',this._oeeType.hour.txt.call(this),'</span></button>'

            ,'<button type="button" data-value="min"><span>',this._oeeType.min.txt.call(this),'</span></button>', '<div class="arrow">'].join("");

},

_addOeeResult : function(oeeResult, sec){

if(sec > 0){

oeeResult.sec += parseInt(sec);

oeeResult.cnt ++;

}

},

_getOeeTemplete : function(){

var result = {}

for(var key in this.options.statusColor){

result[key] = { sec : 0 , cnt : 0 };

}

return result;

},

_setCurrentType : function(t){

if(this._oeeType[t]){

this._cunrrentType = this._oeeType[t];

}

},

_pad : function(value, length) {

value = String(value);

length = parseInt(length,10) || 2;

while (value.length < length)  { value = '0' + value; }

return value;

},

// 24시간 기준 pixel 변환

_convertPx : function(val){

val = (val >= 1440) ? val%1440 : val;

val = (val < 0) ? 1440 + val%1440 : val;

return val;

},

DateUtil : (function(){

var sep = ':';

var DateType = {

Min : { execute :

function(min, useSec){

       var hh = parseInt(min / 60);

min %= 60;

   return [pad(hh,2),sep ,pad(parseInt(min),2) ,(useSec ? (sep+"00") : "")].join("");

}

},

Second : { execute :

function(sec, useSec){

       var hh = parseInt(sec / 3600);

sec %= 3600;

   var mm = parseInt(sec / 60), ss = parseInt(sec % 60);

   return [pad(hh,2), pad(mm,2), useSec ? pad(ss,2) : ""].join(sep);

}

},

Hour :{ execute :

function(hour, useSec){

   return [pad(parseInt(hour),2), "00", useSec ? "00" : ""].join(sep);

}

},

}

,getString = function(fn, val, useSec){

return fn.execute.call(this, val, useSec=== undefined ? true : useSec);

}

,pad = function(value, length) {

value = String(value);

length = parseInt(length,10) || 2;

while (value.length < length)  { value = '0' + value; }

return value;

}

return{

DateType : DateType

,getString : getString

}

})(),

    _getdate : function(datestring) {

var extracted = datestring.match(/([0-9]{4}).([0-9]{2}).([0-9]{2}) ([0-9]{2}).([0-9]{2}).([0-9]{2})/);

return extracted && extracted.length > 6 ? new Date(extracted[1], parseInt(extracted[2])-1, extracted[3], extracted[4], extracted[5], extracted[6]) : new Date();

},

_getSecond : function(datestring) { //XX:XX , XX:XX:XX 둘다 처리 굳이 정규식 필요없음, 횟수가 많을 경우 정규식이 더느림

var extracted = datestring.split(/[-: ]/);

var len = extracted.length;

return extracted && extracted.length > 1 ? (extracted.length % 3 == 0 ? 

parseInt(extracted[len-3])*60*60 + parseInt(extracted[len-2])*60 + parseInt(extracted[len-1])

: parseInt(extracted[len-2])*60*60 + parseInt(extracted[len-1])*60 ) : 0;

},

_getTxt : function(lastPoint, width){

return this._cunrrentType.getPointTimeTxt.call(this, lastPoint, width);

},

_update : function(startMin){

this._updateTimeTxt(0, startMin);

this._drawbar(this._lastData, startMin);

},

// type : "min", "hour", "day"

setData : function(data, t, startDateTime){

    this._lastData = data;

this.setStartDateTime(t, startDateTime);

    },

    setStartDateTime : function(t, startDateTime){

    var startMin = t == "day" ? this.oeeTimeTxt[0].data("orgpixel") :

    (startDateTime !== undefined ? this._getSecond(startDateTime)/60 : this.oeeTimeTxt[0].data("timepixel"));

this._setCurrentType(t);

    this._updateTimeTxt(0, startMin);

    this._drawbar(this._lastData, startMin);

    },

    clear : function(){

    this.setData([], "day", this.options.dutyTime);

    },

    next : function(){

    if( this._getSecond(this.options.dutyTime)/60 +1440 <= this.oeeTimeTxt[0].data("timepixel") + this._cunrrentType.rate/60){

    if($.isFunction( this.options.onChangedDate)){

    this._trigger("onChangedDate", null , [+1]);

        this._updateTimeTxt(0, this.oeeTimeTxt[0].data("orgpixel"));

        console.log("trigger onChangedDate  +1 day")

    }else if(this._cunrrentType != this._oeeType.day){ // day 는 굳이 다시 그릴필요 없음

    this._update(this.oeeTimeTxt[0].data("orgpixel"));

    }

    }else{

    this._update(this.oeeTimeTxt[0].data("timepixel") + this._cunrrentType.rate/60);

    }

       

    },

    prev : function(){

    if(this._getSecond(this.options.dutyTime)/60 > this.oeeTimeTxt[0].data("timepixel") - this._cunrrentType.rate/60){

    if($.isFunction( this.options.onChangedDate)){

    this._trigger("onChangedDate", null , [-1]);

    this._updateTimeTxt(0, this.oeeTimeTxt[0].data("timepixel") - this._cunrrentType.rate/60);

    console.log("trigger onChangedDate  -1 day");

    }else if(this._cunrrentType != this._oeeType.day){ // day 는 굳이 다시 그릴필요 없음

    this._update(this.oeeTimeTxt[0].data("orgpixel") + 1440 - this._cunrrentType.rate/60);

    }

    }else{

    this._update(this.oeeTimeTxt[0].data("timepixel") - this._cunrrentType.rate/60);

    }

    },

    

    tooltipManager : (function(){

var displayed = false , hideToolTiptimer = [], lastPoint, width, pLeft, tWidth, tHWidth, width, aLeft, 

$parent, $tooltip, $time, $tabs, $arrow;

// $.proxy 이부분에서는 빼고 내부변수로 바꾸자 굳이 proxy 사용할 이유가 없음(오히려 비효율적)

var initialize = function(){

$parent = this, $tooltip =this.tooltip, $time = $tooltip.find('time'), $tabs = $tooltip.find('button'),$arrow = $tooltip.find('.arrow');

aLeft = $arrow.position().left, pLeft = $tooltip.parent().offset().left, tWidth = $tooltip.width(), tHWidth = tWidth/2, width =this.oeeBar.width();

$tooltip.on({mouseenter: cancelHideToolTip, mouseleave: $.proxy(hideToolTip, this)});

$tabs.click($.proxy(function(e){

var $this = $(e.currentTarget), index = $this.index()-1, t = $this.data("value"),x = 0, rate = this._cunrrentType.rate;

this._setCurrentType(t); 

if(t == 'day'){

            x = this.oeeTimeTxt[0].data("orgpixel");

            }else if(t == 'hour' && this._cunrrentType.rate > rate){

this._setCurrentType(t);

x = this.oeeTimeTxt[0].data("timepixel");

x = x - x % 60;

            }else{

            x = lastPoint * rate/60/width;

                rate = this._cunrrentType.rate/60;

                x = parseInt(x/rate) * rate +this.oeeTimeTxt[0].data("timepixel");

            }

this._trigger("onChangedViewType", null , [t]);

$tabs.removeClass('on').eq(index).addClass('on');

this._update(x);

}, this));

}

, calculatePoint = function(e) {

if(this.options.isLimitMoveTooltip){

_calculateLPoint(e, this.options.margin + this.options.margin); //덧셈 속도때문에

}else{

$tooltip.css({left: e.clientX - pLeft - tHWidth});

}

lastPoint = e.clientX - pLeft- this.options.margin;

$time[0].innerHTML = this._getTxt(lastPoint, width);

if (this.options.isShowTooltip && !displayed) {

this.tooltip.show();

displayed = true;

}

cancelHideToolTip();

this._trigger("onChangedTooltip", null , [lastPoint, $time[0].innerHTML, true]);

}

, _calculateLPoint = function(e, fMargin) { // 속도가 왜 Math 함수가 더느릴까...

var x = e.clientX - pLeft - tHWidth;

var limit = width- tWidth + fMargin;

if(x > 0){

if(x < limit){

$tooltip.css({left:x});

$arrow.css({left:"50%"});

}else{

$tooltip.css({left:limit});

$arrow.css({left: x-limit+tHWidth});

}

}else{

$tooltip.css({left:0});

$arrow.css({left: x + tHWidth});

}

}

, hideToolTip = function(event) {

event.preventDefault()

hideToolTiptimer[hideToolTiptimer.length] = setTimeout( $.proxy(hideToolTipAction, this), 100);

}


, cancelHideToolTip = function(event) {

for(var i = 0, len = hideToolTiptimer.length; i < len ; i++){

clearTimeout(hideToolTiptimer[i]);

}

hideToolTiptimer = [];

}


, hideToolTipAction = function() {

$tooltip.hide();

this._trigger("onChangedTooltip", null , [-1, '', false]);

displayed = false;

}

, nextProgress = function(e){

            lastPoint = e.clientX - pLeft- this.options.margin;

var $next = $tabs.filter(".on").next("button");

if($next.length > 0 ){

$next.trigger("click");

}else{

$tabs.first().trigger("click");

}

}

, clickPoint = function(){

this._trigger("onClickBarChart", null , [this._getTxt(lastPoint, width)]);

}

, clear = function(){

$tabs.removeClass("on").eq(0).addClass("on");

};

return {

calculatePoint : calculatePoint

, hideToolTip : hideToolTip

, cancelHideToolTip : cancelHideToolTip

, nextProgress : nextProgress

, clear : clear

, clickPoint : clickPoint

, initialize : initialize

}

})()

});

'IT > jquery' 카테고리의 다른 글

JSON 바인딩하여 HTML 만들기  (0) 2016.01.25
jQuery 플러그인 화면 도시여부 체크  (0) 2016.01.20
[제이쿼리(jQuery)] lesson 6  (0) 2014.12.16
[제이쿼리(jQuery)] lesson 5  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 4  (0) 2014.11.24

ajax 로 호출하여 리턴된 데이터를 처리할 때 화면 도시를 위해서 html 에 바인딩 하는 경우가 많다.

 

아래의 예시와 같은 경우

 

var callBackAjax = function(data){

var html = "<div>" + data.tVal +"</div>"

/// .... 중략

}

 

이는 js 소스에 대한 복잡도 증가 및 가독성을 떨어트리게 된다.

이를 극복하기 위해 jquery 의 tmpl 을 사용하는 경우도 있다.

 

필자가 제작한것은 tmpl 과 유사한 간단한 jquery 플러그인이다.

(function( $ ) {

    $.fn.generateHtml = function(data) {

    var html = $(this).html();

var array = html.match(/@{(\w+[.]?)+}/g);

if(array == null){

return html;

}

for(var i = 0 , len = array.length ; i < len ; i++){

html = html.replace(array[i], findValue(array[i], data));

}

return html;

    },

    findValue = function(key, data){

key = key.replace(/(@{|})/g, '');

return reclusive(key.split(".") , data);

},

reclusive  = function(keys, data){

var result = data[keys[0]];

if(result === undefined || result === null){

return '';

}

if(keys.length > 1){

return reclusive( keys.slice(1), result);

}

return result;

};

}(jQuery));

 

 

 

사용법 예시

 

 // 사용할 HTML 의 구조를 만들고 ID 를 부여한다.

 // @{데이터의 key} 로 사용할 데이터를 명시한다.

<script id="templateTag" type="text">
    <div>
         <div> @{tVal} <div>
         <div> @{pVal} <div>
         <div> @{oee.tVal} <div>
         <div> @{oee.pVal} <div>
    </div>
</script>

 

<script>

$(function(){
 var testData = {tVal : 100, oee : {tVal:"233", pVal : "555"}} // 예시 데이터
 // pVal 값이 없는 경우는 공백입력됨
console.log($("#templateTag").generateHtml(testData)); 

})
</script>

 

실행 결과

    <div>
         <div> 100 <div>
         <div>  <div>
         <div> 233 <div>
         <div> 555 <div>
    </div>

 

 

 

 

'IT > jquery' 카테고리의 다른 글

누석 시간 바 차트 컴포넌트  (0) 2016.07.25
jQuery 플러그인 화면 도시여부 체크  (0) 2016.01.20
[제이쿼리(jQuery)] lesson 6  (0) 2014.12.16
[제이쿼리(jQuery)] lesson 5  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 4  (0) 2014.11.24

selector 된 요소가 주어진 부모창(스크롤을 가진)에서 보이는지 안보이는지에 대한 여부를 체크하는

간단한 플러그인 이다.(해당 플로그인은 Y 축만 체크한다 필요하면 X축 계산만 추가하면 된다)



/**

 * 현재 해당 요소의 도시여부를 체크하는 function

 * @param parent 

 */

(function( $ ) {

    $.fn.visible = function(parent) {

var $parent = $(parent);

var bHeight = $parent.height();

var bTop = $parent.offset().top;

var top = $(this).offset().top;

if(top >= bTop && top < (bTop + bHeight)){

return true;

}

        return false;

    };

}(jQuery));


사용예시>

$("#Test").visible(".bottom");



스크롤이 되는 영역안에서 브라우져 상에 사용자에게 보여지는 영역안에 있지를 체크한다.(Y축만 고려함)

스크롤을 가진 부모에 대한 셀렉터를 파라미터를 받지말고, 부모중 스크롤을 가진 요소를 찾아서 처리해도 된다.


ps> x 축 추가는 간단한 응용이기 때문에 생략한다.

'IT > jquery' 카테고리의 다른 글

누석 시간 바 차트 컴포넌트  (0) 2016.07.25
JSON 바인딩하여 HTML 만들기  (0) 2016.01.25
[제이쿼리(jQuery)] lesson 6  (0) 2014.12.16
[제이쿼리(jQuery)] lesson 5  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 4  (0) 2014.11.24




지난번에 이어서 효과를 계속보도록하자~.


제이쿼리의 효과는 show/hide 뿐만아니라 fade, slide 또는 스스로 정의하여 꾸미는 animate 가 있다.



아래 표에서 버튼 클릭으로 간단히 비교해보도록 하자.


 show/hide

 fade

 slide



syntax> fade

$(셀렉터).fadeIn(속도, 콜백함수)

$(셀렉터).fadeOut(속도콜백함수)

$(셀렉터).fadeToggle(속도콜백함수)

$(셀렉터).fadeTo(속도, 투명도, 콜백함수)


속도는 "slow", "fast", "normal" 의 문자열 또는 밀리세컨드(1/1000초) 단위의 숫자를 입력하면 된다.

slow 는 0.6초 , normal 은 0.4초, fast 는 0.2초 이다.

콜백함수는 효과가 완료된 후에 호출할 함수가 있다면 입력한다.

특이하게 fadeTo의 경우 최종 결과의 투명도를 설정할 수 있다.

 1 이 100% 보임, 0.3는 30프로 형태로 소숫점으로 지정이 된다.


예시>

$(셀렉터).fadeIn()        // 0.4 초 동안 fadeIn 한다.


$(셀렉터).fadeIn(2000)  // 2초 동안 fadeIn 한다.


$(셀렉터).fadeOut("fast") // 0.2 초 동안 fadeOut 한다.


$(셀렉터).fadeOut("slow", function(){

         alert("fadeIn 완료");

})  // 0.2초동안 fadeIn 하고 완료시에 콜백함수를 호출한다.


$(셀렉터).fadeToggle() // show/hide의 토글과 같은 효과로 fadeIn 과 fadeOut 을 전환시킨다. 설정된 값이 없기 때문에 시가은 0.4초이다.

$(셀렉터).fadeTo(500, 0.4)  //  0.5초 동안 투명도를 40%로 변경한다.



syntax> slide

$(셀렉터).slideDown(속도, 콜백함수) // slide효과로 보임 상태가 됨

$(셀렉터).slideUp(속도콜백함수)  // slide효과로 숨김 상태가 됨

$(셀렉터).slideToggle(속도콜백함수)



syntax> animate

$(셀렉터).animate({변경할속성목록}, 속도, 콜백함수);


변경할 속성 목록은  { 이름 : 값 , 이름 : 값 ..} 형태이다

예시


$(셀렉터).animate({ width : '300px' });  //특정 속성에 최종 변경값을 세팅

 

$(셀렉터).animate({ height : '300px', width : '+=100px', opacity : '0.5' }); 

// 다중값 변경 및 예시의width 와 같이 현재값에 값을 더하거나 뺄수 있음


$(셀렉터).animate({ height : 'show' });  // show, hide, toggle 을 설정할 수 있음


$(셀렉터).animate({ width : '300px' } , 1000 );  // width 300px 로 1초동안 변경

$(셀렉터).animate({ width : '300px' } , 'slow' , function(){

alert("animate 완료");

});  // width 300px 로 0.6초동안 변경 후 alert 창 도시


기타 특정 셀렉터에 여러개의 animate 를 연속으로 세팅한 경우 각 animate 은 순서대로 하나씩 완료후 다음 animate 가 작동함

var panel = $('.panel');

panel.animate({ width : '300px' });          //  (1)

panel.animate({ opacity: '0.5' }, 'slow');  // (2)

panel.animate({ width : '+=100px' });      //  (3)


이런 식으로 연속적으로 animate 를 사용한 경우   

 (1) 동작 -> (1)완료후 (2)동작 -> (2)완료후 (3)동작


이상~

'IT > jquery' 카테고리의 다른 글

JSON 바인딩하여 HTML 만들기  (0) 2016.01.25
jQuery 플러그인 화면 도시여부 체크  (0) 2016.01.20
[제이쿼리(jQuery)] lesson 5  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 4  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 3  (0) 2014.11.24

이번 장에서는 효과에 대해서 알아보자.


효과란 어떤 태그에 대해 상태의 변경을 화면상으로 보여주는 것들을 말한다.

대표적인 효과는 보임(show)과 숨김(hide)이 있다.


syntax> show/hide

$(셀렉터).show(속도, 콜백함수);

$(셀렉터).hide(속도, 콜백함수);


$(셀렉터).show();                            // 옳바른 구문

$(셀렉터).show(속도);                      // 옳바른 구문

$(셀렉터).show(속도, 콜백함수);        // 옳바른 구문

$(셀렉터).show(콜백함수);                // 잘못된 구문

위와 같이 파라미터를 원하는대로 사용할 수 있으나 앞의 파라미터를 제외하고 뒤에 파라미터를 사용할 수는 없다


속도는 1/1000초의 숫자 또는 'fast', 'slow' , 'normal' 의 문자열이 가능하다.


이렇게 제이쿼리는 매우 간단한 방법으로 해당 태그를 숨기고 보여줄 수가 있다.


* 소스 예시

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>jquery effect</title>

<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>


<script type="text/javascript">

    $(function(){

$("#clickBtn").click(function(){

        $(".divLabel").hide();

});

    });

</script>

</head>

<body>

<input type="button" id="clickBtn" value="버튼" />

<div class="divLabel">

라벨~

</div>

</body>

</html>


소스를 보다시피 매우 간단하다. 셀렉터를 선택 후 show() 또는 hide() 호출만으로 보이고 숨김을 할 수가 있다.


단 보임과 숨김은 보통 쌍으로 이루어진다.

hide 상태 -> 보임버튼 클릭 -> show 상태

show 상태 -> 숨김버튼 클릭 -> hide 상태

이런 식으로 말이다.


이런 기능을 위해 제이쿼리에서는 toggle 이라는 function 을 제공해 준다.

syntax> toggle

$(셀렉터).toggle();


위와 같이 toggle 호출 한번만으로 hide/show 의 상태 변경이 자동으로 이루어 진다.(toggle 의 경우 스위치형태로 function 을 호출하도록 사용할 수도 있다)


아래는 toggle 로 구현된 예시이다.


테스트 예시


버튼 클릭 =>


show/hide 에 대한 예시 화면




이상~

'IT > jquery' 카테고리의 다른 글

jQuery 플러그인 화면 도시여부 체크  (0) 2016.01.20
[제이쿼리(jQuery)] lesson 6  (0) 2014.12.16
[제이쿼리(jQuery)] lesson 4  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 3  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 2  (0) 2014.11.24

이번 장에서는 이벤트에 대해 조금더 상세히 다루도록 하겠다.


* 마우스 이벤트의 종류


마우스 이벤트 

설명 

 click

 마우스를 클릭했을 때 발생

 dblclick

 마우스를 더블 클릭했을 때 발생

 mouseenter

 마우스가 해당요소 안으로 진입했을 때 발생

 mouseleave

 마우스가 해당요소 밖으로 나갔을 때 발생

 mousedown

 마우스의 왼쪽키가 눌린 경우

 mouseup

 마우스의 눌렸던 왼쪽키가 풀린 경우

 hover

 mouseenter 와 mouseleave 이벤트의 묶음


syntax>

$(셀렉터).이벤트액션(실행할 function)


mouseenter 와 mouseleave 이벤트는 다음 그림과 같다.



해당 태그 안으로 진입할 경우 mouseenter 이벤트가 밖으로 나갈 경우는 mouserleave 이벤트가 발생한다. 이 두가지 동작을 하나로 합친 이벤트가 hover 이다



$("table").mouserenter(function(){

alert("테이블에 들어옴");

});

$("table").mouserleave(function(){

alert("테이블에서 나감");

});



hover 로 변경

syntax>

$(셀렉터).이벤트액션(마우스 enter 이벤트 function , 마우스 leave 이벤트 function)


$("table").hover(function(){

alert("테이블에 들어옴");

    },

    function(){

    alert("테이블에서 나감");

});



키보드 이벤트의 종류


키보드 이벤트 

설명 

 keypress

 키입력에 대한 이벤트, keydown,keyup 과 다른 것은 쉬프트, 탭 등의 키는 이벤트를 발생시키지 않는다. 또한 한글에 대해서 이벤트를 발생하지 않는다.

 keydown

 키가 눌렸을 때 이벤트

 keyup

 키의 눌림이 풀렸을 때 이벤트


폼 이벤트의 종류


폼 이벤트 

설명 

 submit

 서버의 전송을 위한 이벤트

 change

 내용이 변경되었을 때 이벤트

 focus

 해당 요소가 포커스되었을 때 발생

 focusin

 해당 요소가 포커스되었을 때 발생하지만 focus 와의 차이는 focus 이벤트보다 먼저 발생한다.( focusin은 focus에 진입되는 순간, focus 완료되는 순간 focus 이벤트)

 blur

 해당 요소의 포커스가 빠져나갔을 때 발생

 focusout

 해당 요소의 포커스가 빠져나갔을 때 발생하지만 blur 와의 차이는 blur 이벤트보다 먼저 발생한다.


document/window 이벤트의 종류


document/window 이벤트 

설명 

 load

 로딩이 완료되었을 때의 이벤트

 resize

 크기가 변경되었을 때의 이벤트

 scroll

 스크롤이 변경되었을 때의 이벤트

 unload

 종료시 발생하는 이벤트





아래에서 발생되는 간단한 발생이벤트 및 순서를 테스트해보도록 하자.
(그려진 큰박스/작은박에 마우스 이동 또는 클릭을 해보자. 또는 그 하단의 textbox 에 focusing 을 해보도록 하자)


이벤트 테스트

큰박스
작은박스
발생이벤트




* 이벤트 테스트에 바인딩한 이벤트

 태그

 이벤트

 큰박스/작은박스

  • mouseenter
  • mouseleave
  • click
  • dblclick

 텍스트박스

  • focus
  • blur
  • focusin
  • focusout
  • keydown
  • keypress
  • keyup


'IT > jquery' 카테고리의 다른 글

[제이쿼리(jQuery)] lesson 6  (0) 2014.12.16
[제이쿼리(jQuery)] lesson 5  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 3  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 2  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 1  (0) 2014.11.24

이번에는 셀렉터에 대해 알아보도록 하자.

셀렉터는 해당 요소를 선택하기 위한 선택자이다. 정규식처럼 약속된 구문에 의해 해당하는 요소를 선택하여 반환해 준다.


제이쿼리의 셀렉터는 멀티브라우저 오픈 소스 셀렉터 엔진인 시즐(Sizzle)을 사용하고 있다.

기본적으로 css 의 셀렉터를 생각하면 된다.


기본 흐름은 다음과 같다.




셀렉터의 검색엔진을 통해 해당 요소를 검색하고 jquery 구문의 action 이 실행된다. 검색된 요소가 없다면 aciton 이 실행되지 않는다. 


가장 많이 사용하는 기본 셀렉터는 다음과 같다.

  • 태그이름
  • # + id 이름
  • . + 클래스이름


셀렉터 예시


 예시

설명

 $("*")

 모든 요소

 $(this)

 객체 자신에 대한 요소

 $("span")

 해당 span 태그에 대한 요소

 $("#deviceID")

 해당 id 를 포함한 요소

 $("p,span")

 p 태그와 span 태그  요소

 $("p.title")

 해당하는 p 태그 중 해당 클래스를 포함한 요소

 $("ul li:first")

 첫번째 ul 태그의 첫번째 li 에 대한 요소

 $("ul li:first-child")

 모든 ui 태그의 첫번째 li 에 대한 요소

 $("[name]")

 속성 name 을 가진 모든 요소

 $("tr:even")

 tr 태그중 짝수번째 요소

 $("tr:odd")

 tr 태그중 홀수번째 요소

 $("tr:eq(5)")

 tr 태그중 5번째 요소

 $(":disabled")

 속성 tag 중 disabled 된 모든 요소



아래의 창에서 간단히 확인이 가능하다.

좌측의 셀렉터를 클릭하면 해당하는 태그들이 선택이 된다.


 테스트(해당문구클릭)

 확인창

  • $("*")
  • $("p")
  • $("p,span")
  • $(".title")
  • $("tr:even")
  • $("tr:odd")
  • $("tr:eq(2)")
  • $("p:last")
  • $(":text")

<span>span태그</span>

<p>p태그</p>

<p class="title">p태그</p>

<table>

<tr><td>0</td></tr>

<tr><td>1</td></tr>

<tr><td>2</td></tr>

<tr><td>3</td></tr>

</table>

  

<p> p태그 마지막 </p>


'IT > jquery' 카테고리의 다른 글

[제이쿼리(jQuery)] lesson 5  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 4  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 2  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 1  (0) 2014.11.24
JQuery의 when  (0) 2014.11.21

지난 강습에는 jquery 의 기본 설정 및 로딩 이벤트를 바인딩하는 법에 대해 간단히 다루었다.


이번에는 클릭이벤트를 다는 법~에 대해 간단히 다루어 보도록 하겠다.



jquery 기본 syntax>

$(셀렉터).action()


$(document).ready(function(){});


지난 시간 이 구문도 같은 원리이다. document 가 로드되어 dom 을 사용할수 있게 되었을때 function 안에 구문이 동작하라는 의미이다.


click event syntax>

$(셀렉터).click(실행될 function) 


위와 같은 방식으로 클릭 이벤트를 해당 객체에 바인딩할 수 있다.

단~ 지난번 내용인 로딩 이벤트 안 또는 다른 이벤트 실행 이후에 바인딩해야 한다.

이유는 스크립트는 컴파일이 미리 되어있지 않은 언어이기 때문에 순차적으로 실행한다.


로딩 이벤트에 처리 안했다면 다음과 같은 상황이 된다.



코드로는 다음과 같다.


방법 A.

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>jquery basic</title>

<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>

<script type="text/javascript">

        $("#clickBtn").click(function(){

               alert("버튼 클릭");

        });

</script>

</head>

<body>

        <input type="button" id="clickBtn" value="버튼" />

</body>

</html>


방법 B.

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>jquery basic</title>

<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>

</head>

<body>

        <input type="button" id="clickBtn" value="버튼" />

</body>

<script type="text/javascript">

        $("#clickBtn").click(function(){

               alert("버튼 클릭");

        });

</script>

</html>


방법 A 의 경우에는 script 동작 시점에 버튼을 찾지 못했기 때문에 바인딩할 요소가 없어서 이벤트가 바인딩 되지 않는다.

방법 B 의 경우는 button 객체 생성이후이기 때문에 바인딩이 된다.


이러한 차이가 없이 프로그래밍하기 위해서는 로딩완료 시점에 바인딩을 해주면 된다.


$(function(){

  $("#clickBtn").click(function(){

     alert("버튼 클릭");

});

});


여기서 또 하나~!

버튼을 선택하기 위해서 #clickBtn 을 사용하였는데 이를 셀렉터라고 한다.

우선 이번에는 간단히 이야기하자면

# 을 붙이면 id 를 가르킨다.

즉 clickBtn 이라는 id 를 가진 요소에 이벤트를 달았다고 생각하면 된다.


다음 장에서는 셀렉터에 대해 이야기 하도록 해보자.



'IT > jquery' 카테고리의 다른 글

[제이쿼리(jQuery)] lesson 5  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 4  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 3  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 1  (0) 2014.11.24
JQuery의 when  (0) 2014.11.21



제이쿼리(Jquery) 란?


제이쿼리(jquery)는 자바스크립트로 된 프레임웍으로 프로그래머의 브라우져별 자바스크립트의 api 차이를 고려할 필요없이 동일한 코드의 작성을 지원하며, 자바스크립트의 코딩을 단순화 하였다.


즉 간단히 제이쿼리는 자바스크립트를 편리하게 사용하게 해주는 라이브러리 정도로 생각하면 된다.




자 그럼 jquery를 사용하기 위해서는 어떻게 해야하는가?

 

1.Jquery 의 CDN 주소로 포함시킨다.


      CDN 은 Contents Delivery Network 의 약자. 간단히 외부서버에서 제공하는 jquery를 include 시킨다고 생각하면 된다.


자바스크립트 라이브러리들의 cdn 주소를 확인하는 사이트 : https://cdnjs.com/



jquery 홈페이지에서 cdn 주소확인 : http://jquery.com/download/

 


 

다음의 구문을 소스에 포함시킨다.


<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>


따라서 우리는 위와 같이 jquery를 포함 시킬 것이다.(cdn 으로 jquery 를 제공하는 곳은 많기 때문에 꼭 위와 동일하지 않아도 된다)



 

2. 해당 시스템 또는 로컬 서버에 해당파일은 포함시키고 해당 주소를 작성 화면에 포함 시킨다.


http://jquery.com/download/ 에서 해당 jquery 다운로드 받고 로컬서버등에 위치시킨다.

 

<script src="jquery 파일의 주소"></script>

 

 



자 간단하게 cdn으로 jquery를 실행해 보자.



소스는 다음과 같다.


<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>jquery basic</title>

<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>

<script type="text/javascript">

        jQuery(document).ready(function() {

               alert("hello jquery");

        })

</script>

</head>

<body>

</body>

</html>


hello jquery 라는 alert 창이 떳다면 정상 작동한 것이다.



이것을 자바스크립트로 구현하면 다음과 같다.


<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>javascript</title>

<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>

<script type="text/javascript">

        function init(){

               alert("hello javascript");

        }

</script>

</head>

<body onload="init()">

</body>

</html>



둘 예시는 화면이 로드되는 시점에 alert의 내용을 도시하는 내용이다.


jquery 의 ready 이벤트는 다음과 같이 축약이 가능하다. 


방식 1.

jQuery(document).ready(function() {

        alert("hello jquery");

})


방식 2. jQuery 를 $ 로 축약( jQuery  = $  동일하게 사용이 가능하다)

(document).ready(function() {

        alert("hello jquery");

})


방식 3. ready 생략

(function() {

        alert("hello jquery");

})


3가지의 결과는 동일하게 나온다.


첫강 끝~

'IT > jquery' 카테고리의 다른 글

[제이쿼리(jQuery)] lesson 5  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 4  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 3  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 2  (0) 2014.11.24
JQuery의 when  (0) 2014.11.21
jquery 의 when 은 deferreds 에 대한 처리 이후 실행될 함수를 정의하여 사용한다.
deferreds 란 ?
처리가 바로 완료되지 않는 작업들로 생각하면 된다. 대표적인 ajax 가 이에 포함된다.

기본 사용법
ex>

$.when($.ajax("/when.jsp")).done(function(){

console.log("완료 후 실행");
})


ajax 가 처리된 이후 done 에서 구현거나 참조된 function 이 실행됨

두개의 작업이 모두 처리된 후 수행되기를 원할 경우에는
ex>
$.when( $.ajax("/one.jsp")$.ajax("/two.jsp")).done(function(){
console.log("one, two 처리 후 실행");
});
 
 
해당 deferreds  가 실패시에 처리가 필요할 경우에는
$.when($.ajax("when.jsp")).then(successCallbackFn, errorCallbackFn);
var successCallbackFn = function(){
console.log("성공 처리 후 실행");
};
var errorCallbackFn= function(){
console.log("성공 처리 후 실행");
};
이와 같이 사용할 수 있다


'IT > jquery' 카테고리의 다른 글

[제이쿼리(jQuery)] lesson 5  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 4  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 3  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 2  (0) 2014.11.24
[제이쿼리(jQuery)] lesson 1  (0) 2014.11.24

+ Recent posts