좌충우돌 개발

2018-04-10

|

한글 깨짐##

html의 meta 정보에 utf-8 추가 함으로 웹브라우저가 한글이 깨지지 않게 해석할 수 있도록 한다.
만약 meta 정보에 utf-8 있음에도 한글이 깨진다면 html을 서버쪽에서 만드는 쪽을 의심해 봐야 한다.

  • html
    <head>
      <meta charset="utf-8">
    </head>
    
  • jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    

    응답 결과를 보여줄 때 사용할 문자의 인코딩을 지정 해주는 옵션

시간 정보 가져오기 (java)

  TimeZone timeZone = (timeInfo.getTimeZone() != null) ?
          TimeZone.getTimeZone(timeInfo.getTimeZone()) : TimeZone.getDefault();

  SimpleDateFormat simpleDateFormat = new SimpleDateFormat(timeInfo.getTimeFormat());
  simpleDateFormat.setTimeZone(timeZone);
  Date date = new Date();
  simpleDateFormat.format(date);

아톰에디터

아톰에디터를 사용 하다 보면 마지막 줄이 맨 밑에서 더이상 스크롤이 안되는 문제점이 있다 이를 해결 하기 위해서 환경 설정에서 Scroll Past End를 선택한다

환경설정 - Editor - Scroll Past End 를 선택

spring json 반환

pojo class를 선언하고 반환 타입으로 지정하고 앞에 @ResponseBody를 붙여 준다

@ResponseBody : @RequestBody와 비슷한 방식으로 동작한다.
@ResponseBody가 메소드 레벨에 부여되면 메소드가 리턴하는 오브젝트는 뷰를 통해 결과를 만들어내는 모델로 사용되는 대신, 메시지 컨버터를 통해 바로 HTTP 응답의 메시지 본문으로 전환된다
스트링 타입의 리턴값은 뷰이름으로 인식하지만, @ResponseBody를 붙이면 스트링 타입을 지원하는 메시지 컨버터가 이를 변환하여 HttpServletResponse의 출력스트림에 넣는다.

javascript-network

|

네트워크 통신

Ajax

Ajax는 웹브라우저와 웹서버가 내부적으로 데이터 통신을 하게 된다. 그리고 변경된 결과를 웹페이지에 프로그래밍적으로 반영함으로써 웹페이지의 로딩 없이 서비스를 사용할 수 있게 한다.

Asynchronous javascript and xml
비동기적으로 javascript를 사용하여 데이터를 주고 받는다

XMLHttpRequest

  let xhr = new XMLHttpRequest();
  let url = '';
  
  xhr.open('GET', url);
  xhr.onreadystatechange = function() {
    //상태정보 변경되었을 때 처리 핸들러
    if(xhr.readyState === 4 && xhr.status === 200){
      xhr.responseText;
    }
  }
  xhr.send();

POST

let xhr = new XMLHttpRequest();
let url = '';

xhr.open('POST', url);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(data);

javascript-event

|

이벤트

브라우저에서 사용자가 어떤 동작을 했을 때 윈도우 프로그래밍이랑 개념이 같다…..

  • event target : 이벤트가 발생하는 대상
  • event type : 동작 (click onchange …)
  • event handler : event를 처리하는 code

등록 방법

이벤트 대상에 이벤트 핸들러를 등록해줘야 한다

inline 방식

<input type="button" onclick="alert('hello world, '+this.value)" value="button">

this : 함수가 속해있는 객체를 말한다

html 과 javascript가 혼재된 방식으로 정보와 제어가 혼재되어 좋지 않다

프로퍼티 리스너

이벤트 대상의 프로퍼티로 이벤트를 등록하는 방식

  let button1 = document.getElementById("bt1");
  button1.onclick = function(event) {alert(event.target.value)};

addEventListener()

가장 권장되는 방식이다
IE8에서는 동작하지 않는다

  let button1 = document.getElementById("bt1");
  button1.addEventListener('click', function(event){
    alert(event.target.value);
  })

하나의 event에 여러 리스너를 등록하는 방법

  • property 방식으로는 리스너가 덮어 씌어져서 안된다.
  • addEventListener로는 하나의 event에 여러 리스너의 등록이 가능하다.

하나의 리스너에 여러개의 event를 등록 하는 방법

  • event.target.id 를 switch문에 전달하여 case로 등록하여 처리한다
