basic

jquery 플러그인 UX


(function($){//0. $변수를 쓰는 다른라이브러리와 충돌을 피하기 위해 즉시 호출 함수 표현을 사용해서 감싸준다
$.fn.uxWinpop = function(options){//1.플러그인 name
	var set = $.extend({//2. 옵션의 기본값 지정
		path: '#',
		windowName: 'winPop',
		windowOptions : 'width=600, height=500'
	}, options);//2.end
	return this.click(function(){//3.set의 변수를 사용해서 어플리케이션 동작
		var url	 = set.path, // '#'
			name = set.windowName, // 'windowPop'
			option = set.windowOptions; //'width=600, height=500'
		window.open(url, name, option);//4.실행
	});//3.end
};//1.end
}(jQuery));//0.end

$("button[data-fn-win='1']").uxWinpop();//default 실행
$("button[data-fn-win='2']").uxWinpop({//option 실행
	path: 'etc_icn.html', windowName: 'windowPop2', windowOptions : 'width=800, height=800'
});

새창열기

리터럴 방식 UX


var uxWinpop = {//1.플러그인 네임
	set: {//2. 옵션의 기본값 지정
		path: '#',
		windowName: 'winPop',
		windowOptions : 'width=600, height=500'	                				
	},//2.end
	open: function(opt){//3.set의 변수를 사용해서 어플리케이션 동작
	(opt == null || opt == "undefined")? opt = this.set : ""; //옵션 null일경우 default옵션
		var url = opt.path // '#'; 
		var name = opt.windowName // 'winPop';
		var option = opt.windowOptions //'width=600, height=500' 
		window.open(url, name, option);//4.실행
	}//3.end
}//1.end  
  
$("button[data-literal-Win='1']").click(function(){
	uxWinpop.open();//default 실행
});                    	
$("button[data-literal-Win='2']").click(function(){
	uxWinpop.open({//option 실행
		path: 'etc_icn.html', windowName: 'windowPop2', windowOptions : 'width=800, height=800'
	});
});

userAgent 체크

$(window).uxAgent();
userAgent 체크 항목: 아래 버튼을 클릭하세요

userAgent 기본
browser.os: mac, win, linux
browser: chrome, firefox, opera, safari, ie
browser.webkit: webkit
browser.ie8: ie8
browser.mobile: mobile, desktop
browser.ios: ios, android

userAgent 전체 (기본체크 + old 버전 체크)
support.transition: transition, notransition
support.transform: transform, notransform
support.backgroundsize: backgroundsize, nobackgroundsize
support.rgba: rgba, norgba
support.svgimage: svg, nosvg
support.pointerevents: pointerevents, nopointerevents
support.opacity: opacity, noopacity


/**********************
* JS Root
**********************/          
var ua = navigator.userAgent, //user agent 체크 기타 모듈에서 쓸 수 있도록 전역처리
	ie = ua.match(/(?:msie ([0-9]+)|rv:([0-9\.]+)\) like gecko)/i), //ie 버전 체크. (MSIE 7,7 ~10. ie11 : rv:11.0) like Gecko,,11.0)
	prefix = ['Webkit', 'Moz', 'O'], // 접두사 설정			
	transition = 'transition',
	transform = 'transform',
	requestanimationframe = 'requestAnimationFrame', //requestanimationframe : 스크립트 기반 애니메이션용 타이밍 컨트롤. (https://msdn.microsoft.com/ko-kr/library/windows/apps/hh920765.aspx)
	cancelanimationframe = 'CancelAnimationFrame',
	transforms = {
		translate3d: 'translate3d(0px, 0px, 0px)',
		translate: 'translate(0px, 0px)',
		scale3d: 'scale3d(1, 1, 1)',
		scale: 'scale(1, 1)'
	},
	browser = $.browser, //1.8.x 버전까지 사용. (이후 버전은 jquery-migrate.min.js 추가 후 사용가능)
	isTouch = ('ontouchstart' in window),//터치 여부
	isMobile = ('orientation' in window) || isTouch  === true,//모바일여부	
	support = $.support,
	version, i, div;
	
