같은 페이지에 jQuery 각각 다른 버전 사용하기 (jQuery 버전 충돌 해소)

- bootstrap 내장 jQuery 버전과 추가구현할 기능의 jQuery 버전이 달라 충돌이 일어나 error가 발생할 경우 충돌해소 방법

그냥 아래와 같이 적용을 하면 충돌이 생겨 기존 기능에서 에러가 발생한다. (기존 적용된 기능이 안되던가 새로 추가된 기능이 안되던가)

<!-- bootstrap 내장 jquery -->
<script src="/assets/global/plugins/jquery-ui/jquery-ui.min.js"	type="text/javascript"></script>

<!-- 추가할 jquery -->
<script src="/js/jquery-3.4.1.min.js"></script>	

 

새로 적용할 jquery버전에 $.noConflict(true); 문법을 사용한다.

<script src="/js/jquery-3.4.1.min.js"></script>	
<script>
var $j341 = jQuery.noConflict();
</script>

 

새로운 버전의 jquery를 사용하기 위해서는 아래처럼 $j341을 사용해주어야 한다.

<script>
$j341.ajax({...})
$j341("#button").click(function () {... });
</script>

 

각 라이브러리에 쓰인 js파일에 버전별로 j341로 바꿔야지 문제가 없이 실행 될 수있다.

(js파일 맨 밑만 수정하면 된다.) 

;(function ($, window, document, undefined) {
	var pluginName = "lib",
		defaults = {
			onDislike: null,
			onLike: null,
			animationRevertSpeed: 200,
			animationSpeed: 400,
			threshold: 1,
		};
		.
		.
		.
		
})($j341, window, document);
 //(jquery, window, document); > ($j341, window, document);

 

 

참고 : velog.io/@ddusi/jquery-1

동적으로 table 데이터 추가하기 

 

예제1) javascript 배열 데이터 table에 나타내기

- javascript

function tableCreate(){

  var table_value = new Array();
  var html = '';

  table_value.push({value : '25.5', time : '2020-08-26'}); 
  table_value.push({value : '22.4', time : '2020-08-26'}); 
  table_value.push({value : '10.58', time : '2020-08-26'}); 
  table_value.push({value : '3.44', time : '2020-08-26'}); 
  table_value.push({value : '8.5', time : '2020-08-26'}); 

  for(i in table_value){
  html += '<tr>';
  html += '<td>'+table_value[i].value+'</td>';
  html += '<td>'+table_value[i].time+'</td>';
  html += '</tr>';
  }

  $("#kgTable").empty();
  $("#kgTable").append(html);
			
}

- html

<table id="kgTable">
  <thead>
    <tr>
      <th>중량값</th>
      <th>작동 시간</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td></td>
      <td></td>
    </tr>
  </tbody>
</table>
<button onclick="tableCreate()">table_append</button>

 

예제2) javascript ajax for문 데이터 table로 나타내기 

		$.ajax ({
			url : "url",  
			cache : false,
			async:false,
			success : function (data) { 
				var html = '';
				for(var i=0; i<Object.keys(data.data).length; i++ ){
					$('#kgTable > tbody').empty(); //기존 테이블데이터 삭제
					html += '<tr>';
					html += '<td>'+data.data[i].kg_value+'</td>';
					html += '<td>'+ data.data[i].time+'</td>';
					html += '</tr>';
				}
				$("#kgTable").append(html); // 새로운 데이터 덮어쓰기
			
			}
		});

 

▶ id로 name/class 가져오기

var id_name = $('#id').attr('name');    // id로 name값 가져오기

var class_name = $('#id').attr('class');   // id로 class값 가져오기

 

 class로 name/id 가져오기

var class_name = $('.class').attr('name');  // class로 name값 가져오기

var class_id = $('.class').attr('id');  // class로 id값 가져오기

 

 name으로 id/class 가져오기

var name_id = $('[name="name"]').attr('id');  // name으로 id값 가져오기

var name_class = $('[name="name"]').attr('class');  // name으로 class값 가져오기

Table paging (bootstrap)

1. html

<!-- paging -->
<nav aria-label="Page navigation example">
	<ul class="pagination pagination-seperated "></ul>
</nav>

- 원하는 위치에 nav 삽입

 

2. js

