현재 날짜와 시간을 기준으로 특정한 날짜와 시간을 입력하여 함수를 실행하는 스크립트

 

 

function timerFunc(func, dateTime){
	//ex) timerFunc(function(){console.log('test');},'20210108144740');
    //시간은 24시간을 기준으로 입력하여야 합니다.
    var year = Number(dateTime.substring(0,4));
    var month = Number(dateTime.substring(4,6));
    var day = Number(dateTime.substring(6,8));
    var time = Number(dateTime.substring(8,10));
    var minute = Number(dateTime.substring(10,12));
    var second = Number(dateTime.substring(12,14));
     
    var oprDate = new Date(year, month-1, day, time, minute, second); //동작을 원하는 시간의 Date 객체를 생성합니다.
    var nowDate = new Date();                                         //현재 날짜와 시간을 확인
     
    var timer = oprDate.getTime() - nowDate.getTime(); //동작시간의 밀리세컨과 현재시간의 밀리세컨의 차이를 계산합니다.
    if(timer < 0){ //타이머가 0보다 작으면 함수를 종료합니다.
       return;
    }else{
       setTimeout(func, timer);
    }
}

 

Ajax 비동기 통신을 통해서 목록 데이터를 테이블 태그와 페이징 형식으로 표현하기 위해 플러그인 방식 구현

 

//사용법 예시
url = '/getPagingList.do';
option = {
		widthArray : [20,70,10],
		headerArray : ['순서','제목','날짜'],
		tdTemplte : [
						'<td>@{no}</td>',
						'<td>@{title}</td>',
						'<td>@{date}</td>',
					]
};
urlParams = {
	"pageSize":'10', 
	"pageNo":'1',    
	//나머지 조건값
};

$('#tableArea').tableMaker(option,url,urlParams, function ($this){
	//tr이벤트
	$this.find('tr').off().on('click',function(){
	});
});

1. URL : 비동기 통신을 위한 URL 정보

2. Option 

 - widthArray : 테이블의 넓이값을 %로 설정

 - headerArray : 테이블의 헤더명을 입력

 - tdTemplte

    + td의 클래스 및 화면에 표시될 내용을 설정

    + @{}는 형식 유지 필요

    + @{}안에 설정하는 값은 DB 컬럼값과 같은 명을 사용해야 함.

3. urlParams 

 - pageSize : 목록에 보여질 페이지 사이즈

 - pageNo : 페이지 번호

 

비동기 통신 결과값 예시

data.paging : {
    totalCnt : 3,
    pageNo : 1,
    pageSize : 10
}
data.result : [
    {no : 1, title : 'title1', date : '2020-01-01'},
    {no : 2, title : 'title2', date : '2020-01-01'},
    {no : 3, title : 'title3', date : '2020-01-01'},
]

*만약 결과를 하나의 Object로 작업을 해야 한다면, tableMaker에서 data.paging으로 되어있는 코드를 변경하여 사용

 

 

(function( $ ) {
	$.fn.tableMaker = function(option, url, urlParams, callBack) {
		
		var $this = $(this);
		
		var _this = {
				
			//비동기 통신
			ajaxCall : function(url, urlParams, callBackFunc){
				$.ajax({
					url: url,
					cache: false,
					data: urlParams,
					method: 'POST',
					dataType: 'json',
					contentType: 'application/json;charset=UTF-8',
					success: function(data, textStatus, jqXHR) {
						if(typeof callBackFunc == 'function') {
							callBackFunc(data);
						}
					},
					error: function(jqXHR, textStatus, errorThrown) {
						console.log(textStatus);
					}
				});
				
			},
		
			
			init : function(urlParams){
				//테이블 초기화
				$this.html('');
				
				_this.ajaxCall(url, urlParams, function(data) {
					
					if ( data.paging.totalCnt == 0 ){
						//검색 결과 없음.
						var html = '데이터가 존재하지 않습니다.';
                        $this.html(html);
					}else{
						//테이블 표기
						$this.html(_this.drawTable(data));
					}
					
					//페이징 이벤트 처리
					$this.find('div.paging ul li a').off().on('click',function(){
						var pagingData = $(this).attr('paging-data');
						var pageNo = 1;
						if ( pagingData ){
							pageNo = pagingData;
						}else{
							pageNo = $(this).text();
						}
						urlParams.pageNo = pageNo;
						_this.init(urlParams);
					});
					callBack($this,data);
				});
			},
		
			//페이징 HTML 생성
			drawPaging : function(data){
				var pagingHtml ='';
				
				var currentStartPage = Math.ceil(data.paging.pageNo/10)*10-9;
				var currentEndPage = currentStartPage + 9;
				var totalPageCnt   = Math.ceil(data.paging.totalCnt/data.paging.pageSize);
				
				if(currentEndPage > totalPageCnt ){
					currentEndPage = totalPageCnt;
				}
				
				pagingHtml += '<div class="paging">';
				pagingHtml += '    <ul>';
				
				if ( data.paging.pageNo > 1 ){
					pagingHtml += '        <li class="go_first"><a paging-data="1" href="javascript:;"><i class="fa fa-angle-double-left"></i></a></li>';
				}
				if ( data.paging.pageNo > 1 ){
					pagingHtml += '        <li class="go_prev"><a paging-data="'+(parseInt(data.paging.pageNo)-1)+'" href="javascript:;"><i class="fa fa-angle-left"></i></a></li>';
				}
				
				for ( var i = currentStartPage ; i <= currentEndPage ; i++){
					pagingHtml += '        <li ' 
					pagingHtml +=	( i == data.paging.pageNo ) ? 'class="on">' : '>'
					pagingHtml +=	'<a href="javascript:;">'+i+'</a></li>';
				}
				
				if( data.paging.pageNo < totalPageCnt){
					pagingHtml += '        <li class="go_next"><a paging-data="'+(parseInt(data.paging.pageNo)+1)+'" href="javascript:;"><i class="fa fa-angle-right"></i></a></li>';
				}
				
				
				if( currentEndPage < totalPageCnt){
					pagingHtml += '        <li class="go_last"><a paging-data="'+totalPageCnt+'" href="javascript:;"><i class="fa fa-angle-double-right"></i></a></li>';
				}
				pagingHtml += '    </ul>';
				pagingHtml += '</div>';
				return pagingHtml;
			},
		
			//table HTML 생성
			drawTable : function(data){
				var templteHtml ='';

				templteHtml += '        <table>' 
				
//				templteHtml += '<caption>';
//				templteHtml += data.paging.caption; 
//				templteHtml += '</caption>';
				
				templteHtml += '            <colgroup>';
				option.widthArray.forEach(function(value,index){
					templteHtml += '                <col width="'+value+'%;">';
				});
				templteHtml += '            </colgroup>';
				templteHtml += '            <thead>';
				option.headerArray.forEach(function(value,index){
					templteHtml += '                <th>'+value+'</th>';
				});
				templteHtml += '            </thead>';
				templteHtml += '            <tbody>';
				
				data.result.forEach(function(rsValue,rsIndex){
					templteHtml += '                <tr>';
					option.tdTemplte.forEach(function(value,index){
						var check = false;
						do{
							var match = value.match(/\@\{(.+?)\}/);
							if ( match && match.length >= 2 ){
								var dat = '';
								if ( rsValue[match[1]] ){
									dat = rsValue[match[1]];
								}
								value = value.replace(/\@\{(.+?)\}/, dat);
								check = true;
							}else{
								check = false;
							}
						}while(check);
						
						templteHtml += value;
					});
					templteHtml += '                </tr>';
				});

				templteHtml += '            </tbody>';
				templteHtml += '        </table>';
				templteHtml += _this.drawPaging(data);
				return templteHtml;
			}
		};
		
		_this.init(urlParams);
		
	}
}( jQuery ));

 





