프로그래밍/jQuery 제이쿼리

제이쿼리 - 응용(댓글, 답글, 리스트 옮기기)

Heidong 2021. 11. 1. 19:09
반응형

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<style type="text/css">
*{
	margin: 0; padding: 0; box-sizing: border-box;
}

body {
	font-size: 14px;
	font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;
}

a {
  color: #000;
  text-decoration: none;
  cursor: pointer;
}
a:active, a:hover {
	text-decoration: underline;
	color: #F28011;
}

.btn {
	color: #333;
	border: 1px solid #333;
	background-color: #fff;
	padding: 4px 10px;
	border-radius: 4px;
	font-weight: 500;
	cursor:pointer;
	font-size: 14px;
	font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;
	vertical-align: baseline; /* 부모 요소의 기준선에 맞춤 */
}
.btn:hover, .btn:active, .btn:focus {
	background-color: #e6e6e6;
	border-color: #adadad;
	color:#333;
}
.btn[disabled], fieldset[disabled] .btn {
	pointer-events: none;
	cursor: not-allowed;
	filter: alpha(opacity=65);
	-webkit-box-shadow: none;
	box-shadow: none;
	opacity: .65;
}

.boxTF {
	border: 1px solid #999;
	padding: 5px 5px;
	background-color: #fff;
	border-radius: 4px;
	font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;
	vertical-align: baseline;
}

.selectField {
	border: 1px solid #999;
	padding: 4px 5px;
	border-radius: 4px;
	font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;
	vertical-align: baseline;
}

.boxTA {
    border:1px solid #999;
    height:150px;
    padding:3px 5px;
    border-radius:4px;
    background-color:#fff;
	resize : none;
	vertical-align: baseline;
}

textarea:focus, input:focus {
	outline: none;
}
</style>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$(function() {
	$("body").on("click",".btnSendReply",function(){
		var num = "10";
		var $tb = $(this).closest("table");
		var content = $tb.find("textarea").val().trim();
		
		if(! content){
			$tb.find("textarea").focus();
			return false;
		}
		content = encodeURIComponent(content);
		
		var query = "num="+num+"&content="+content;
		alert(query);
	});
});


// 답글버튼
$(function() {
	$("body").on("click",".btnReplyAnswerLayout",function(){
		var $tr = $(this).closest("tr").next();
		var replyNum = $(this).attr("data-replyNum");
		
		var isVisible = $tr.is(":visible");
		if(isVisible){
			$tr.hide();
		} else {
			$tr.show();
		}
	});
});

// 답글 등록버튼
$(function() {
	$("body").on("click",".btnSendReplyAnswer",function(){
		var num = "10";
		var replyNum = $(this).attr("data-replyNum");
		var $td = $(this).closest("td");
		var content = $td.find("textarea").val().trim();
		
		if(! content){
			$td.find("textarea").focus();
			return false;
		}
		content = encodeURIComponent(content);
		
		var query = "num="+num+"&content="+content+"&answer="+replyNum;
		alert(query);
	});
});

</script>

</head>