function pagination() {
	var req_num_row = 10;  //화면에 표시할 목록 개수
	var $tr = jQuery('.paging');  // paging 대상 class 명
	var total_num_row = $tr.length;
	var num_pages = 0;
	if (total_num_row % req_num_row == 0) {
		num_pages = total_num_row / req_num_row;
	}
	if (total_num_row % req_num_row >= 1) {
		num_pages = total_num_row / req_num_row;
		num_pages++;
		num_pages = Math.floor(num_pages++);
	}

	jQuery('.pagination').append('<li class="page-item">'
					+ '<a class="page-link" href="#" aria-label="Previous">'
					+ '<span aria-hidden="true" class="mdi mdi-chevron-left"></span>'
					+ '<span class="sr-only">Previous</span></a></li>');

	for (var i = 1; i <= num_pages; i++) {
		jQuery('.pagination').append('<li class="page-item "><a class="page-link" href="#">' + i + '</a></li>');
		jQuery('.pagination li:nth-child(2)').addClass("active");
		jQuery('.pagination a').addClass("pagination-link");
	}

	jQuery('.pagination').append('<li class="page-item">'
					+ '<a class="page-link" href="#" aria-label="Next">'
					+ '<span aria-hidden="true" class="mdi mdi-chevron-right"></span>'
					+ '<span class="sr-only">Next</span></a></li>');

	$tr.each(function(i) {
		jQuery(this).hide();
		if (i + 1 <= req_num_row) {
			$tr.eq(i).show();
		}
	});

	jQuery('.pagination a').click('.pagination-link', function(e) {
		e.preventDefault();
		$tr.hide();
		var page = jQuery(this).text();
		var temp = page - 1;
		var start = temp * req_num_row;
		var current_link = temp;

		jQuery('.pagination li').removeClass("active");
		jQuery(this).parent().addClass("active");

		for (var i = 0; i < req_num_row; i++) {
			$tr.eq(start + i).show();
		}

		if (temp >= 1) {
			jQuery('.pagination li:first-child').removeClass("disabled");
		} else {
			jQuery('.pagination li:first-child').addClass("disabled");
		}

	});

	jQuery('.prev').click(function(e) {
		e.preventDefault();
		jQuery('.pagination li:first-child').removeClass("active");
	});

	jQuery('.next').click(function(e) {
		e.preventDefault();
		jQuery('.pagination li:last-child').removeClass("active");
	});

}

jQuery('document').ready(function() {
	pagination();

	jQuery('.pagination li:first-child').addClass("disabled");

});

- paging 대상 : jQuery('tbody tr'); 로 대체하면 paging대상이 tbody tr이 됨. (대체적으로 이렇게 사용)

 

3.  결과 이미지

다중 select box 사용 주소 검색

1. html

<select name="sido1" id="sido1"></select>
<select name="gugun1" id="gugun1"></select>

2. js

