js 와 jquery 의 form 태그의 접근 방식

들어가며

  • 클라이언트에서 서버로 데이타를 전달함에 있어 가장 기본적이며 손쉬운 방법은 form과 form 에 딸린 태그이다. 하지만 각 form 의 태그들은 그것을 호출하고 조작하는 방식이 다르다. 이를 정리한다.
  • 참고로, 이러한 객체의 접근방식을 문서객체모델(DOM Document Object Model)이라고 한다. 브라우저 내에 html 페이지를 document라고 하며, javascript가 해당 html을 객체화하고 조작하고 분석하며 출력하는 전체적인 과정을 의미한다.

1. document에 접근하는 방법

  • html에서 script를 사용하기 위해서는, <script></script> 태그로 블럭을 만들고 그 안에 자바스크립트 코드를 작성한다.
  • 한편, 브라우저는 html을 위에서 아래로 읽는다. 만약 스크립트 블럭에서의 식별자가 그것을 대상으로 하는 자바스크립트 코드보다 아래에 있으면 에러를 만든다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        let before = document.getElementById("testId").innerHTML;
        console.log(`before target : ${before}`); /* null 로 인한 에러 발생 */
    </script>
</head>
<body>
    <div id="testId">안녕!</div> 
    <script>
        let after = document.getElementById("testId").innerHTML;
        console.log(`after target : ${after}`); /* 안녕! */
    </script>
</body>
</html>
  • 이러한 한계를 해소하기 위하여 html을 모두 출력한 후에 스크립트를 동작시키는 코드는 아래와 같다.
  • 자바스크립트 : window.onload = function(){}
  • 제이쿼리 : $(document).ready(function(){})
<script type="text/javascript">
    // document.getElementById("a").style.border = "solid black 1px"; // body 보다 위에 있어서 <div id ="a">가 생성되기 전에 id = a를 호출하였음. 그러므로 작동하지 아니함.
    window.onload = function (){ 
    	document.getElementById("a").innerHTML = "hello, js!"
    	document.getElementById("a").style.color = "red";
    }

    $(document).ready(function(){
    	$('#b').css("color", "blue").html("hello, jq!");
    });
</script>

<body>
    <div id="a"></div>
    <br>
    <div id="b"></div>
</body>

2. selector / element 객체 선언, 태그의 속성 부여 및 추출

  • selector의 경우 body, header, h1, span 등 html에서 기본적으로 제공하는 태그를 의미한다.
  • element의 경우 사용자가 지정하는 id, name, class 등을 의미한다.
  • id는 유일무이한 객체로서 단 하나의 태그에만 선언할 수 있다.
  • name/class는 다수의 태그에 선언할 수 있다. 각각의 객체의 값을 js 값으로 변환하거나 조작할 때 리스트로 받고 반복문으로 접근 가능하다.
    • querySelector는 해당하는 객체가 여러개라 하더라도 단 하나만 적용되며, 그것은 document에서 처음으로 출력되는 객체이다.
    • selectorAll의 경우 해당하는 모든 객체에 적용된다.
  • 속성 부여와 추출은 setAttribute / getAttribute를 통해서도 가능하며, 그 이외에 다양한 방법이 존재한다.
<script type="text/javascript">
    window.onload = function () {
        document.getElementById("idA").style.color = 'red';
        document.getElementById("idB").style.color = 'blue';
        var nameAList = document.getElementsByName("nameA");
        for(var i=0; i<nameAList.length; i++){
            nameAList[i].style.textDecoration='underline';
        }
        var nameBList = document.getElementsByName("nameB");
        for(var i=0; i<nameBList.length; i++){
            nameBList[i].style.textDecoration='line-through';
        }
        var classAList = document.getElementsByClassName("classA");
        for(var i=0; i<classAList.length; i++){
            classAList[i].style.fontStyle='italic';
        }
        var classBList = document.getElementsByClassName("classB");
        for(var i=0; i<classBList.length; i++){
            classBList[i].style.fontWeight='bold';
        }

        var selectorAllList = document.querySelectorAll('h3');
        for(var i=0; i<selectorAllList.length; i++){
            selectorAllList[i].style.border ="1px red solid";
        }
        document.querySelector('h3').style.border ="5px black solid";
                                               
        var str = document.querySelector('h3').getAttribute('style');
            alert(str);
    }
</script>

3. 문서 객체 내부의 글자로서 html과 text의 선언

  • textContent의 경우 순수한 text/plain 형태이며, innerHtml은 text/html 형태로서 html의 형태로 렌더링된다.
  • textContent와 innerHTML의 경우 기존의 값을 덮어쓴다. 만약 추가하고 싶을 경우 =이 아닌 += 를 사용한다.
  • 값을 추출하는 방법은 .textContent 매서드를 사용한다.
<script type="text/javascript">
    window.onload = function () {
        alert("이전 값 : " + document.getElementById("idB").textContent);
        document.getElementById("idA").innerHTML = "<h3>hello</h3>"
        document.getElementById("idB").textContent = "<h3>hello</h3>"
        document.getElementById("idB").textContent += "<h3>HELLO</h3>"
        alert("이후 값 : " + document.getElementById("idB").textContent);
    }
</script>
<body>
    <div id="idA">반가워요.</div>
    <div id="idB">반가워요.</div>
</body>