<body>

 <div style="width: 700px; margin: 30px auto;">
     <table style='width: 100%; margin: 15px auto 0; border-spacing: 0;'>
          <tr height='30'> 
           <td align='left' >
           	<span style='font-weight: bold;' >댓글쓰기</span><span> - 타인을 비방하거나 개인정보를 유출하는 글의 게시를 삼가 주세요.</span>
           </td>
          </tr>
          <tr>
             <td style='padding:5px 0 0 5px;'>
                  <textarea class='boxTA' style='width:100%; height: 70px;'></textarea>
              </td>
          </tr>
          <tr>
             <td align='right'>
                  <button type='button' class='btn btnSendReply' style='padding:10px 20px;'>댓글 등록</button>
              </td>
          </tr>
     </table>
          
     <div id="listReply">
		<table style='width: 100%; margin: 10px auto 30px; border-spacing: 0;'>
			<thead id="listReplyHeader">
				<tr height="35">
				    <td colspan='2'>
				       <div style="clear: both;">
				           <div style="float: left;"><span style="color: #3EA9CD; font-weight: bold;">댓글 50개</span> <span>[댓글 목록, 1/10 페이지]</span></div>
				           <div style="float: right; text-align: right;"></div>
				       </div>
				    </td>
				</tr>
			</thead>
			<tbody id="listReplyBody">
			
			    <tr height='35' style='background: #eeeeee;'>
			       <td width='50%' style='padding:5px 5px; border:1px solid #cccccc; border-right:none;'>
			           <span><b>홍길동</b></span>
			        </td>
			       <td width='50%' style='padding:5px 5px; border:1px solid #cccccc; border-left:none;' align='right'>
			           <span>2017-11-10</span> |
			           <span class="deleteReply" style="cursor: pointer;" data-replyNum='310' data-pageNo='1'>삭제</span>
			        </td>
			    </tr>
			    <tr>
			        <td colspan='2' valign='top' style='padding:5px 5px;'>
			              댓글 내용 입니다.
			        </td>
			    </tr>
			    
			    <tr>
			        <td style='padding:7px 5px;'>
			            <button type='button' class='btn btnReplyAnswerLayout' data-replyNum='310'>답글 <span id="answerCount310">0</span></button>
			        </td>
			        <td style='padding:7px 5px;' align='right'>
			            <button type='button' class='btn btnSendReplyLike' data-replyNum='310' data-replyLike='1'>좋아요 <span>5</span></button>
                         <button type='button' class='btn btnSendReplyLike' data-replyNum='310' data-replyLike='0'>싫어요 <span>2</span></button>
			        </td>
			    </tr>
			
			    <tr class='replyAnswer' style='display: none;'>
			        <td colspan='2'>
			            <div id='listReplyAnswer310' class='answerList' style='border-top: 1px solid #cccccc;'></div>
			            <div style='clear: both; padding: 10px 10px;'>
			                <div style='float: left; width: 5%;'>└</div>
			                <div style='float: left; width:95%'>
			                    <textarea cols='72' rows='12' class='boxTA' style='width:98%; height: 70px;'></textarea>
			                 </div>
			            </div>
			             <div style='padding: 0px 13px 10px 10px; text-align: right;'>
			                <button type='button' class='btn btnSendReplyAnswer' data-replyNum='310'>답글 등록</button>
			            </div>
			        
			        </td>
			    </tr>

				

			    <tr height='35' style='background: #eeeeee;'>
			       <td width='50%' style='padding:5px 5px; border:1px solid #cccccc; border-right:none;'>
			           <span><b>가가가</b></span>
			        </td>
			       <td width='50%' style='padding:5px 5px; border:1px solid #cccccc; border-left:none;' align='right'>
			           <span>2017-10-10</span> |
			           <span class="deleteReply" style="cursor: pointer;" data-replyNum='309' data-pageNo='1'>삭제</span>
			        </td>
			    </tr>
			    <tr>
			        <td colspan='2' valign='top' style='padding:5px 5px;'>
			              안녕 하세요.
			        </td>
			    </tr>
			    
			    <tr>
			        <td style='padding:7px 5px;'>
			            <button type='button' class='btn btnReplyAnswerLayout' data-replyNum='309'>답글 <span id="answerCount309">1</span></button>
			        </td>
			        <td style='padding:7px 5px;' align='right'>
			            <button type='button' class='btn btnSendReplyLike' data-replyNum='309' data-replyLike='1'>좋아요 <span>7</span></button>
                         <button type='button' class='btn btnSendReplyLike' data-replyNum='309' data-replyLike='0'>싫어요 <span>1</span></button>
			        </td>
			    </tr>
			
			    <tr class='replyAnswer' style='display: none;'>
			        <td colspan='2'>
			            <div id='listReplyAnswer309' class='answerList' style='border-top: 1px solid #cccccc;'>
			            
						    <div class='answer' style='padding: 0px 10px;'>
						        <div style='clear:both; padding: 10px 0px;'>
						            <div style='float: left; width: 5%;'>└</div>
						            <div style='float: left; width:95%;'>
						                <div style='float: left;'><b>후후후</b></div>
						                <div style='float: right;'>
						                    <span>2017-11-22</span> |
						                    <span class='deleteReplyAnswer' style='cursor: pointer;' data-replyNum='315' data-answer='309'>삭제</span>
						                </div>
						            </div>
						        </div>
						        <div style='clear:both; padding: 5px 5px 5px 5%; border-bottom: 1px solid #ccc;'>
						            답글 입니다.
						        </div>
						    </div>			            
			            
			            </div>
			            <div style='clear: both; padding: 10px 10px;'>
			                <div style='float: left; width: 5%;'>└</div>
			                <div style='float: left; width:95%'>
			                    <textarea cols='72' rows='12' class='boxTA' style='width:98%; height: 70px;'></textarea>
			                 </div>
			            </div>
			             <div style='padding: 0px 13px 10px 10px; text-align: right;'>
			                <button type='button' class='btn btnSendReplyAnswer' data-replyNum='309'>답글 등록</button>
			            </div>
			        
			        </td>
			    </tr>

				
				
			    <tr height='35' style='background: #eeeeee;'>
			       <td width='50%' style='padding:5px 5px; border:1px solid #cccccc; border-right:none;'>
			           <span><b>나나나</b></span>
			        </td>
			       <td width='50%' style='padding:5px 5px; border:1px solid #cccccc; border-left:none;' align='right'>
			           <span>2017-10-08</span> |
			           <span class="deleteReply" style="cursor: pointer;" data-replyNum='308' data-pageNo='1'>삭제</span>
			        </td>
			    </tr>
			    <tr>
			        <td colspan='2' valign='top' style='padding:5px 5px;'>
			              자바를 공부하자.
			        </td>
			    </tr>
			    
			    <tr>
			        <td style='padding:7px 5px;'>
			            <button type='button' class='btn btnReplyAnswerLayout' data-replyNum='308'>답글 <span id="answerCount308">0</span></button>
			        </td>
			        <td style='padding:7px 5px;' align='right'>
			            <button type='button' class='btn btnSendReplyLike' data-replyNum='308' data-replyLike='1'>좋아요 <span>3</span></button>
                         <button type='button' class='btn btnSendReplyLike' data-replyNum='308' data-replyLike='0'>싫어요 <span>0</span></button>
			        </td>
			    </tr>
			
			    <tr class='replyAnswer' style='display: none;'>
			        <td colspan='2'>
			            <div id='listReplyAnswer308' class='answerList' style='border-top: 1px solid #cccccc;'></div>
			            <div style='clear: both; padding: 10px 10px;'>
			                <div style='float: left; width: 5%;'>└</div>
			                <div style='float: left; width:95%'>
			                    <textarea cols='72' rows='12' class='boxTA' style='width:98%; height: 70px;'></textarea>
			                 </div>
			            </div>
			             <div style='padding: 0px 13px 10px 10px; text-align: right;'>
			                <button type='button' class='btn btnSendReplyAnswer' data-replyNum='308'>답글 등록</button>
			            </div>
			        
			        </td>
			    </tr>

			
			</tbody>
			<tfoot id="listReplyFooter">
				<tr height='40' align="center">
		            <td colspan='2' >
		              1 2 3
		            </td>
	            </tr>
			</tfoot>
		</table>
     
     </div>
 </div>