$('document').ready(function() {
 var area0 = ["시/도 선택","서울특별시","인천광역시","대전광역시","광주광역시","대구광역시","울산광역시","부산광역시","경기도","강원도","충청북도","충청남도","전라북도","전라남도","경상북도","경상남도","제주도"];
  var area1 = ["강남구","강동구","강북구","강서구","관악구","광진구","구로구","금천구","노원구","도봉구","동대문구","동작구","마포구","서대문구","서초구","성동구","성북구","송파구","양천구","영등포구","용산구","은평구","종로구","중구","중랑구"];
   var area2 = ["계양구","남구","남동구","동구","부평구","서구","연수구","중구","강화군","옹진군"];
   var area3 = ["대덕구","동구","서구","유성구","중구"];
   var area4 = ["광산구","남구","동구",     "북구","서구"];
   var area5 = ["남구","달서구","동구","북구","서구","수성구","중구","달성군"];
   var area6 = ["남구","동구","북구","중구","울주군"];
   var area7 = ["강서구","금정구","남구","동구","동래구","부산진구","북구","사상구","사하구","서구","수영구","연제구","영도구","중구","해운대구","기장군"];
   var area8 = ["고양시","과천시","광명시","광주시","구리시","군포시","김포시","남양주시","동두천시","부천시","성남시","수원시","시흥시","안산시","안성시","안양시","양주시","오산시","용인시","의왕시","의정부시","이천시","파주시","평택시","포천시","하남시","화성시","가평군","양평군","여주군","연천군"];
   var area9 = ["강릉시","동해시","삼척시","속초시","원주시","춘천시","태백시","고성군","양구군","양양군","영월군","인제군","정선군","철원군","평창군","홍천군","화천군","횡성군"];
   var area10 = ["제천시","청주시","충주시","괴산군","단양군","보은군","영동군","옥천군","음성군","증평군","진천군","청원군"];
   var area11 = ["계룡시","공주시","논산시","보령시","서산시","아산시","천안시","금산군","당진군","부여군","서천군","연기군","예산군","청양군","태안군","홍성군"];
   var area12 = ["군산시","김제시","남원시","익산시","전주시","정읍시","고창군","무주군","부안군","순창군","완주군","임실군","장수군","진안군"];
   var area13 = ["광양시","나주시","목포시","순천시","여수시","강진군","고흥군","곡성군","구례군","담양군","무안군","보성군","신안군","영광군","영암군","완도군","장성군","장흥군","진도군","함평군","해남군","화순군"];
   var area14 = ["경산시","경주시","구미시","김천시","문경시","상주시","안동시","영주시","영천시","포항시","고령군","군위군","봉화군","성주군","영덕군","영양군","예천군","울릉군","울진군","의성군","청도군","청송군","칠곡군"];
   var area15 = ["거제시","김해시","마산시","밀양시","사천시","양산시","진주시","진해시","창원시","통영시","거창군","고성군","남해군","산청군","의령군","창녕군","하동군","함안군","함양군","합천군"];
   var area16 = ["서귀포시","제주시","남제주군","북제주군"];

 

 // 시/도 선택 박스 초기화

 $("select[name^=sido]").each(function() {
  $selsido = $(this);
  $.each(eval(area0), function() {
   $selsido.append("<option value='"+this+"'>"+this+"</option>");
  });
  $selsido.next().append("<option value=''>구/군 선택</option>");
 });

 

 // 시/도 선택시 구/군 설정

 $("select[name^=sido]").change(function() {
  var area = "area"+$("option",$(this)).index($("option:selected",$(this))); // 선택지역의 구군 Array
  var $gugun = $(this).next(); // 선택영역 군구 객체
  $("option",$gugun).remove(); // 구군 초기화

  if(area == "area0")
   $gugun.append("<option value=''>구/군 선택</option>");
  else {
   $.each(eval(area), function() {
    $gugun.append("<option value='"+this+"'>"+this+"</option>");
   });
  }
 });


});

3. 결과

 