function textmodify(event) {
  switch (event.target.id) {
    case 'bt1':
      target.appendData(data.value);
      break;
    case 'bt2':
      target.deleteData(start.value, end.value);
      break;
    default:
  }
}

let button1 = document.getElementById("bt1");
button1.addEventListener('click', textmodify);

let button2 = document.getElementById("bt2");
button2.addEventListener('click', textmodify);

이벤트 전파(버블링과 캡처링)

HTML 태그는 중첩되어 있다. 따라서 특정한 태그에서 발생하는 이벤트는 중첩되어 있는 태그들 모두가 대상이 될 수 있다. 이런 경우 중첩된 태그들에 이벤트가 등록 되어 있다면 어떻게 처리 될까?

  • capturing : event 핸들러의 호출이 부모 엘리먼트에서 자식 엘리먼트로 내려갈때 (사용이 드물다)
  • bubbling : event 핸들러의 호출이 자식 엘리먼트에서 부모 엘리먼트로 올라갈때 (default)

주의 : addEventListner의 세번째 인자는 생략할 경우 default 값이 false로 event 전파가 bubbling이 된다

  <script type="text/javascript">
  function handler(event) {
    console.log(event.target.nodeName, this.nodeName, event.eventPhase);
  }
  let target = document.getElementById("target");
  target.addEventListener('click', handler, true);
  document.querySelector('fieldset').addEventListener('click', handler, true);
  document.querySelector('body').addEventListener('click', handler, true);
  document.querySelector('html').addEventListener('click', handler, true);
  </script>

eventPhase : 해당 target 일때 2, 버블링 3 event 전파를 막기 : event.stopPropagation();

기본동작의 취소

웹브라우저의 기본 동작

  • 텍스트 필드에 포커스를 준 상태에서 키보드를 입력하면 텍스트가 입력된다.
  • 폼에서 submit 버튼을 누르면 데이터가 전송된다.
  • a 태그를 클릭하면 href 속성의 URL로 이동한다.
      let inputForm = document.getElementById('sumbit')
      inputForm.addEventListner('submit', function(event){
    
      // 폼에 submit를 누를 때 이벤트를 취소하여 서버에 전송하지 못하도록 한다
      event.preventDefault();
    })
    

이벤트 타입

사용자 입력 정보를 서버로 전달할 때 사용하는 태그
event 종류

  • submit : form의 내용을 서버에 전달 event
  • change : form 태그의 정보가 변경되었을 때 event
  • blur : input 창에 포커싱이 벗어났을 때 event (주의 : input에다 event를 걸어야함)
  • focus : input 창에 입력 포커싱이 되었을 때 event (주의 : input에다 event를 걸어야함)
<p>
    <form class="" id="target" action="index.html" method="post">
      <input type="text" id="name" name="" value="">
      <input type="submit" name="" value="제출">
    </form>
  </p>

  <p id="result"> </p>
  <script type="text/javascript">
    let target = document.getElementById("target");
    target.addEventListener("submit", function(event) {
      let name = document.getElementById("name");
      if (name.value.length === 0) {
        alert("이름을 입력하세요");
        event.preventDefault();
      }
    })

    target.addEventListener("change", function(event) {
      let name = document.getElementById("name");
      var result = document.getElementById("result");
      result.innerHTML = name.value;
    })

    let name = document.getElementById("name");
    name.addEventListener("focus", function(event) {
      alert("focus");
    })

    name.addEventListener("blur", function(event) {
      alert("blur");
    })
  </script>

문서 로딩

  • load : HTML 코드의 모든 구성요소를 읽어들여 객체화 시켰 을 때 이벤트

    head 태그안에 javascript 코드를 위치 시키면 문서 로딩이 완료되지 않아 body태그에 접근하려 하면 null이 발생 한다

    보통 body 태그 안의 최하단에 javascript코드를 위치 시켜 문제를 발생하지 않도록 한다.
    그래도 head에 위치 시켜야 하는 이유가 있다면 load 이벤트를 사용 한다

  window.addEventListner( "load", function () {
    .....
  })
  • DOMContentLoaded : 문서에서 스크립트 작업을 할 수 있을 때 발생되는 이벤트

    문서를 모두 읽어들인 후 작업을 진행하게 될때 리소스 읽어들임이 지연되게 된다면 사용자 입장에서는 답답함을 느낄 수 있다. 이 때 문서 로딩이 끝나지 않고 스크립트 작업 먼저 진행해야 할 때 DOMContentLoaded 이벤트를 사용 한다