언더 스코어를 사용하여, 데이터를 오름차순, 내림차순으로 정렬하는 기능


데이터는 JSON으로 구성되어있으며, Array로 구성된 상태이다. ( 아래 예시 참조 )

var data = [

  {

    name : 'AA'

    ,age : 20

  }

  ,{

    name : 'BB'

    ,age : 20

  }

];



위 데이터를 기준으로, name과 age는 Key값이 되며, age를 기준으로 오름차순 또는 내림차순 정렬을 진행



var ascData = _.chain(data)

.sortBy("age")

.value();


var descData = _.chain(data)

.sortBy("age")

.reverse()

.value();



언더스코어에서 sortBy() 함수는 오름차순 정렬만을 제공한다.


따라서, 내림차순 정렬을 하기 위해서는 sortBy()을 사용하여 오름차순 정렬을 진행하고,


reverse()함수를 통해서 데이터 내용을 반전시켜서, 


내림차순처럼 데이터를 만들어서 사용하면 된다.




자바 스크립트 에서는 3가지 변수 선언 방식을 사용하고 있다.


1. var : 어디든 접근 가능한 변수


var x = 1;         //x = 1

{

var x = 2; //x=2

}

x = 3;              //x=3



2. let : 블럭영역(scope)에서 사용되는 변수 


var x = 1;      //x=1

{

   let y = 2;    //y=2

}



3. const : 상수로 사용


const PI = 3.14;



3가지 변수 선언 방식 중, var의 경우 한번의 선언으로 전역에서 접근이 가능하다.


따라서, 다양한 Javascript 파일이 import 되는 경우, 변수명이 충돌나는 상황이 발생할 수도 있다.


따라서, let의 사용성을 증가시켜, 무분별한 var 선언을 줄이도록 해야한다.




JavaScript파일은 .js를 사용하여 따로 작성하게 되는데, js파일 안에 js를 포함하는 경우가 생기기도 한다.


document.write('<script type="text/javascript" src=""></script>');


window.onload=function(){

외부 JS에 포함된 함수 호출

}


위와 같이 document.write를 사용하여 외부 JS파일을 포함시킬수 있다.


또한, 외부 JS 파일의 함수를 호출할 경우 onload이벤트를 이용하여 JS파일이 모두 파싱이 완료된 상태에서


함수를 호출해야 오류가 발생하지 않는다.






IE ( chrome 포함 ) 에서는 event.KeyCode를 사용하여 사용자 입력을 자바스크립트로 제어할 수 있다.


하지만 FireFox( 이하 FF )에서는 event.KeyCode가 적용되지 않기 때문에 사용자 입력을 제어할 수 없게 된다.


이러한 상황이 발생하는 이유는 브라우저에 따라 이벤트가 다르게 인식된다.


IE는 window.event 객체가 인식하고, FF는 event 객체가 인식한다.


이러한 이유로, IE와 FF 모두 동작하는 자바스크립트를 작성하려면 이와 같은 경우도 고려를 해야될 것이다.


기본적인 사용법은 아래와 같이 사용 하면 될 것이다.


<script language="javascript" type="text/javascript">

function numCheck(e) {

var eventCode =(window.netscape)? e.which : e.keyCode;

if(( eventCode > 31) && ( eventCode < 45) || ( eventCode > 57)) {

if ( window.netscape ){

e.preventDefault();

}else{

e.returnValue = false;

}

}

}

</script>


        <input type="text" onKeyPress='numCheck(event)'>