<?xml version="1.0" encoding="utf-8" ?>
<rss xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:activity="http://activitystrea.ms/spec/1.0/" version="2.0">
<channel>
<title><![CDATA[Cginjs &amp;gt; C.m.A Lib &amp;gt; 자료실]]></title>
<link>http://cginjs.com/datatip</link>
<description><![CDATA[자료실]]></description>
<language>ko</language>
<pubDate>Tue, 14 Apr 2026 20:17:15 +0900</pubDate>
<lastBuildDate>Tue, 14 Apr 2026 20:17:15 +0900</lastBuildDate>
<generator>Cginjs</generator>
<copyright><![CDATA[Cginjs]]></copyright>
<image>
<url><![CDATA[http://cginjs.com/data/common/logo_img]]></url>
<title><![CDATA[Cginjs]]></title>
<link>http://cginjs.com</link>
</image>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>검색어 자동완성 - Autocomplete 한글 초성검색 적용하기(active 파란 배경색 커스텀)</title>
<link>http://cginjs.com/datatip/138</link>
<description><![CDATA[<p>필요한 CSS , JS 파일</p><p>hangul.min.js는 <a href="https://github.com/e-/Hangul.js" target="_blank" rel="nofollow noreferrer noopener"><b><font color="#0000ff">https://github.com/e-/Hangul.js</font></b></a> 에서 다운받을수 있습니다.</p><pre class="prettyprint lang-html linenums notranslate pre-word-wrap pretty-total-3">&lt;link rel="stylesheet" href="//code.jquery.com/ui/1.14.1/themes/base/jquery-ui.css"&gt;
&lt;script src="https://code.jquery.com/ui/1.14.1/jquery-ui.js"&gt;&lt;/script&gt;
&lt;script src="/hangul/hangul.min.js"&gt;&lt;/script&gt;</pre><pre class="prettyprint lang-css linenums notranslate pre-word-wrap pretty-total-10">&lt;style&gt;
.search-box{position: relative; background-color: #f5f5f5; color: #333; padding: 9px; margin: 0 0 10px; font-size: 13px; border: 1px solid #ccc; border-radius: 4px;}
.search-box .btn{border: 1px solid #ccc; margin: 0 3px;}

/* searchInput2 autocomplete active 배경색 */
ul.ui-autocomplete.ul-searchInput2{ max-height: 370px; overflow-y: auto; overflow-x: hidden;}
ul.ui-autocomplete.ul-searchInput2 li .ui-menu-item-wrapper{padding: 7px 1em 7px .4em;}
ul.ui-autocomplete.ul-searchInput2 li .ui-menu-item-wrapper::after {}
ul.ui-autocomplete.ul-searchInput2 li .ui-menu-item-wrapper.ui-state-active { margin: -1px; border: 1px solid #ccc !important; background: #f0f0f0 !important; font-weight: bold !important; color: #2b2b2b !important; }
&lt;/style&gt;</pre><pre class="prettyprint lang-html linenums notranslate pre-word-wrap pretty-total-15 pretty-total-12">&lt;div class="search-box"&gt;
    &lt;input type="text" id="searchInput" class="frm_input" placeholder="검색"/&gt; 
    &lt;button type="button" class="btn btn_search"&gt;검색&lt;/button&gt;
    autocomplete active 배경색 기본
	&lt;span class="span_searchInput" style="float: right; background:#007cf9; color: #fff; padding: 5px;border: 1px solid #ccc;"&gt;자동완성 배경색 &lt;font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="search-box"&gt;
    &lt;input type="text" id="searchInput2" class="frm_input" placeholder="검색"/&gt; 
    &lt;button type="button" class="btn btn_search"&gt;검색&lt;/button&gt;
    autocomplete active 배경색 커스텀
	&lt;span class="span_searchInput2" style="float: right; background: #f0f0f0 color: #2b2b2b; padding: 5px;border: 1px solid #ccc;"&gt;&lt;i class="fas fa-search" aria-hidden="true"&gt;&lt;/i&gt; 자동완성 배경색 &lt;font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/div&gt;</pre><pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-114 pretty-total-118 pretty-total-126 pretty-total-151">&lt;script&gt;
$(function(e) {
	// https://api.jqueryui.com/autocomplete/
	// https://github.com/e-/Hangul.js/
	var koreanRegex = /[ㄱ-ㅎㅏ-ㅣ가-힣]/;
	var autocomplete_search_source = ['html', 'jquery', 'json', '알고리즘', '소스', '소스2', '소스3', '소스4', '소스5', '소스수정', '소스수정2', '소스수정3', '소스수정4', '소스수정5', '태그', '태그수정', '태그추가']; // 자동완성할 데이터 소스. 배열, URL, 함수를 받음.
	//이부분이 초성 검색이 가능하게 만들어 주는 부분
	var autocomplete_search_source_chosung = $.map(autocomplete_search_source, function(item, idx) {
		chosung = '';
		//Hangul.d(item, true) 을 하게 되면 item이 분해가 되어서 
		//["ㄱ", "ㅣ", "ㅁ"],["ㅊ", "ㅣ"],[" "],["ㅂ", "ㅗ", "ㄲ"],["ㅇ", "ㅡ", "ㅁ"],["ㅂ", "ㅏ", "ㅂ"]
		//으로 나오는데 이중 0번째 인덱스만 가지고 오면 초성이다.
		if (koreanRegex.test(item)) { /* 한글이 포함되어 있는지 체크 */ 
			Hangul.d(item, true).forEach(function(strItem, index) {
				if(strItem[0] != " "){	//띄어 쓰기가 아니면
					chosung += strItem[0];//초성 추가
				}
			});
		}
		return {
			label: chosung ? chosung+' | '+item : item, // 실제 검색어랑 비교 대상 : 자동완성창에 표시되는 데이터
			value: item, // 선택했을때 input박스에 입력되는 데이터
			chosung: chosung, // chosung
			idx: idx, // 추가정보
		}
	});
	$('#searchInput').autocomplete({ // autocomplete 구현 시작부
		source : autocomplete_search_source_chosung, //source 는 자동완성의 대상
		select : function(event, ui) { // 항목을 선택했을 때 발생하는 이벤트
			//console.log('focus : ', event);
			//console.log('focus : ', ui.item)
			$(this).val(ui.item.value);
		},
		focus : function(event, ui) { // 포커스가 이동할 때 발생하는 이벤트
			//console.log('focus : ', event);
			//console.log('focus : ', ui.item);
			var sClass = event.currentTarget.className.replace(/ /gi, '.');
			var $ul = $('ul.'+sClass);
			var stot = $ul.find('li').length;
			$ul.attr({'data-stot' : stot});
			$.each($ul.find('li'), function(index, li_item){
				$(li_item).addClass('idx-'+index+' num-'+(index+1)).attr({'data-idx' : index, 'data-num': (index+1)});
			});
			$('.span_searchInput font').html(' : '+ui.item.value);
			return false;
		},
		minLength : 1, // 검색을 시작할 최소 글자수 (기본값: 1)
		autoFocus : true, // true로 설정 시 메뉴가 표시 될 때, 첫 번째 항목에 자동으로 초점이 맞춰짐
		classes : { // 위젯 요소에 추가 할 클래스를 지정( 일반적 'ui-autocomplete' : 'highlight')
			'ui-autocomplete' : 'ul-searchInput'
		},
		delay : 500, // 키보드 입력 후 검색까지의 지연 시간(ms) (기본값: 300).
		disable : false, // 해당 값 true 시, 자동완성 기능 꺼짐
		position : { my : 'right top', at : 'right bottom'}, // 제안 메뉴의 위치를 식별
		close : function(event) { // 자동완성 창 닫아질 때의 이벤트
			$('.span_searchInput font').html('');
			console.log('close : ', event);
		}
	}).autocomplete('instance')._renderItem = function(ul, item ) { /* jQuery UI Autocomplete 위젯의 기본 목록 렌더링 방식을 사용자 정의(Customize)할 때 사용하는 핵심 메서드 */
		return $('&lt;li&gt;')
		.append('&lt;div&gt;'+ item.value+'&lt;/div&gt;') /* HTML 커스터마이징 */
		.appendTo(ul); // 웹 상으로 보이는 건 정상적인 "소스" 인데 내부에서는 ㅅㅅ | 소스 에서 검색
	};

	var autocomplete_search_source2 = [
		{item_idx: 0, item_name: 'html', item_icon: 'html'}, 
		{item_idx: 1, item_name: 'jquery', item_icon: 'html'}, 
		{item_idx: 2, item_name: 'json', item_icon: 'html'}, 
		{item_idx: 3, item_name: '알고리즘', item_icon: 'html'}, 
		{item_idx: 4, item_name: '소스', item_icon: 'html'}, 
		{item_idx: 5, item_name: '소스2', item_icon: 'html'}, 
		{item_idx: 6, item_name: '소스3', item_icon: 'html'}, 
		{item_idx: 7, item_name: '소스4', item_icon: 'html'}, 
		{item_idx: 8, item_name: '소스5', item_icon: 'html'}, 
		{item_idx: 9, item_name: '소스수정', item_icon: 'html'}, 
		{item_idx: 10, item_name: '소스수정2', item_icon: 'html'}, 
		{item_idx: 11, item_name: '소스수정3', item_icon: 'html'}, 
		{item_idx: 12, item_name: '소스수정4', item_icon: 'html'}, 
		{item_idx: 13, item_name: '소스수정5', item_icon: 'html'}, 
		{item_idx: 14, item_name: '태그', item_icon: 'html'}, 
		{item_idx: 15, item_name: '태그수정', item_icon: 'html'},
		{item_idx: 16, item_name: '태그추가', item_icon: 'html'}
	]; // 자동완성할 데이터 소스

	//이부분이 초성 검색이 가능하게 만들어 주는 부분
	var autocomplete_search_source_chosung2 = $.map(autocomplete_search_source2, function(item, idx) {
		chosung = '';
		//Hangul.d(item.item_name, true) 을 하게 되면 item이 분해가 되어서 
		//["ㄱ", "ㅣ", "ㅁ"],["ㅊ", "ㅣ"],[" "],["ㅂ", "ㅗ", "ㄲ"],["ㅇ", "ㅡ", "ㅁ"],["ㅂ", "ㅏ", "ㅂ"]
		//으로 나오는데 이중 0번째 인덱스만 가지고 오면 초성이다.
		if (koreanRegex.test(item.item_name)) { /* 한글이 포함되어 있는지 체크 */ 
			Hangul.d(item.item_name, true).forEach(function(strItem, index) {
				if(strItem[0] != " "){ //띄어 쓰기가 아니면
					chosung += strItem[0];//초성 추가
				}
			});
		}
		return {
			label: chosung ? chosung+' | '+item.item_name : item.item_name, // 실제 검색어랑 비교 대상 : 자동완성창에 표시되는 데이터
			value: item.item_name, // 선택했을때 input박스에 입력되는 데이터
			chosung: chosung, // chosung
			idx: item.item_idx, // 추가정보
		}
	});

	$('#searchInput2').autocomplete({ // autocomplete 구현 시작부
		maxShowItems: 5,
		source : autocomplete_search_source_chosung2, //source 는 자동완성의 대상  
		select : function(event, ui) { // 항목을 선택했을 때 발생하는 이벤트
			//console.log('focus : ', event);
			//console.log('focus : ', ui.item)
			$(this).val(ui.item.value);
			$('ul li.idx-'+ui.item.idx).addClass('active');
		},
		focus : function(event, ui) { // 포커스가 이동할 때 발생하는 이벤트
			//console.log('focus : ', event);
			//console.log('focus : ', ui.item);
			var sClass = event.currentTarget.className.replace(/ /gi, '.');
			var $ul = $('ul.'+sClass);
			var stot = $ul.find('li').length;
			//var s_innerHeight = $ul.innerHeight(); // Window 기준 : 안쪽 창 영역의 높이와 너비
			var s_outerHeight = $ul.outerHeight(); // Window 기준 : 메뉴바, 툴바 모두 포함한 전체 창 영역의 높이와 너비
			var s_scrollTop = $ul.scrollTop();
			var s_overflow = ((s_outerHeight + s_scrollTop) &gt;= 370) ? 'auto' : 'hidden';
			$ul.attr({'data-stot' : stot, 'data-outerHeight': s_outerHeight}).css('overflow-y', s_overflow);
			$.each($ul.find('li'), function(index, li_item){
				$(li_item).addClass('idx-'+index+' num-'+(index+1)).attr({'data-idx' : index, 'data-num': (index+1)});
			});

			$('.span_searchInput2 font').html(' : '+ui.item.value);
			return false;
		},
		minLength : 1, // 검색을 시작할 최소 글자수 (기본값: 1)
		autoFocus : true, // true로 설정 시 메뉴가 표시 될 때, 첫 번째 항목에 자동으로 초점이 맞춰짐
		classes : { // 위젯 요소에 추가 할 클래스를 지정( 일반적 'ui-autocomplete' : 'highlight')
			'ui-autocomplete' : 'ul-searchInput2'
		},
		delay : 500, // 키보드 입력 후 검색까지의 지연 시간(ms) (기본값: 300).
		disable : false, // 해당 값 true 시, 자동완성 기능 꺼짐
		position : { my : 'right top', at : 'right bottom'}, // 제안 메뉴의 위치를 식별
		close : function(event) { // 자동완성 창 닫아질 때의 이벤트
			$('.span_searchInput2 font').html('');
			console.log('close : ', event);
		}
	}).autocomplete('instance')._renderItem = function(ul, item ) { /* jQuery UI Autocomplete 위젯의 기본 목록 렌더링 방식을 사용자 정의(Customize)할 때 사용하는 핵심 메서드 */
		return $('&lt;li&gt;')
		.append('&lt;div&gt;&lt;i class="fas fa-search" aria-hidden="true"&gt;&lt;/i&gt; '+ item.value+'&lt;/div&gt;') /* HTML 커스터마이징 */
		.appendTo(ul); // 웹 상으로 보이는 건 정상적인 "소스" 인데 내부에서는 ㅅㅅ | 소스 에서 검색
	};
});
&lt;/script&gt;</pre>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Mon, 16 Mar 2026 16:39:47 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>검색어 자동완성 - Autocomplete 적용하기(active 파란 배경색 커스텀)</title>
<link>http://cginjs.com/datatip/137</link>
<description><![CDATA[<p>필요한 CSS , JS 파일</p><pre class="prettyprint lang-html linenums notranslate pre-word-wrap pretty-total-2">&lt;link rel="stylesheet" href="//code.jquery.com/ui/1.14.1/themes/base/jquery-ui.css"&gt;
&lt;script src="https://code.jquery.com/ui/1.14.1/jquery-ui.js"&gt;&lt;/script&gt;</pre><pre class="prettyprint lang-css linenums notranslate pre-word-wrap pretty-total-9">&lt;style&gt;
.search-box{position: relative; background-color: #f5f5f5; color: #333; padding: 9px; margin: 0 0 10px; font-size: 13px; border: 1px solid #ccc; border-radius: 4px;}
.search-box .btn{border: 1px solid #ccc; margin: 0 3px;}

/* searchInput2 autocomplete active 배경색 */
ul.ui-autocomplete.ul-searchInput2 li .ui-menu-item-wrapper{padding: 7px 1em 7px .4em;}
ul.ui-autocomplete.ul-searchInput2 li .ui-menu-item-wrapper::after {}
ul.ui-autocomplete.ul-searchInput2 li .ui-menu-item-wrapper.ui-state-active { margin: -1px; border: 1px solid #ccc !important; background: #f0f0f0 !important; font-weight: bold !important; color: #2b2b2b !important; }
&lt;/style&gt;</pre><pre class="prettyprint lang-html linenums notranslate pre-word-wrap pretty-total-11 pretty-total-10">&lt;div class="search-box"&gt;
    &lt;input type="text" id="searchInput" class="frm_input" placeholder="검색"/&gt; 
    &lt;button type="button" class="btn btn_search"&gt;검색&lt;/button&gt;
    autocomplete active 배경색 기본
&lt;/div&gt;
&lt;div class="search-box"&gt;
    &lt;input type="text" id="searchInput2" class="frm_input" placeholder="검색"/&gt; 
    &lt;button type="button" class="btn btn_search"&gt;검색&lt;/button&gt;
    autocomplete active 배경색 커스텀
&lt;/div&gt;
</pre><pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-77 pretty-total-85">&lt;script&gt;
$(function(e) {
	// https://api.jqueryui.com/autocomplete/
	var autocomplete_search_source = ['html', 'jquery', 'json', '알고리즘', '소스', '소스수정', '태그', '태그수정', '태그추가']; // 자동완성할 데이터 소스. 배열, URL, 함수를 받음.
	$('#searchInput').autocomplete({ // autocomplete 구현 시작부
		source : autocomplete_search_source, //source 는 자동완성의 대상
		select : function(event, ui) { // 항목을 선택했을 때 발생하는 이벤트
			$(this).val(ui.item.value);
			console.log('select : ', ui.item);
		},
		focus : function(event, ui) { // 포커스가 이동할 때 발생하는 이벤트
			console.log('focus : ', ui.item);
			return false;
		},
		minLength : 1, // 검색을 시작할 최소 글자수 (기본값: 1)
		autoFocus : true, // true로 설정 시 메뉴가 표시 될 때, 첫 번째 항목에 자동으로 초점이 맞춰짐
		classes : { // 위젯 요소에 추가 할 클래스를 지정( 일반적 'ui-autocomplete' : 'highlight')
			'ui-autocomplete' : 'highlight'
		},
		delay : 500, // 키보드 입력 후 검색까지의 지연 시간(ms) (기본값: 300).
		disable : false, // 해당 값 true 시, 자동완성 기능 꺼짐
		position : { my : 'right top', at : 'right bottom'}, // 제안 메뉴의 위치를 식별
		close : function(event) { // 자동완성 창 닫아질 때의 이벤트
			console.log('close : ', event);
		}
	}).autocomplete('instance')._renderItem = function(ul, item ) { /* jQuery UI Autocomplete 위젯의 기본 목록 렌더링 방식을 사용자 정의(Customize)할 때 사용하는 핵심 메서드 */
		 return $('&lt;li&gt;')
		.append('&lt;div&gt;'+ item.value+'&lt;/div&gt;') /* HTML 커스터마이징 */
		.appendTo(ul); // 웹 상으로 보이는 건 정상적인 "소스" 인데 내부에서는 ㅅㅅ | 소스 에서 검색
	};

	var autocomplete_search_source2 = [
		{item_idx: 0, item_name: 'html'}, 
		{item_idx: 1, item_name: 'jquery'}, 
		{item_idx: 2, item_name: 'json'}, 
		{item_idx: 3, item_name: '알고리즘'}, 
		{item_idx: 4, item_name: '소스'}, 
		{item_idx: 5, item_name: '소스수정'}, 
		{item_idx: 6, item_name: '태그'}, 
		{item_idx: 7, item_name: '태그수정'},
		{item_idx: 8, item_name: '태그추가'}
	]; // 자동완성할 데이터 소스
	$('#searchInput2').autocomplete({ // autocomplete 구현 시작부
		source : function(request, response){
			var r = []; //자동완성의 응답값
			var q = request.term; //사용자의 input값
			//배열의 형태가 복잡한 경우, 임의로 필터를 지정
			$.each(autocomplete_search_source2, function(k, v){ 
				if (v.item_name.indexOf(q) != -1) {
					r.push({
						label: v.item_name, // 자동완성창에 표시되는 데이터
						value: v.item_name, // 선택했을때 input박스에 입력되는 데이터
						idx: v.item_idx, // 추가정보
					})
				}
			});
			response(r.slice(0, 10)); //자동완성 최대갯수 제한
		},  
		select : function(event, ui) { // 항목을 선택했을 때 발생하는 이벤트
			$(this).val(ui.item.value);
			$('ul li.idx-'+ui.item.idx).addClass('active');
			console.log('select : ', ui.item);
		},
		focus : function(event, ui) { // 포커스가 이동할 때 발생하는 이벤트
			console.log('focus : ', ui.item);
			return false;
		},
		minLength : 1, // 검색을 시작할 최소 글자수 (기본값: 1)
		autoFocus : true, // true로 설정 시 메뉴가 표시 될 때, 첫 번째 항목에 자동으로 초점이 맞춰짐
		classes : { // 위젯 요소에 추가 할 클래스를 지정( 일반적 'ui-autocomplete' : 'highlight')
			'ui-autocomplete' : 'highlight ul-searchInput2'
		},
		delay : 500, // 키보드 입력 후 검색까지의 지연 시간(ms) (기본값: 300).
		disable : false, // 해당 값 true 시, 자동완성 기능 꺼짐
		position : { my : 'right top', at : 'right bottom'}, // 제안 메뉴의 위치를 식별
		close : function(event) { // 자동완성 창 닫아질 때의 이벤트
			console.log('close : ', event);
		}
	}).autocomplete('instance')._renderItem = function(ul, item ) { /* jQuery UI Autocomplete 위젯의 기본 목록 렌더링 방식을 사용자 정의(Customize)할 때 사용하는 핵심 메서드 */
		 return $('&lt;li&gt;')
		.append('&lt;div&gt;&lt;i class="fas fa-search" aria-hidden="true"&gt;&lt;/i&gt; '+ item.value+'&lt;/div&gt;') /* HTML 커스터마이징 */
		.appendTo(ul); // 웹 상으로 보이는 건 정상적인 "소스" 인데 내부에서는 ㅅㅅ | 소스 에서 검색
	};
});
&lt;/script&gt;</pre><p><br /></p><p><br /></p><p><br /></p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Mon, 16 Mar 2026 10:56:20 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>테이블에서 동적으로 데이터 검색해 테이블 조회(filter) 및 검색어 하이라이트(highlight)</title>
<link>http://cginjs.com/datatip/136</link>
<description><![CDATA[<pre class="prettyprint lang-css linenums notranslate pre-word-wrap pretty-total-16">&lt;style&gt;
.search-box{position: relative; background-color: #f5f5f5; color: #333; padding: 9px; margin: 0 0 10px; font-size: 13px; border: 1px solid #ccc; border-radius: 4px;}
.search-box .btn{border: 1px solid #ccc; margin: 0 3px;}
.search-box .btn.btn_search_reset{background-color: #ff0080; color: #fff;}
.search-box .btn.btn-none{display: none;}
.search-box .Caps_Lock_state{position: relative; margin: 0 5px; color: #0080ff; font-weight: bold; display: none;}
.search-box .search_count_info{position: relative;}
.search-box .search_count_info strong{color: red !important;}
table.table-search { clear: both; width: 100%; border-collapse: collapse; border-spacing: 0 }
table.table-search thead th { background: #6f809a; color: #fff; display: table-row; border: 1px solid #60718b; font-weight: normal; text-align: center; padding: 8px 5px; font-size: 0.92em }
table.table-search tbody th { border: 1px solid #d6dce7; padding: 5px; text-align: center; }
table.table-search tbody tr:nth-child(even) { background: #eff3f9 }
table.table-search tbody tr.tr-none {display: none;}
table.table-search tbody td { border: 1px solid #d6dce7; padding: 5px; text-align: left; width: unset; }
table.table-search tbody td.no { text-align: center; background: #e8e8e8; width: 40px; }
&lt;/style&gt;</pre><pre class="prettyprint lang-html linenums notranslate pre-word-wrap pretty-total-55">&lt;div class="search-box"&gt;
	&lt;input type="text" id="searchInput" class="frm_input" placeholder="검색"/&gt; 
	&lt;button type="button" class="btn btn_search"&gt;검색&lt;/button&gt;
	&lt;button type="button" class="btn btn_search_reset btn-none"&gt;초기화&lt;/button&gt;
	&lt;span class="Caps_Lock_state"&gt;(Caps On)&lt;/span&gt;
	&lt;span class="search_count_info"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;table class="ex-table table-search"&gt;
	&lt;thead&gt;
	  &lt;tr&gt;
		 &lt;th nowrap&gt;No.&lt;/th&gt;
		 &lt;th nowrap&gt;이름&lt;/th&gt;
		 &lt;th nowrap&gt;연락처&lt;/th&gt;
		 &lt;th nowrap&gt;기타&lt;/th&gt;
	  &lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
	  &lt;tr&gt;
		&lt;td class="no" style="width:30px;" nowrap&gt;1&lt;/td&gt;
		&lt;td class="search"&gt;홍길동&lt;/td&gt;
		&lt;td class="search"&gt;010-1234-1234&lt;/td&gt;
		&lt;td class="search"&gt;홍길동은 홍 판서의 아들이면서도 그를 아버지라고 부르지 못했어요&lt;/td&gt;
	  &lt;/tr&gt;
	  &lt;tr&gt;
		&lt;td class="no" style="width:30px;" nowrap&gt;2&lt;/td&gt;
		&lt;td class="search"&gt;이모지&lt;/td&gt;
		&lt;td class="search"&gt;010-1111-2222&lt;/td&gt;
		&lt;td class="search"&gt;이모티콘&lt;/td&gt;
	  &lt;/tr&gt;
	  &lt;tr&gt;
		&lt;td class="no" style="width:30px;" nowrap&gt;3&lt;/td&gt;
		&lt;td class="search"&gt;천궁&lt;/td&gt;
		&lt;td class="search"&gt;010-8888-1234&lt;/td&gt;
		&lt;td class="search"&gt;천궁은 혈액순환을 개선하고 두통을 완화하는 데 효과적인 한방 약재&lt;/td&gt;
	  &lt;/tr&gt;
	  &lt;tr&gt;
		&lt;td class="no" style="width:30px;" nowrap&gt;4&lt;/td&gt;
		&lt;td class="search"&gt;박장군&lt;/td&gt;
		&lt;td class="search"&gt;010-0000-0123&lt;/td&gt;
		&lt;td class="search"&gt;박장군&lt;/td&gt;
	  &lt;/tr&gt;
	  &lt;tr&gt;
		&lt;td class="no" style="width:30px;" nowrap&gt;5&lt;/td&gt;
		&lt;td class="search"&gt;알고리즘&lt;/td&gt;
		&lt;td class="search"&gt;010-0101-0000&lt;/td&gt;
		&lt;td class="search"&gt;주어진 문제를 해결하기 위한 명확하고 체계적인 절차, 방법 또는 순서&lt;/td&gt;
	  &lt;/tr&gt;
	  &lt;tr&gt;
		&lt;td class="no" style="width:30px;" nowrap&gt;6&lt;/td&gt;
		&lt;td class="search"&gt;사과&lt;/td&gt;
		&lt;td class="search"&gt;-&lt;/td&gt;
		&lt;td class="search"&gt;사과는 맛있어!&lt;/td&gt;
	  &lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</pre><pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-67">&lt;script&gt;
$(function(e){
	$(document).on('click', '.search-box .btn_search', function(e){ 
		var sValue = $.trim( $('.search-box #searchInput').val() );
		var filter_idx, visibleRowCount;
		var td_colspan = $('table.table-search tbody tr:eq(0) td').length;
		var tr_empty_append_tag = '&lt;tr class="tr_search_empty"&gt;&lt;td colspan="'+td_colspan+'" style="height: 50px; line-height:50px; text-align: center; color: red;"&gt;데이타가 없습니다.&lt;/td&gt;&lt;/tr&gt;';
		$('table.table-search tbody tr.tr_search_empty').remove();
		$('table.table-search tbody tr').removeClass('tr-none');
		if(sValue) {
			filter_idx = 0;
			visibleRowCount = 0;
			$('table.table-search tbody tr').filter(function(e) {
				var tr_item = this;
				var textContent = $(tr_item).find('td.search').text().toLowerCase(); // td.search 내의 요소들만 검색
				//var allContent = $(tr_item).text().toLowerCase(); // 전체 요소 검색시
				// $(this).toggle($(this).text().toLowerCase().indexOf(sValue) &gt; -1); // 일반적

				$(tr_item).find('td span.highlight').contents().unwrap(); // 기존 하이라이트 제거 (unwrap)

				if(textContent.indexOf(sValue) == -1) { // 값이 없을때 -1 반환
					$(tr_item).addClass('tr-none'); // tr 숨김

				} else { // 검색어가 있을때
					$(tr_item).find('td.no').html((visibleRowCount + 1));
					var td_text = $(tr_item).find('td').text();

					if (td_text.includes(sValue)) {
						$(tr_item).find("td.search:contains('"+sValue+"')").each(function () {
							var regex = new RegExp("("+sValue+")", "gi");// 정규식 생성 (g: 전체, i: 대소문자 무시)
							var regex_str = '&lt;span class="highlight" style="background-color:yellow; color: red;"&gt;$1&lt;/span&gt;';
							$(this).html( $(this).text().replace(regex, regex_str) );// 내용 치환 : 하이라이트
						});
					}
					visibleRowCount++;
				}
			});
			if(visibleRowCount == 0) { $('table.table-search tbody').append(tr_empty_append_tag); }
			$('.search-box .btn_search_reset').removeClass('btn-none');
			$('.search-box .search_count_info').html('( &lt;strong&gt;'+visibleRowCount+'&lt;/strong&gt;건 조회 )');
		}
	});

	$(document).on('click', '.btn_search_reset', function(e){ 
		$('.search-box #searchInput').val('');
		$('.search-box .search_count_info').html('');
		$('table.table-search tbody tr').each(function (index, tr_item) {
			$(tr_item).removeClass('tr-none');
			$(tr_item).find('td span.highlight').contents().unwrap(); // 기존 하이라이트 제거 (unwrap)
			$(tr_item).find('td.no').html((index + 1));
		});
		$(this).addClass('btn-none');
	});

	$(document).on('keydown', '.search-box #searchInput', function(e){ 
		if ( e.originalEvent.getModifierState('CapsLock') ) {
			$('.search-box .Caps_Lock_state').show();
		} else {
			$('.search-box .Caps_Lock_state').hide();
		}
		if (e.key === 'Enter') {
			$('.search-box .btn_search').click();
			e.preventDefault();
		}
	});
});
&lt;/script&gt;</pre><p><br /></p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Tue, 10 Mar 2026 19:10:18 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>textarea 현재커서 위치에 내용 삽입</title>
<link>http://cginjs.com/datatip/132</link>
<description><![CDATA[<pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-20">&lt;script&gt;
function cursorPosInsert(obj, str) {
	var $textarea = $(obj);
	$textarea.focus();
	
	// 현재 커서 위치 파악 및 내용 삽입
	var selection = window.getSelection();
	var range = $textarea[0].setSelectionRange ? {
		start: $textarea[0].selectionStart,
		end: $textarea[0].selectionEnd
	} : document.selection.createRange();

	var svalue = $textarea.val();
	$textarea.val(svalue.substring(0, range.start) + str + svalue.substring(range.end));
	
	// 삽입 후 커서 위치 조정
	var newCursorPos = range.start + str.length;
	$textarea[0].setSelectionRange(newCursorPos, newCursorPos);
}
&lt;/script&gt;</pre><pre class="prettyprint lang-html linenums notranslate pre-word-wrap pretty-total-4">&lt;textarea class="frm_input frm_ex_textarea" rows="10" placeholder="내용을 입력하세요" style="width:100%; height:300px; margin: 2px 0;"&gt;
textarea 현재커서에 내용 삽입
&lt;/textarea&gt;
&lt;button type="button" class="btn" onclick="cursorPosInsert('.frm_ex_textarea', 'cginjs');" style="width:100%;"&gt;내용 삽입&lt;/button&gt;</pre>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Fri, 06 Mar 2026 18:10:59 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>백스페이스 : 커서 위치에서 삭제</title>
<link>http://cginjs.com/datatip/131</link>
<description><![CDATA[<p>&lt;pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-17" data-li_to="17" data-wrap="pre-word-wrap" data-lang="js"&gt;&amp;lt;script&amp;gt;</p><p>function backspaceAtCursor(obj) {</p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>var $input = $(obj);</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>var start = $input[0].selectionStart;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>var end = $input[0].selectionEnd;</span></p><p><br /></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>// 텍스트가 선택되어 있다면 선택된 텍스트 삭제, 아니면 하나 앞 문자 삭제</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>if (start === end &amp;amp;&amp;amp; start &amp;gt; 0) {</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>$input.val( $input.val().slice(0, start - 1) + $input.val().slice(end) );</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>$input.selectionStart = $input[0].selectionEnd = start - 1;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>} else {</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>$input.val( $input.val().slice(0, start) + $input.val().slice(end) );</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">		</span>$input.selectionStart = $input[0].selectionEnd = start;</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>}</span></p><p><span style="white-space:normal;"><span style="white-space:pre;">	</span>$input.focus();</span></p><p>}</p><p>&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;pre class="prettyprint lang-html linenums notranslate pre-word-wrap pretty-total-2" data-li_to="2" data-wrap="pre-word-wrap" data-lang="html"&gt;&amp;lt;input type="text" id="ex_text" class="frm_input" value="커서 위치에서 삭제" style="width:80%;" /&amp;gt;</p><p>&amp;lt;button type="button" class="btn" onclick="backspaceAtCursor('#ex_text');"&amp;gt;backspace&amp;lt;/button&amp;gt;&lt;/pre&gt;</p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Fri, 06 Mar 2026 18:01:06 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>Textarea Tab 들여쓰기 구현</title>
<link>http://cginjs.com/datatip/130</link>
<description><![CDATA[<pre class="prettyprint lang-html linenums notranslate pre-word-wrap pretty-total-1">&lt;textarea class="frm_input frm_ex_textarea" rows="10" placeholder="내용을 입력하세요" style="width:100%; height:300px;"&gt;&lt;/textarea&gt;</pre><pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-26">&lt;script&gt;
$(function(e){
	$(document).on('keydown', 'textarea.frm_ex_textarea', function(e) {
		if (e.keyCode === 9) { // Tab 키 코드
			e.preventDefault(); // 기본 탭 동작(포커스 이동) 방지
			var $domTextArea = $(this)[0];
			var start = $domTextArea.selectionStart, end = $domTextArea.selectionEnd;
			var value = $domTextArea.value;
			var selectedText = value.substring(start, end);// 선택된 텍스트
			var tab = "    "; // 4개 공백 또는 '\t' 문자

			// 블록 지정된 경우, 각 라인마다 탭 추가 (선택 사항)
			if (selectedText.includes('\n')) {
				var lines = selectedText.split('\n');
				var indentedText = lines.map(function(line) {
					return tab + line;
				}).join('\n');
				$domTextArea.setRangeText(indentedText, start, end, 'select');
			} else {
				// 단일 라인 또는 공백 1개 삽입
				$domTextArea.setRangeText(tab, start, end, 'end');
			}
		}
	});
});
&lt;/script&gt;</pre>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Thu, 05 Mar 2026 19:08:29 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>특정  div 영역  fullscreen 지정</title>
<link>http://cginjs.com/datatip/129</link>
<description><![CDATA[<p></p><pre class="prettyprint lang-css linenums notranslate pre-word-wrap pretty-total-15">&lt;style&gt;
.content_box{position: relative; padding:5px;}
.content_box textarea{width:100%; height:200px;}
.content_box .btn_ex_fullscreen_cancel{display: none; width:100%; margin:5px; background:#ff0080; color:#fff;}
.btn_ex_fullscreen{display: inline-block; width:100%; margin:5px; }

.content_box.fullscreen {position: fixed; top: 0; left: 0; width: 100vw !important; height: 100vh !important; background:#090300; !important; z-index: 9999 !important;}
.content_box.fullscreen textarea{height:90%;}
.content_box.fullscreen .btn_ex_fullscreen_cancel{display: inline-block;}

/* 전체 화면 적용시 기본 레이아웃 css 컨트롤 아래는 자신에 맞게 알맞게 설정 */
body.fullscreen{} 
body.fullscreen #hd, 
body.fullscreen #hd_wrapper {display: none;}
&lt;/style&gt;</pre>
	<p></p><pre class="prettyprint lang-html linenums notranslate pre-word-wrap pretty-total-5">&lt;div class="content_box"&gt;
	&lt;textarea class="frm_input frm_textarea"&gt;&lt;/textarea&gt;
	&lt;button type="button" class="btn btn_ex_fullscreen_cancel"&gt;FullScreen 취소&lt;/button&gt;
&lt;/div&gt;
&lt;button type="button" class="btn btn_ex_fullscreen"&gt;FullScreen&lt;/button&gt;</pre><pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-13 pretty-total-15">&lt;script&gt;
$(function(e) {
	$(document).on('click', '.btn_ex_fullscreen', function(e){ 
		$('.content_box').addClass('fullscreen');
		$('body').addClass('fullscreen');
		$('html, body').css('overflow', 'hidden');
	});

	$(document).on('click', '.content_box.fullscreen .btn_ex_fullscreen_cancel', function(e){ 
		$('.content_box').removeClass('fullscreen');
		$('body').removeClass('fullscreen');
		$('html, body').css('overflow', '');
	});
});
&lt;/script&gt;</pre><p>
	</p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Mon, 02 Mar 2026 13:44:45 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[WYSIWYG Editors]]></category>
<title>Summernote 에디터 설정 정보 가져오기</title>
<link>http://cginjs.com/datatip/128</link>
<description><![CDATA[<pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-13">var context = $('#summernote').data('summernote'); /* summernote 에디터 설정 정보 가져오기 */
var ui = context.ui;
var $note = context.layoutInfo.note;
var $editor = context.layoutInfo.editor;
var $editable = context.layoutInfo.editable;
var $toolbar  = context.layoutInfo.toolbar;
var modules = context.modules;
var memos = context.memos;
var options = context.options;
var lang = options.langInfo;

console.log(options.height); // 300 출력
console.log(lang); // 'ko-KR' 출력</pre>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Fri, 20 Feb 2026 19:55:33 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[WYSIWYG Editors]]></category>
<title>Summernote에서 전체 화면(Fullscreen) 모드 적용</title>
<link>http://cginjs.com/datatip/124</link>
<description><![CDATA[<p></p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-6">// 기본 설정 (툴바 추가)
$('#summernote').summernote({
  toolbar: [
    ['view', ['fullscreen', 'codeview', 'help']] // 툴바에 fullscreen 추가
  ]
});</pre>
<p></p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-8">// 자동 전체 화면 (초기화 시) : 페이지 로딩 시 바로 전체 화면으로 시작하려면 callback을 사용
$('#summernote').summernote({
  callbacks: {
    onInit: function() {
      $(this).summernote('fullscreen.toggle');
    }
  }
});</pre><pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-20">// 전체 화면 적용시 기본 레이아웃 css 컨트롤을 위함
$(document).on('click', '.note-editor .note-toolbar .note-btn-group button.btn-fullscreen', function(e){ 
	var isFullscreen = $('#summernote').summernote('fullscreen.isFullscreen'); /* 전체화면 상태 체크 */
	//console.log('Is Fullscreen:', isFullscreen);
	
	if(isFullscreen == true) { // 전체화면 true 일때
		if( $('body').hasClass('summernote-fullscreen') === true ) {
			/* class 존재 */
		} else {
			$('body').addClass('summernote-fullscreen'); 
		}
	}
	if(isFullscreen == false) { // 전체화면 false 일때
		if( $('body').hasClass('summernote-fullscreen') === true ) {
			$('body').removeClass('summernote-fullscreen'); 
		} else {
			/* class X */
		}
	}
});</pre><pre class="prettyprint lang-css linenums notranslate pre-word-wrap pretty-total-10">.note-editor.note-frame.fullscreen {z-index: 9999 !important; background-color: white !important; height: 100vh !important;}
.note-editor.note-frame.fullscreen .note-toolbar{}
.note-editor.note-frame.fullscreen .note-toolbar .note-btn-group{}
.note-editor.note-frame.fullscreen .note-toolbar .note-btn-group button.btn-fullscreen{}
.note-editor.note-frame.fullscreen .note-editable { overflow-y: scroll !important; }

/* 전체 화면 적용시 기본 레이아웃 css 컨트롤 아래는 자신에 맞게 알맞게 설정 */
body.summernote-fullscreen{} 
body.summernote-fullscreen #hd, 
body.summernote-fullscreen #hd_wrapper {display: none;}</pre><p><br /></p><p><br /></p><p><br /></p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Mon, 16 Feb 2026 13:23:28 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>네이티브 자바스크립트 Selection API 사용 블럭 지정된 텍스트 가져오기</title>
<link>http://cginjs.com/datatip/123</link>
<description><![CDATA[<pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-40">&lt;script&gt;
$(function(e) {
	// 블럭 지정된 텍스트 가져오기
	$(document).on('mouseup', function(e) {
		var selection = window.getSelection();
		var selectedText = $.trim( selection.toString() ); // 선택된 텍스트를 문자열로 반환
		if (selectedText.length &gt; 0) {
			console.log('블럭 지정된 내용 : ' + selectedText);
		}
	});

	// 블럭 지정된 텍스트 강조(Highlight)하기
	$(document).on('mouseup', function(e) {
		var selection = window.getSelection();
		var selectedText = $.trim( selection.toString() );
		if (selectedText.length &gt; 0) {
			// 선택된 영역을 span 태그로 감싸고 하이라이트 클래스 적용
			var range = selection.getRangeAt(0);
			var span = document.createElement('span');
			span.style.backgroundColor = 'yellow';
			span.className = 'highlighted';
			range.surroundContents(span);
			selection.removeAllRanges();// 선택 해제
		}
	});

	// 특정 영역 내에서만 블럭 지정 감지
	$(document).on('mouseup', function(e){
		var selection = window.getSelection();
		var selectedText = $.trim( selection.toString() ); // 선택된 텍스트를 문자열로 반환
		var content_area = document.querySelector('.content_area');
		if (selectedText.length &gt; 0) {
			// selection.anchorNode는 사용자가 드래그를 시작한 노드
			if (content_area.contains(selection.anchorNode)) {
				console.log('블럭 지정된 내용 : ' + selectedText);
			}
		}
	});
});
&lt;/script&gt;</pre>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Sat, 14 Feb 2026 17:12:29 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[WYSIWYG Editors]]></category>
<title>summernote 에디터에서 특정객체 hover시 tooltip 변경하기</title>
<link>http://cginjs.com/datatip/122</link>
<description><![CDATA[<p>summernote 에디터에서 특정객체 hover시 tooltip 변경하기<span style="white-space:normal;"></span></p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">// codeview 코드 보기 객체를 대상으로
$('.note-editor.note-frame .note-toolbar .note-btn-group.note-codeview button.note-btn.btn-codeview').hover(function(e){
	var $note_editor = $(this).closest('.note-editor.note-frame');
	if( $note_editor.hasClass('codeview') === true ) {
		var $note_tooltip = $note_editor.find('.note-tooltip.bottom.in');
		var $note_tooltip_content = $note_tooltip.find('.note-tooltip-content');
		$note_tooltip_content.html('코드 숨기기');
	} else {

	}
}, function(e) {

});</pre><p><span style="white-space:normal;"><br /></span></p><p><span style="white-space:normal;"><br /></span></p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Fri, 30 Jan 2026 12:44:09 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>현재 브라우저의 로케일 가져오기</title>
<link>http://cginjs.com/datatip/121</link>
<description><![CDATA[<p>navigator.language: 브라우저의 기본 언어/로케일 (예: "ko-KR", "en-US")<br /><span style="font-size:1em;">navigator.languages: 사용자가 설정한 선호 언어 목록 (배열 형태)</span></p><p>// 현재 브라우저의 로케일 가져오기</p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-2">var userLocale = navigator.language || navigator.userLanguage;
console.log(userLocale); // 예: 'ko-KR'</pre><p><br /></p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Fri, 30 Jan 2026 12:36:20 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[WYSIWYG Editors]]></category>
<title>summernote 에디터에서 CodeMirror 사용 및 CodeMirror  사용시 전체선텍, 초기화, 데이타삽입, 복사</title>
<link>http://cginjs.com/datatip/120</link>
<description><![CDATA[<p>summernote 에디터에서 CodeMirror 사용</p><pre class="prettyprint lang-html linenums notranslate pre-word-wrap">&lt;link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/theme/monokai.min.css"&gt;
&lt;link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/codemirror.min.css"&gt;
&lt;script src="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/codemirror.min.js"&gt;&lt;/script&gt;
&lt;script src="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/mode/xml/xml.min.js"&gt;&lt;/script&gt;
&lt;script src="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/mode/htmlmixed/htmlmixed.min.js"&gt;&lt;/script&gt;</pre><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">$('#summernote').summernote({
	codemirror: {
		mode: 'text/html',
		htmlMode: true,
		lineNumbers: true,
		heme: 'monokai'
	}
});</pre><p><br /></p><p>summernote 에디터에서 CodeMirror 사용시 전체선텍, 초기화, , 데이타삽입, 복사</p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">// CodeMirror 인스턴스 가져오기
var cm = $note_editor.find('.note-codable').data('cmEditor');
if (cm) {
	cm.focus();
	cm.execCommand('selectAll'); // CodeMirror 전체 콘텐츠를 선택
}

// CodeMirror 인스턴스 가져오기
var cm = $note_editor.find('.note-codable').data('cmEditor');
if (cm) {
	cm.setValue('');// CodeMirror 데이터 초기화
}

// CodeMirror 인스턴스 가져오기
var cm = $note_editor.find('.note-codable').data('cmEditor');
if (cm) {
	cm.setValue('CodeMirror에 데이터 삽입');// CodeMirror에 데이터 삽입
}

// CodeMirror 인스턴스 가져오기
var cm = $note_editor.find('.note-codable').data('cmEditor');
if (cm) {
	var copyArea = $.trim( cm.getValue() ); // CodeMirror에 데이터확인
	navigator.clipboard.writeText(copyArea)
		.then(resultText =&gt; { 
			alert('데이터가 복사되었습니다.'); // Clipboard
			console.log('I copied the CodeMirror editor value tag. [Clipboard API] ');
		})
		.catch(err =&gt; { 
			console.log('Something went wrong', err); 
	}); 
}
</pre>
<p><br /></p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Thu, 29 Jan 2026 14:33:25 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>querySelector 문법 (CSS 선택자)</title>
<link>http://cginjs.com/datatip/119</link>
<description><![CDATA[<p><span style="font-size:1em;">querySelector 문법 (CSS 선택자)</span></p><p><span style="font-size:1em;">querySelector() 함수는 지정한 CSS 선택자와 일치하는 첫 번째 요소 객체를 반환한다.</span></p><p>일치하는 요소가 없으면 null을 반환한다.</p><p><span style="font-size:1em;">지정한 선택자와 일치하는 모든 요소의 목록이 필요한 경우 querySelectorAll() 함수를 사용해야 한다.</span></p><p><span style="font-size:1em;"><br /></span></p><p>기본적인 선택자</p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">document.querySelector("#btn_prev"); 기본적인 선택자
document.querySelector(".btn_prev"); // class
document.querySelectorAll("button"); // 태그
document.querySelectorAll("[name]"); // name 속성이 있는 요소 모두
document.querySelectorAll("[value='1']") // value 속성이 1 인 요소 모두
document.querySelectorAll("#btn_prev, button")// ID가 'btn_prev' 인 요소와 Button 태그들을 선택
document.querySelectorAll("button#btn_prev");// button 태그이면서 아이디가 'btnPrev' 인 요소를 선택
document.querySelectorAll('input[type="checkbox"]');
document.querySelector("input[name=subject]")
document.querySelector("[name=stx]");
document.querySelector("meta[name='token']");</pre><p>계층 선택자<span style="font-size:1em;"></span></p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">document.querySelectorAll("div &gt; input");// div 바로 밑에 있는 input 태그를 선택(바로 밑에 있는 자식들만)
document.querySelectorAll("div input");// div 태그 밑에 있는 input 태그를 선택</pre><p>^ , $, *, ! 선택자</p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">document.querySelectorAll("[value*='a']"); // * 어느곳에라도 있는지 : 'value'라는 속성의 값에 'a'라는 문자가 포함된 요소 선택
document.querySelector("[value^='a']");// ^ 시작 : 'value'라는 속성의 값이 'a'로 시작하는 요소 선택
document.querySelectorAll("[value$='e']"); // $ 끝 : 'value'라는 속성의 값이 'e'으로 끝나는 요소 선택
document.querySelectorAll("[value!='1']"); // ! 아닌 것 : 'value'라는 속성의 값이 '1'이 아닌 요소 선택</pre><p>필터 선택자</p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">document.querySelectorAll("div:even"); // 짝수번째 div태그만 선택
document.querySelectorAll("div:odd"); // 홀수번째 div태그만 선택
document.querySelectorAll("li:nth-child(2)"); // li 태그의 형제들중 2번째 요소만 요소만 선택
document.querySelectorAll("li:first");// 첫번째 li태그 요소만 선택
document.querySelectorAll("li:last");// 마지막 li태그 요소만 선택
document.querySelector("li:eq(2)"); // 3번째 li태그 선택
document.querySelectorAll("li:gt(2)"); // 3번째이후 li태그 선택
document.querySelectorAll("li:lt(2)"); // 3번째이전 li태그 선택</pre><p>- selected, checked, disabled, enabled, focus : 요소 상태에 따른 필터</p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">document.querySelectorAll("option:selected");// selected된 option만 선택
document.querySelectorAll("input[type='checkbox']:checked"); // checked된 checkbox만 선택
document.querySelectorAll("input:disabled"); // disabled된 input태그만 선택
document.querySelectorAll("input:enabled"); // enabled된 input태그만 선택
document.querySelectorAll("input:focus"); // focus된 input태그만 선택</pre><p>- not(원치 않는 선택자) : 원치않는 선택자를 필터</p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">document.querySelectorAll("input:not(:disabled)"); // input태그중 disabled되지 않은 요소만 선택
document.querySelectorAll("input:not(.frm_disabled)"); // input태그중 class .frm_disabled 되지 않은 요소만 선택</pre><p>- has(포함된 선택자) : 포함된 선택자를 포함하고 있는 선택자를 필터</p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">document.querySelectorAll("div:has(h1)"); // h1태그를 포함한 div태그만 선택</pre><p>- contains(문자열) : 문자열을 포함한 선택자를 필터</p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">document.querySelectorAll("p:contains('test')"); // 'test' 라는 텍스트를 포함한 p 태그를 선택</pre><p>- hidden, visible : 숨겨진, 보이는 요소만 필터</p><pre class="prettyprint lang-js linenums notranslate pre-word-wrap">document.querySelectorAll("div:hidden"); // 숨겨진 div태그를 선택
document.querySelectorAll("div:visible"); // 보이는 div태그를 선택</pre><p><br /></p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Thu, 29 Jan 2026 11:07:05 +0900</dc:date>
</item>
<item>
<author>최고관리자</author>
<category><![CDATA[Javascript]]></category>
<title>div  수평 스크롤 제어 scrollLeft</title>
<link>http://cginjs.com/datatip/118</link>
<description><![CDATA[<pre class="prettyprint lang-css linenums notranslate pre-word-wrap pretty-total-9">&lt;style&gt;
.content-wrapper{width:900px; margin:3px auto; padding:5px; border: 1px solid #ccc; overflow-x:auto; white-space:nowrap;}
.content-wrapper::-webkit-scrollbar { width: 20px; }
.content-wrapper::-webkit-scrollbar-track { background-color: gray; }
.content-wrapper::-webkit-scrollbar-thumb { background-color: skyblue; }
.content-wrapper::-webkit-scrollbar-button { display: none; }
.content-wrapper textarea{ width:1900px;height:300px;}
.btn_scroll_box{width: 300px; margin:3px auto; padding:5px;}
&lt;/style&gt;</pre><pre class="prettyprint lang-html linenums notranslate pre-word-wrap pretty-total-18">&lt;div class="content-wrapper"&gt;
	&lt;textarea class="frm_input frm_textarea"&gt;
.content-wrapper{width:900px; margin:3px auto; padding:5px; border: 1px solid #ccc; overflow-x:auto; white-space:nowrap;}
.content-wrapper::-webkit-scrollbar { width: 20px; }
.content-wrapper::-webkit-scrollbar-track { background-color: gray; }
.content-wrapper::-webkit-scrollbar-thumb { background-color: skyblue; }
.content-wrapper::-webkit-scrollbar-button { display: none; }

.content-wrapper textarea{ width:1900px;height:300px;}
.btn_scroll_box{width: 300px; margin:3px auto; padding:5px;}
	&lt;/textarea&gt;
&lt;/div&gt;
&lt;div class="btn_scroll_box"&gt;
	&lt;button type="button" class="btn btn_scroll_first"&gt;처음&lt;/button&gt;
	&lt;button type="button" class="btn btn_scroll_left"&gt;왼쪽&lt;/button&gt;
	&lt;button type="button" class="btn btn_scroll_right"&gt;오른쪽&lt;/button&gt;
	&lt;button type="button" class="btn btn_scroll_last"&gt;마지막&lt;/button&gt;
&lt;/div&gt;</pre><pre class="prettyprint lang-js linenums notranslate pre-word-wrap pretty-total-24">&lt;script&gt;
$(function(e){
	// 처음 버튼 클릭 시
	$('.btn_scroll_first').click(function() {
		$('.content-wrapper').animate({scrollLeft: 0}, 500);
	});
	 
	// 왼쪽 버튼 클릭 시
	$('.btn_scroll_left').click(function() {
		$('.content-wrapper').animate({scrollLeft: '-=100'}, 500); // 왼쪽으로 500px 이동
	});
	 
	// 오른쪽 버튼 클릭 시
	$('.btn_scroll_right').click(function() {
		$('.content-wrapper').animate({scrollLeft: '+=100'}, 500); // 오른쪽으로 500px 이동
	});
	 
	// 마지막 버튼 클릭 시
	$('.btn_scroll_last').click(function() {
		var scrollLeft_last = $('.content-wrapper textarea').width();
		$('.content-wrapper').animate({scrollLeft: scrollLeft_last}, 500);
	});
});
&lt;/script&gt;</pre><p><br /></p><p><br /></p>]]></description>
<dc:creator>최고관리자</dc:creator>
<dc:language>ko</dc:language>
<dc:date>Wed, 28 Jan 2026 17:08:45 +0900</dc:date>
</item>
</channel>
</rss>