마우스

이벤트 타입

마우스 이벤트 또한 OS 종속적이다. PC에서만 사용… OS에서 마우스 이벤트를 캡쳐하고 브라우저에서 발생하였다면 브라우저 내의 어떤 객체를 선택하였는지 브라우저에서 이벤트 처리르 하게 될 것이다. OS->브라우저->객체
OS의 마우스 event와 동일 하다

  • click : 클릭
  • dbclick : 더블클릭
  • mousedown : 마우스를 누를 때
  • mouseup : 마우스 버튼는 땔 때
  • mousemove : 마우스를 움질 일 때
  • mouseover : 마우스를 객체위에 올려놓을 때
  • mouseout : 마우스가 객체를 벗어 날 때
  • contextmenu : 오늘 쪽 마우스 클릭할 때

키보드 조합

  • event.shiftKey
  • event.altKey
  • event.ctrlKey

마우스 포인터 위치

  • clientX, clientY

jQuery 이벤트

직접 javascript 코드를 작성할 때 보다 간소화 된다

on API

  .on( events [, selector ] [, data ], handler(eventObject) )
  • event : 등록하고자 하는 이벤트 타입
  • selector : 이벤트가 설치된 엘리먼트의 하위 엘리먼트를 대상으로 필터링함
  • data : 이벤트가 실행될 때 핸들러로 전달될 데이터를 설정함
  • handler : 이벤트 핸들러함수

    on api document

    late binding : 존재하지 않는 엘리먼트에 event를 설치하면 해당 동작에 문제가 있지만 존재하는 상위 엘리먼트에 이벤트를 설치하고 하위 엘리먼트를 selector로 등록하면 정상 동작한다

다중 바인딩

하나의 엘리먼트에 여러개의 이벤트 등록

  $("ul").on("click mouseover", 'a', function() {
    console.log(this.tagName);
  })

  $('#target').on({
    'focus' : function(e){

    },
    'blur' : function(e){

    }
})

이벤트 제거

  $("target").off("이벤트타입", 핸들러)

핸들러는 생략 가능 : 생략한다면 이벤트 타입의 모든 핸들러 삭제

DocumentObject

|

Document 객체

HTMLDocument 객체 : 문서전체를 가리키는 객체

주요 API

  • createElement() : node 만들기
  • createTextNode() : 텍스트 node 만들기

문서 정보 API

  • title
  • URL
  • referrer
  • lastModified

Text 객체

DOM에서 공백도 하나의 객체이다

  • 값 API
    • nodeValue
    • data
  • 조작 API
    • appendData(data) : 추가할 값을 parameter 로 넘긴다
    • deleteData(start, end) : 대상의 start위치에서 end위치까지 문자를 삭제한다
    • insertData(start, data) : start위치부터 data를 추가한다
    • replaceData(start, end, data) : start에서 end 사이의 문자를 없애고 data로 바꾼다
    • substringData(start, end) : start에서부터 end만큼 이동한 문자열을 반환한다

문서의 기하학적 특성

element의 위치와 크기를 얻는 방법

top : 위에서 부터 element 까지의 px left : 좌측에서부터 element 까지의 px

offsetParent : 측정의 기준점이 누구였는가를 알고싶을때 사용

엘리먼트의 위치를 의미하는 top, right의 값을 통해서 기준이 그 부모가 아니라 body라는 것을 알 수 있다. 그리고 이를 명시적으로 확인할 수 있는 방법은 offsetParent 속성을 호출하는 것이다. 만약 부모 중 CSS position의 값이 static인 td, th, table 엘리먼트가 있다면 이 엘리먼트가 offsetParent가 된다

viewport

window.scrollTo(x, y) : 문서의 스크롤을 y만큼 움직여라

스크린의 크기 innerWidth : viewport 넓이 innerHeight : viewport 높이

screen.width : 사용자의 모니터 넓이 screen.height : 사용자 모니터의 높이

javascript-web-DOM

|

DOM

제어 대상을 찾기