/**********************
* $.fn.uxAgent
**********************/
$.fn.uxAgent = function(opt){//#################### 1.uxAgent ####################  

	var div = document.createElement('div');	

	if (!browser) {// $.browser 지원이 안되면 객체로 생성?
		$.browser = browser = {};
	}
	
	// test 값 true,false 값 적용
	browser.local = !(/^http:\/\//).test(location.href);
	browser.firefox = (/firefox/i).test(ua);
	browser.webkit = (/applewebkit/i).test(ua);
	browser.chrome = (/chrome/i).test(ua);
	browser.opera = (/opera/i).test(ua);
	browser.ios = (/ip(ad|hone|od)/i).test(ua);
	browser.android = (/android/i).test(ua);
	browser.safari = browser.webkit && !browser.chrome;
	
	// 터치가능여부 체크
	support.touch = browser.ios || browser.android || (document.ontouchstart !== undefined && document.ontouchstart !== null);
	browser.mobile = support.touch && ( browser.ios || browser.android );
	
	// browser flase 값 삭제
	for (i in browser) {
		if (!browser[i]) {
			delete browser[i];
		}
	}
	
	// os check
	browser.os = (navigator.appVersion).match(/(mac|win|linux)/i);
	browser.os = (browser.os)? browser.os[1].toLowerCase() : '';
	
	// ios, android version check
	if (browser.ios || browser.android) {
		version = ua.match(/applewebkit\/([0-9.]+)/i);
		if (version && version.length > 1) {
			browser.webkitversion = version[1];
		}
		if (browser.ios) {
			version = ua.match(/version\/([0-9.]+)/i);
			if (version && version.length > 1) {
				browser.ios = version[1];
			}
		}else if (browser.android) {
			version = ua.match(/android ([0-9.]+)/i);
			if (version && version.length > 1) {
				browser.android = parseInt(version[1].replace(/\./g, ''));
			}
		}
	}
	
	// ie 추가
	support.svgimage = true;
	support.pointerevents = true;
	
	// ie version check 및 svgimage, poiterevents 재설정
	if (ie){
		browser.ie = ie = parseInt(ie[1] || ie[2]);
		if (9 > ie) {
			browser.oldie = true;
		} else if (9 == ie){
			prefix.push('ms');
		}
		if (11 > ie){
			support.pointerevents = false;
		}
		if (9 > ie){
			support.svgimage = false;
		}
	}
	
	// window.history.pushState(data, title [, url ] ) https://www.w3.org/TR/2011/WD-html5-20110113/history.html#dom-history-pushstate
	support.pushstate = !!history.pushState;
	support.mediaquery = typeof(window.matchMedia) == 'function' || !browser.oldie;
	
	// placeholder 지원여부
	var ip_test2 = document.createElement('input'),
		ie_ph = ('placeholder' in ip_test2);
	
	// media.canPlayType(type) 재생여부 판단하여 불가능:'', 가능:maybe or probably 반환. ie8은 undefinded
	support.video = document.createElement('video').canPlayType !== undefined;
	
	/*
	$.fn.decideClass = function(classname, condition) {
		return this[condition ? 'addClass' : 'removeClass'](classname);
	}*/
	
	support.awse = {
		// ie8
		isPoorBrowser : $.browser.ie && 9 > $.browser.ie,
		swipeAble : !!(!!$.browser.mobile || window.PointerEvent || window.MSPointerEvent),
		// mobile:flase, pc(ie9이하)제외: transition
		parallaxAble : !($.browser.ie && 9 > $.browser.ie) && !$.browser.mobile && $.support.transition,
		// 초기화
		initialized : false	    
	}// console.log(support.awse.swipeAble)
	
	$(document.documentElement)
		.addClass(browser.os)
		.addClass(browser.chrome ? 'chrome' : browser.firefox ? 'firefox' : browser.opera ? 'opera' : browser.safari ? 'safari' : browser.ie ? 'ie ie'+browser.ie : '')
		.addClass(browser.webkit ? 'webkit' : '')
		.addClass(browser.ie && 8 > browser.ie ? 'ie8' : '')
		.addClass(browser.mobile ? 'mobile' : 'desktop')
		.addClass(browser.ios ? 'ios' : browser.android ? 'android' : '');
	
	if(opt=="full"){
		
		// css3 check
		support.backgroundsize = 'backgroundSize' in div.style;
		if ( support.backgroundsize ) {
			div.style.backgroundSize = 'cover';
			support.backgroundsize = div.style.backgroundSize == 'cover';
		}
	    try {
	        div.style.background = 'rgba(0, 0, 0, 0)';
	        support.rgba = div.style.background == 'rgba(0, 0, 0, 0)';
	    } catch(e) {
	        support.rgba = false;
	    }
	    
	    support.canvas = document.createElement('canvas');
	    support.canvas = support.canvas.getContext && support.canvas.getContext('2d');
	    
	    // transform check : 지원여부에 따라 접두사 추가
	    if (div.style[transform] != undefined) {
	    	support.transform = transform;
	    } else {
	    	transform = 'Transform';
	    	for (i = 0; i < 4; i++) {
	    		if (div.style[prefix[i]+transform] !== undefined) {
	    			support.transform = prefix[i]+transform;
	    			break;
	    		}
	    	}
	    }

	    if (support.transform) {
	    	transform = support.transform;
	    	for (i in transforms) {
	    		div.style[transform] = '';
	    		div.style[transform] = transforms[i];
	    		support[i] = div.style[transform];
	    	}
	        /* if (browser.ie && 10 > browser.ie) { }
	        if ( browser.android && 430 > browser.android ) { }*/
	    }

	    // transition check : 지원여부에 따라 접두사 추가
	    if ( div.style[transition] != undefined ) {
	    	support.transition = transition;
	    } else {
	    	transition = 'Transition';
	    	for (i = 0; i < 4; i++) {
	    		if (div.style[prefix[i]+transition] !== undefined) {
	    			support.transition = prefix[i]+transition;
	    			break;
	    		}
	    	}
	    }
	    
	    // requestanimationframe check : 지원여부에 따라 접두사 추가
	    if (window[requestanimationframe]) {
	    	support.requestanimationframe = true;
	    } else {
	    	requestanimationframe = 'RequestAnimationFrame';
	    	for (i = 0; i < 4; i++) {
	    		if (window[prefix[i]+requestanimationframe] !== undefined) {
	    			window.requestAnimationFrame = window[prefix[i]+requestanimationframe];
	    			window.cancelAnimationFrame = window[prefix[i]+cancelanimationframe];
	    			support.requestanimationframe = true;
	    			break;
	    		}
	        }
	    }
	    
	    // requestanimationframe 지원안하는 브라우저를 위한 function 생성
	    if (!support.requestanimationframe) {
	    	window.requestAnimationFrame = (function() {
	    		var lasttime = 0;
	    		return function(callback) {
	    			var currenttime = gettime(); // gettime() : 시간 값을 밀리초 단위
	    			var timetocall = Math.max(0, 16-(currenttime-lasttime));
	    			lasttime = currenttime+timetocall;
	    			return setTimeout(function() { callback(currenttime+timetocall); }, timetocall);
	    		}
	    	})();
	    	window.cancelAnimationFrame = function(id) {
	    		clearTimeout(id);
	    	}
	    }
	    
	    div = null;
	    
	    $(document.documentElement)
	    	.addClass(support.transition ? 'transition' : 'notransition')
	    	.addClass(support.transform ? 'transform' : 'notransform')
	    	.addClass(support.backgroundsize ? 'backgroundsize' : 'nobackgroundsize')
	    	.addClass(support.rgba ? 'rgba' : 'norgba')
	    	.addClass(support.svgimage ? 'svg' : 'nosvg')
	    	.addClass(support.pointerevents ? 'pointerevents' : 'nopointerevents')
	    	.addClass(support.opacity ? 'opacity' : 'noopacity');
	}
	
	if (!window.console) {
		window.console = {};
		window.scard.log.debug = window.console.table = window.console.error = window.console.clear = function() {};
	}
	if (opt=="full") {
		console.log("Agent 체크: uxAgent('full');");
	}else{
		console.log("Agent 체크: uxAgent();");
	}

};//####################// 1.uxAgent ####################

모바일 체크

//uxAgent 모듈 사용시 if(isMobile){ console.log('모바일'); } //uxAgent 모듈 없을때 if(navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/Windows Phone/i) ){ console.log('모바일'); }
모바일 체크: true / false

유니크 ID 생성

$('셀렉터').uxIdMake('추가할아이디명');

/**********************
* JS Root
**********************/          
var uniqueId = (function() {//1. unique 아이디 이벤트
	var id = 0;
	return function() {
		return id++;
	}
})();
	
/**********************
* $.fn.uxIdMake
**********************/
$.fn.uxIdMake = function(opt){
	var name = opt;
	for (i = 0; i < this.length; i++) {
		var inputId = name + uniqueId(); // 2. 임의 string으로 아이디 조합
		this.eq(i).attr('id', inputId);		 // 3. attr으로 접근해 아이디 생성
  	}
  	console.log("유니크 ID 생성: ");                		
	return this;
};