</body>
</html>

- 답글 버튼을 숨기거나 보이게 하는 기능

- 답글 등록 기능

- 댓글 등록 기능

 

답글 버튼

- 바디 영역에서 클래스 btnReplyAnswerLayout가 클릭 되면 함수가 실행 된다.

- 실행되는 함수는 클릭된 놈의 가장 가까운 tr을 찾고 그 다음(next)을 변수로 지정

- 이 클래스의 속성을 변수 하나에 넣는다.

- 답글 버튼이 보이는 상태인지 안보이는 상태인지 확인하기 위해서 보이는 상태인 :visible을 if로 확인

- if 문으로 보여지고 있으면 숨기고 숨겨져 있으면 보이게 한다.

 

답글 등록 버튼과 댓글 등록 기능은

입력 받은 내용의 값을 trim()로 모든 공백을 제거하고

이걸 인코딩 해준다. => encodeURIComponent(content);

 

그리고 이걸 쿼리로 써먹기 위해 변수 하나에 쿼리 형식으로 저장을 한다.

var query = "num="+num+"&content="+content+"&answer="+replyNum;

 

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<style type="text/css">
*{
	margin: 0; padding: 0; box-sizing: border-box;
}

body {
	font-size: 14px;
	font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;
}

a {
  color: #000;
  text-decoration: none;
  cursor: pointer;
}
a:active, a:hover {
	text-decoration: underline;
	color: #F28011;
}

.btn {
	color: #333;
	border: 1px solid #333;
	background-color: #fff;
	padding: 4px 10px;
	border-radius: 4px;
	font-weight: 500;
	cursor:pointer;
	font-size: 14px;
	font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;
	vertical-align: baseline; /* 부모 요소의 기준선에 맞춤 */
}
.btn:hover, .btn:active, .btn:focus {
	background-color: #e6e6e6;
	border-color: #adadad;
	color:#333;
}
.btn[disabled], fieldset[disabled] .btn {
	pointer-events: none;
	cursor: not-allowed;
	filter: alpha(opacity=65);
	-webkit-box-shadow: none;
	box-shadow: none;
	opacity: .65;
}

.boxTF {
	border: 1px solid #999;
	padding: 5px 5px;
	background-color: #fff;
	border-radius: 4px;
	font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;
	vertical-align: baseline;
}

.selectField {
	border: 1px solid #999;
	padding: 4px 5px;
	border-radius: 4px;
	font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;
	vertical-align: baseline;
}

.boxTA {
    border:1px solid #999;
    height:150px;
    padding:3px 5px;
    border-radius:4px;
    background-color:#fff;
	resize : none;
	vertical-align: baseline;
}

textarea:focus, input:focus {
	outline: none;
}

.title {
	width:100%;
	font-size: 16px;
	font-weight: bold;
	padding: 13px 0;
}

.container {
    width: 400px;
    margin: 30px auto;
}

.note-table {
	width: 100%;
	border-spacing: 0;
	border-collapse: collapse;
}