기본 흐름 : 제어할 객체를 찾고 객체를 제어 한다

브라우저의 객체를 찾기

  • document.getElementsByTagName : 태그의 이름을 가지고 객체들을 가져온다
  • document.getElementsByClassName : class 이름을 가지고 객체들을 가져온다.
  • document.getElementById : id로 객체를 조회하고 객체를 가지고 온다. 성능이 좋다.
  • document.querySelector : css 선택자의 문법을 이용해서 객체를 조회하여 하나의 객체만 가져온다.
  • document.querySelectorAll : css 선택자의 문법을 이용해서 객체를 조회하여 객체를 유사배열에 담아 가져온다.
    • css 선택자
      • ‘태그’
      • ‘.클래스이름’
      • ‘#아이디’ : 문서에서 하나만 존재해야 한다

jQuery


jQuery는 DOM을 내부에 감추고 보다 쉽게 웹페이지를 조작할 수 있도록 돕는 도구이다

라이브러리도 결국은 javascript를 사용하여 dom bom을 조작하기 쉽게 해주는 도구에 불과함으로 javascript를 알고 있어야 한다.

jQuery의 사용

CDN 이란 ?

  <script src='//code.jquery.com/jquery-1.11.0.min.js'><script>

위 구문에서 src 값중 ‘//’의미는 앞쪽에 http와 https 가 상황에 맞게 동작하도록 한다

운영할 때는 min 버전(압축)을 사용하여 네트워크 대역폭을 줄인다

jQuery를 다운 받아 사용할 때 현재 디렉토리를 기준으로 설정한다.

제어 대상을 찾기(jQuery)

$()는 jQuery의 함수이다. 이 함수의 인자로 CSS의 선택자를 전달하면 jQuery는 jQuery 객체를 반환한다. jQuery 객체를 리턴받아 method로 작업하구 다시 리턴 받은 객체를 method로 연결하여 chaining할 수 있다. java에서 봤던 패턴이다

$('li').css('color','red');

HTMLElement

getElement* method가 반환하는 객체

  • HTMLElement : 객체가 하나만 리턴 된다면 HTMLElement를 반환 -> HTML{태그}Element
    • HTMLElement의 객체를 상속받은 태그객체를 리턴 한다(javascript에서도 Interface가 존재하는 가? )
  • HTMLCollection : 복수개의 객체가 리턴한다면 HTMLCollection을 반환
  • HTMLElement는 상속을 통해 공통의 속성들을 가지게 된다
<script type="text/javascript">
  var target = document.getElementById('a');
  console.log(target.constructor.name);

  var target = document.getElementById('b');
  console.log(target.constructor.name);

  var target = document.getElementById('c');
  console.log(target.constructor.name);

  var target = document.getElementsByTagName('li');
  console.log(target.constructor.name);
</script>

DOM Tree

dom tree

HTMLCollection

HTMLCollection은 리턴 결과가 복수인 경우에 사용하게 되는 객체다.
HTMLCollection의 특이점 : 목록이 실시간으로 갱신된다.

참고 : console을 그룹으로 묶을 수 있다.

console.group('');
console.groupEnd();

jQuery 객체

jQuery 함수의 리턴값으로 jQuery 함수를 이용해서 선택한 엘리먼트들에 대해서 처리할 작업을 프로퍼티로 가지고 있는 객체다

암시적 반복

DOM과 다르게 jQuery 객체의 메소드를 실행하면 선택된 엘리먼트 전체에 대해서 동시에 작업이 처리된다

체이닝

조회

조회 - map

jQuery의 객체에 map함수에 각 엘리먼트를 처리할 function(index, element) {} 를 지정해주면 각 엘리먼트가 읽어들일 때 마다 해당 함수가 호출되어 처리된다

  $("p").map(function(index, element){
    console.log(index, element);
  })

jQuery 객체 API

자주 사용되는 jQuery 함수는 리스트는 ?

jQuery API 설명


Element 객체

Element와 HTMLElement와의 관계는 ?

  • Element는 HTMLElement의 부모 객체이다
  • DOM은 HTML만을 관리하는 표준이 아니다
  • Node - Element - HTMLElement

주요기능(API)


식별자

문서내에서 특정한 엘리먼트를 식별하기 위한 용도로 사용되는 API

Element.classList
Element.className
Element.id
Element.tagName