(출처 : https://codepen.io/eond/pen/oMBRpG)

 

 

버튼 클릭 시 tab 추가

1. html

<div class="container">
    <div class="row">
        <div class="col-md-12">
            <p>
                <button id="btn-add-tab" type="button" class="btn btn-primary pull-right">Add Tab</button>
            </p>
            <!-- Nav tabs -->
            <ul id="tab-list" class="nav nav-tabs" role="tablist">
                <li class="active"><a href="#tab1" role="tab" data-toggle="tab"><span>Tab 1 </span><span class="glyphicon glyphicon-pencil text-muted edit"></span></a></li>
            </ul>

            <!-- Tab panes -->
            <div id="tab-content" class="tab-content">
                <div class="tab-pane fade in active" id="tab1">Tab 1 content</div>
            </div>
        </div>
    </div>
</div>

  • ul : tab list
  • li : tab list 각 요소
  • tab-content : tab의 내용

2. js

var button='<button class="close" type="button" title="Remove this page">×</button>';
var tabID = 1;
function resetTab(){
	var tabs=$("#tab-list li:not(:first)");
	var len=1
	$(tabs).each(function(k,v){
		len++;
		$(this).find('a').html('Tab ' + len + button);
	})
	tabID--;
}

$(document).ready(function() {
    $('#btn-add-tab').click(function() {
        tabID++;
        $('#tab-list').append($('<li><a href="#tab' + tabID + '" role="tab" data-toggle="tab"><span>Tab ' + tabID + '</span> <span class="glyphicon glyphicon-pencil text-muted edit"></span> <button class="close" type="button" title="Remove this page">×</button></a></li>'));
        $('#tab-content').append($('<div class="tab-pane fade" id="tab' + tabID + '">Tab ' + tabID + ' content</div>'));
        $(".edit").click(editHandler);
    });
    
    $('#tab-list').on('click', '.close', function() {
        var tabID = $(this).parents('a').attr('href');
        $(this).parents('li').remove();
        $(tabID).remove();

        //display first tab
        var tabFirst = $('#tab-list a:first');
        resetTab();
        tabFirst.tab('show');
    });

    var list = document.getElementById("tab-list");
});

var editHandler = function() {
  var t = $(this);
  t.css("visibility", "hidden");
  $(this).prev().attr("contenteditable", "true").focusout(function() {
    $(this).removeAttr("contenteditable").off("focusout");
    t.css("visibility", "visible");
  });
};

$(".edit").click(editHandler);
  • tab ID : 고유 id 값 부여
  • resetTab() : tab 삭제시 tab ID 값이 1씩 줄어듬
  • btn-add-tab click : 추가 버튼 클릭시 tab 생성 (tab 이름, edit 버튼, close 버튼)

 

(출처 : https://www.codeply.com/go/4yGNCaA8Xs/bootstrap-tabs-add-edit-remove)

Javascript MQTT 웹소켓 통신

- 자바스크립트를 이용하여 MQTT 통신

1. js 다운로드 : 

 

mqttws31-min.js
0.03MB
mqttws31.js
0.08MB

 

2. javascript

- 예제 함수 

  • stratConnect() : 랜덤으로 client ID를 생성하여 MQTT Broker에 연결
  • onConnect() : 연결성공 후 topic 설정하여 subscribe 준비
  • onConnectionLost(responseObject) : 연결이 끊길경우 error message 출력
  • onMessageArrived(message) : subscribe message 출력
  • publish(element) : publish message 전송 / element는 HTML 버튼 선택자 (버튼 클릭시 ON/OFF 메시지 전송)
  • startDisconnect() : 연결 종료
// Called after form input is processed
function startConnect() {
    // random client ID 생성
    clientID = "clientID-" + parseInt(Math.random() * 100);

    // broker IP , broker websocket port
    host = "브로커아이피";
    port = "브로커웹소켓포트";

    console.log("Connecting to: "+host+"  on port: "+port+" / clinet value: "+clientID);

    // connection
    client = new Paho.MQTT.Client(host, Number(port), clientID);

    // callback
    client.onConnectionLost = onConnectionLost;

    // Connect the client, if successful, call onConnect function
    client.connect({ 
        onSuccess: onConnect
    });
}

function onConnect() {
    
    topic = "#"; //MQTT 토픽명 (#은 모든 토픽 허용)

    // Print output
    console.log("Subscriving to: "+topic);

    // Subscribe to the requested topic
    client.subscribe(topic);
    client.onMessageArrived = onMessageArrived;

}

// connection error
function onConnectionLost(responseObject) {
    document.getElementById("messages").innerHTML += '<span>ERROR: Connection lost</span><br/>';
    if (responseObject.errorCode !== 0) {
        document.getElementById("messages").innerHTML += '<span>ERROR: ' + + responseObject.errorMessage + '</span><br/>';
    }
}

// subsribe output
function onMessageArrived(message) {
    console.log("onMessageArrived: " + message.payloadString);
}

// send a message (publish)
function publish (element) {
	
	var topic = $(element).attr("id"); //버튼의 id를 topic으로 설정
	
	if(element.checked == true){
		var message = "ON";
	} else {
		var message = "OFF";
	}
	
    message = new Paho.MQTT.Message(message);
    message.destinationName = topic;
    message.qos = 2;

    client.send(message);
}


// disconnection
function startDisconnect() {
    client.disconnect();
    document.getElementById("messages").innerHTML += '<span>Disconnected</span><br/>';
}

 

 

 

html 화면 png로 저장

1. js파일 다운로드

  • html2canvas : html 객체를 canvas로 변환해주는 라이브러리

html2canvas.js
0.36MB

2. html

  • 저장영역 div id값 설정
<div class="card card-default pb-5">
  <div class="save_btn"><a class="hover" href='javascript:void(0);' onclick="PrintDiv($('#bar_chart2'));">이미지로 저장</a></div> //저장 div id
  <div id="bar_chart2" > //저장 div
    <div class="card-header justify-content-center">
    	<h2 class="text-center">현재 습도 데이터</h2>
    </div>
    <div class="card-body" style="height: 300px;">
    	<canvas id="bar2"></canvas>
   		<div id='customLegend_humi' class='customLegend'></div>
    </div>
  </div>
</div>
    다운받은 js 추가
<script src="/js/html2canvas.js"></script>

3. javascript 함수 작성

//이미지(png)로 다운로드
function PrintDiv(div){
	div = div[0]
	html2canvas(div).then(function(canvas){
		var myImage = canvas.toDataURL();
		downloadURI(myImage, "저장이미지이름.png") 
	});
}

function downloadURI(uri, name){
	var link = document.createElement("a")
	link.download = name;
	link.href = uri;
	document.body.appendChild(link);
	link.click();
}

 

4. 실행

 

5. 결과

+ Recent posts