.note-table th, .note-table td {
	padding: 5px 0;
}

.left {
	text-align: left;
	padding-left: 7px;
}
.center {
	text-align: center;
}
.right {
	text-align: right;
	padding-right: 7px;
}
</style>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$(function() {
	$("#itemLeft").append("<option value='lee'>이이이</option>");
	$("#itemLeft").append("<option value='kim'>김김김</option>");
	$("#itemLeft").append("<option value='no'>노노노</option>");
	$("#itemLeft").append("<option value='hong'>홍홍홍</option>");
	$("#itemLeft").append("<option value='ma'>마마마</option>");
	$("#itemLeft").append("<option value='ha'>하하하</option>");
});

$(function() {
	$("#btnRight").click(function() {
		$("#itemLeft option:selected").each(function() {
			$(this).appendTo("#itemRight");
		});
	});
	
	$("#btnAllRight").click(function() {
		$("#itemLeft option").each(function() {
			$(this).appendTo("#itemRight");
		});
	});
	
	$("#btnLeft").click(function() {
		$("#itemRight option:selected").each(function() {
			$(this).appendTo("#itemLeft");
		});
	});
	
	$("#btnAllLeft").click(function() {
		$("#itemRight option").each(function() {
			$(this).appendTo("#itemLeft");
		});
	});
});


function sendOk() {
	if($("#itemRight option").length===0){
		alert("받는 사람을 먼저 추가하세요");
		return;
	}
	
	$("#itemRight option").prop("selected",true);
	
	alert("ok");
}
</script>

</head>
<body>

<div class="container">
	<div class="title">
	   <h3><span>|</span> 쪽지 보내기</h3>
	</div>

	<form name="noteForm" method="post">
	<table class="note-table">
	<tr>
	    <td width="150"><span>친구목록</span></td>
	    <td width="100">&nbsp;</td>
	    <td width="150"><span>받는사람</span></td>
	</tr>
	
	<tr>
	    <td class="left">
	        <select name="itemLeft" id="itemLeft" multiple="multiple" class="selectField" style="width:130px; height:120px;"></select>
	    </td>
	    <td class="center">
		    <button type="button" class="btn" id="btnRight" style="display:block; width:80px;"> &gt; </button>
		    <button type="button" class="btn" id="btnAllRight" style="display:block;width:80px;"> &gt;&gt; </button>
		    <button type="button" class="btn" id="btnLeft" style="display:block;width:80px;"> &lt; </button>
		    <button type="button" class="btn" id="btnAllLeft" style="display:block;width:80px;"> &lt;&lt; </button>
	    </td>
	    <td class="left">
	        <select name="itemRight" id="itemRight" multiple="multiple" class="selectField" style="width:130px; height:120px;">
	        </select>
	    </td>
	</tr>
	<tr>
	    <td colspan="3">
	       <span>메시지</span>
	    </td>
	</tr>
	<tr>
	    <td colspan="3" class="left">
	        <textarea name="msg" class="boxTA" style="height:60px; width: 98%;"></textarea>
	    </td>
	</tr>
	</table>
	
	<table class="table">
	<tr>
	    <td class="right">
	        <button type="button" class="btn" onclick="sendOk();"> 쪽지보내기 </button>
	    </td>
	</tr>
	</table>
	</form> 
</div>

</body>
</html>

제이쿼리 함수 부분

$(function() {
	$("#itemLeft").append("<option value='lee'>이이이</option>");
	$("#itemLeft").append("<option value='kim'>김김김</option>");
	$("#itemLeft").append("<option value='no'>노노노</option>");
	$("#itemLeft").append("<option value='hong'>홍홍홍</option>");
	$("#itemLeft").append("<option value='ma'>마마마</option>");
	$("#itemLeft").append("<option value='ha'>하하하</option>");
});

$(function() {
	$("#btnRight").click(function() {
		$("#itemLeft option:selected").each(function() {
			$(this).appendTo("#itemRight");
		});
	});
	
	$("#btnAllRight").click(function() {
		$("#itemLeft option").each(function() {
			$(this).appendTo("#itemRight");
		});
	});
	
	$("#btnLeft").click(function() {
		$("#itemRight option:selected").each(function() {
			$(this).appendTo("#itemLeft");
		});
	});
	
	$("#btnAllLeft").click(function() {
		$("#itemRight option").each(function() {
			$(this).appendTo("#itemLeft");
		});
	});
});


function sendOk() {
	if($("#itemRight option").length===0){
		alert("받는 사람을 먼저 추가하세요");
		return;
	}
	
	$("#itemRight option").prop("selected",true);
	
	alert("ok");
}

처음 로드되면 제이쿼리를 이용해서 목록을 추가함

 

그리고 리스트 왔다갔다 하는거는 append() 메소드를 사용해도 되고 appendTo()메소드를 사용해도 된다.

반응형