조회

엘리먼트의 하위 엘리먼트를 조회하는 API

Element.getElementsByClassName
Element.getElementsByTagName
Element.querySelector
Element.querySelectorAll

속성

엘리먼트의 속성을 알아내고 변경하는 API

Element.getAttribute(name)
Element.setAttribute(name, value)
Element.hasAttribute(name);
Element.removeAttribute(name);


식별자 API

  • Element.tagName : 현재 엘리먼트의 tagName을 읽어 들인다 (읽기 전용)
    document.getElementsByTagName('').tagName;
    
  • Element.id : 문서에서 하나만 존재하는 id에 해당하는 element를 읽어들인다. 읽어들인 element.id를 통해서 해당 id값을 수정할 수 있다.
    var sample = document.getElementById('originalId');
    sample.id = 'modifiedId';
    
  • Element.className : 문서내에서 여러개의 엘리먼트를 그룹핑한 클래스를 가지고 온다.
  • Element.classList : className보다 사용하기가 편리하다
    • add(‘’) : class를 추가한다
    • remove(‘’) : class를 제거한다
    • toggle(‘’) : class가 없다면 추가하고 있다면 제거한다

HTML에서의 class : 하나의 element에 여러개의 class를 가지고 있을 수 있다.

  <li class ='class1 class2 class3'></li>

조회 API

조회의 범위를 줄이기 document를 통해서 읽어들인 element에 .getElement*를 통해서 해당 엘리먼트의 하위 엘리먼트를 읽어들인다

속성 API

  • Element.getAttribute(name) : element가 가지고 있는 속성을 읽어온다
  • Element.setAttribute(name, value) : element의 속성값을 수정 한다
  • Element.hasAttribute(name) : element에 속성이 있는지 확인 한다
  • Element.removeAttribute(name) : element에서 속성을 삭제한다

속성과 프로퍼티

  • 속성과 프로퍼티의 차이점 :
    • 프로퍼티 방식이 좀 더 속도가 빠르다.
    • attribute 방식으로 값을 가져올 때와 property 방식으로 가지온 값이 다를 수 있다.
    • property방식은 이름에 주의해야 한다

jQuery 속성 제어 API

jQuery 객체의 메소드 중 setAttribute, getAttribute에 대응되는 메소드는 attr이다. 또한 removeAttribute에 대응되는 메소드로는 removeAttr이 있다.

attribute와 property

장점 : prop(‘이름’) : 직접 property로 접근할 때보다 실수를 줄일 수 있다

<a id="t1" href="./demo.html">opentutorials</a>
<input id="t2" type="checkbox" checked="checked" />
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
// 현재 문서의 URL이 아래와 같다고 했을 때
// http://localhost/jQuery_attribute_api/demo2.html
var t1 = $('#t1');
console.log(t1.attr('href')); // ./demo.html
console.log(t1.prop('href')); // http://localhost/jQuery_attribute_api/demo.html

var t2 = $('#t2');
console.log(t2.attr('checked')); // checked
console.log(t2.prop('checked')); // true
</script>

jQuery 조회 범위 제한

  $( ".marked", "#active").css( "background-color", "red" );
  $( "#active .marked").css( "background-color", "red" );
  • find();
      $( "#active").find('.marked').css( "background-color", "red" );
    

Node 객체

모든 DOM 최상위 객체

사전적 의미 : 트리(tree) 구조에서 데이터의 상하위 계층을 나타내는 위치의 항목. 각 노드를 연결해 주는 것이 분기(分岐)이며, 루트(root)와 서브트리(subtree)로 구성됨.

Node 전체 객체 관계

관계

Node의 관계 메서드를 사용할 때 주의점은 노드와 노드사이에 공백은 text 객체로 인식한다는 점이다

  • Node.childNodes
  • Node.firstChild
  • Node.lastChild
  • Node.nextSibling
  • Node.previousSibling
  • Node.contains()
  • Node.hasChildNodes()

Node 객체의 값을 제공하는 API

  • Node.nodeValue
  • Node.textContent

자식관리

Node 객체의 자식을 추가하는 방법에 대한 API

  • Node.appendChild()
  • Node.removeChild()

노드종류 API

노드 작업을 하게 되면 현재 선택된 노드가 어떤 타입인지를 판단해야 하는 경우가 있다. 이런 경우에 사용할 수 있는 API가 nodeType, nodeName이다.

  • Node.nodeType node의 타입을 의미한다.
  • Node.nodeName node의 이름 (태그명을 의미한다.)
  ELEMENT_NODE 1
  ATTRIBUTE_NODE 2
  TEXT_NODE 3
  CDATA_SECTION_NODE 4
  ENTITY_REFERENCE_NODE 5
  ENTITY_NODE 6
  PROCESSING_INSTRUCTION_NODE 7
  COMMENT_NODE 8
  DOCUMENT_NODE 9
  DOCUMENT_TYPE_NODE 10
  DOCUMENT_FRAGMENT_NODE 11
  NOTATION_NODE 12
  DOCUMENT_POSITION_DISCONNECTED 1
  DOCUMENT_POSITION_PRECEDING 2
  DOCUMENT_POSITION_FOLLOWING 4
  DOCUMENT_POSITION_CONTAINS 8
  DOCUMENT_POSITION_CONTAINED_BY 16
  DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC 32

재귀함수

노드를 탐색하기 위하여 재귀함수를 사용한다

traverse 1.〈장소를〉 가로지르다, 횡단하다, 넘다, 건너다

	function traverse (target, callback){

		if(target.nodeType === Node.ELEMENT_NODE) {
			callback(target);

			var e = target.childNodes;
			for(var i=0; i<e.length; i++) {
				traverse(e[i], callback);
			}
		}

	}

	var c = document.getElementById('start');

	traverse(c, function(element) {
		console.log(element);
	})

document의 body태그의 노드를 읽어들여 traverse함수에 전달한다.
읽어들인 target(body)에서 ELEMENT 타입이면 콜백함수를 호출하여 인자값을 전달하고 콘솔에 출력한다. 타겟 노드 아래의 child nodes를 읽어들여 하나씩 traverse함수에 넣어서 동일한 작업을 반복 시킨다. child node가 없을 때 까지 동일한 작업을 반복 한다.


노드 변경 API

노드추가


appendChild(child)
노드의 마지막 자식으로 주어진 엘리먼트 추가
insertBefore(newElement, referenceElement)

document.createElement(tag_name)
엘리먼트 노드를 추가한다.
document.createTextNode(data)
텍스트 노드를 추가한다.

노드 제거

삭제의 권한은 부모 node에게 있다. target.parentNode.removeChild(target)

노드 바꾸기

replaceChild(newChild, oldChild)


jQuery 노드변경 API

추가

  • before : 태그 앞
  • prepend : 태그 안 content 앞
  • after : 태그 뒤
  • append : 태그 안 content 뒤

삭제

  • remove : element 삭제
  • empty : element가 가지고 있는 text 삭제

변경

객체 A를 객체B로 변경한다

  • replaceWith : 객체A.replaceWith(객체B)
  • replaceAll : 객체B.replaceAll(객체A)
$("#bt3").click(function() {
let m = document.createElement("div");
let t = document.createTextNode("hello world");
m.appendChild(t);

// $("#t3").replaceWith(m);
// $('<div>hello</div>').replceAll('#t3');
 $(m).replaceAll('#t1');

})

복사

객체A.clone().replaceAll(객체B) : 객체A를 복사하여 객체B를 복사한 객체B로 교체한다

이동

객체A.append(객체B) : document에 있는 존재하는 엘리먼트가지고온 객체B를 객체A에 append하면 기존 위치에서 객체 A 뒤로 이동하게 된다

문자열로 노드 제어

  • innerHTML 문자열로 자식 노드를 만들 수 있는 기능을 제공한다. 또한 자식 노드의 값을 읽어올 수도 있다.
  • outerHTML 자기자신을 포함한 하위 엘리먼트들

  • innerText, outerText 값을 읽을 때는 HTML 코드를 제외한 문자열을 리턴하고, 값을 변경할 때는 HTML의 코드를 그대로 추가한다.

  • insertAdjacentHTML(선택, 추가할 값)
    • ‘beforebegin’ : 선택 element 앞
    • ‘afterbegin’ : 선택 element의 하위 element의 첫번째 앞
    • ‘beforeend’ : 선택 element의 하위 element의 맨마지막 뒤
    • ‘afterend’ : 선택 element 뒤