VScode/JQuery

[JQuery] DOM

hvoon 2022. 9. 9. 14:46

-DOM은 자바스크립트보다 제이쿼리에서 훨씬 활용도 높음

 

1. 기본 필터링 메서드

 

filter()

-$(selector).filter(selector);

-$(selector).filter(function(index){});

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            $('h3').filter(':even').css({backgroundColor:'black',
                                         color:'white'});
            // 선택자의 짝수 번째 css 변경
            // $('h3:even').css({background:'black',color:'white'});
            // 위와 같은 내용
        });
        $(function(){
            $('h3').filter(function(index){return index%3==0}).css(
                           {backgroundColor:'blue',color:'white'});
            // filter 내의 익명함수가 전체 index를 대상으로 하여 
            // 3으로 나눈 나머지가 0인 인덱스에만 true를 리턴해 줌. 
            // filter true가 리턴 된 인덱스에 대해서만 
            // 지정된 css를 적용함

            // 인덱스 3과 4만 골라내고 싶으면 
            // 익명함수 안에 return index==3 ||index==4;
            // filter 메서드의 괄호 안에는 
            // 적용될 인덱스를 저장할 키워드 또는 
            // 익명함수로 골라 넣을 수 있게 코딩하면 됨
        });
    </script>
</head>
<body>
    <h3>Header - 0</h3>
    <h3>Header - 1</h3>
    <h3>Header - 2</h3>
    <h3>Header - 3</h3>
    <h3>Header - 4</h3>
    <h3>Header - 5</h3>
</body>
</html>
 
 

2. 문서 객체 탐색 chaining과 종료

-chaining을 사용해 한 줄로 서로 다른 문서 객체에 스타일 적용 가능

-관련 셀렉터들로 필터링한 후 chaining과 filter를 사용함.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            $('h3').css('background','orange').filter(':even').css(
                                                    'color','red');
// 전혀 관련없는 대상을 체이닝하지는 않음
// 잘못된 사용: $('h3').css('background','orange').$('h1').css();

// 문서 객체의 css 변경을 마친 경우 리턴되는 값이 
// 다시 문서객체($('h3'))이므로 위와 같이 또 다른 탐색이나 
// css 내용을 이어서 적용시킬 수 있음

// 필터링 된 선택자로 css를 변경한 후에 리턴된 선택자는 
// 앞서 필터링한 결과를 그대로 유지함. 
// 따라서 다른 채이닝을 이어서 사용하면 
// 계속 필터링된 결과에 적용되게 됨
        });
    </script>
</head>
<body>
    <h3>Header - 0</h3>
    <h3>Header - 1</h3>
    <h3>Header - 2</h3>
    <h3>Header - 3</h3>
    <h3>Header - 4</h3>
    <h3>Header - 5</h3>
</body>
</html>
 
 

위의 체이닝 방식으로 실행하기 곤란한 상황일 때

*위 코드에서 script만 변경

 1) 따로따로 지정

// 전체 배경 오렌지, 짝수 번째 글자색 흰색, 홀수 번째 글자색 빨강
$(function(){
    $('h3').css('background','orange');
    $('h3:even').css('color','white');
    $('h3:odd').css('color','red');
});

 2) 체이닝 이용

$(function(){
    $('h3').css('background','orange').filter(':even').css('color',
                      'white').filter(':odd').css('color','red'); 
// $('h3').css('background','orange') 이 문장이 실행되면 
// 리턴 문서객체가 $('h3')이지만 
// .filter(':even').css('color','white') 여기까지 실행되어 
// 리턴된 문서객체는 짝수번째의 h3들임. 
// 따라서 마지막 필터링 .filter(':odd')는 
// 리턴된 짝수번째들을 대상으로 홀수번째를 골라냄
});
.filter(':odd')는 리턴된 짝수번째들을 대상으로 홀수번째를 골라냄. 그래서 Header -2 만 해당됨

 3) end()

-문서 객체 선택을 필터링 이전 한 단계 뒤로 돌리는 함수

$(function(){
    // end()를 이용하여 짝수번째 필터링을 제거 후 
    // 다시 홀수번째 필터링을 적용해야 의도한 필터링이 진행됨
    $('h3').css('background','silver').filter(':even').css('color',
                  'red').end().filter(':odd').css('color','blue');
});
 

 

3. 문서 객체 추가 선택

-add(): 기존 문서 객체를 포함하여 추가로 문서 객체를 선택

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            $('h1').css('background','gray').add('h2').css('color',
                                                            'red');
            // h1에 배경 gray를 적용 후 h2도 추가해서 
            // 글자색 빨강으로 적용
            // $('h1').css('background','gray');
            // $('h1','h2').css('color','red');
        });
    </script>
</head>
<body>
    <h1>Header - 0</h1>
    <h2>Header - 1</h2>
    <h1>Header - 2</h1>
    <h2>Header - 3</h2>
    <h1>Header - 4</h1>
</body>
</html>
 

 

4. 문서 객체의 특징 판별

-$(this).index(): 현재 객체의 인덱스값

-$(this).is(선택자): 종속선택자 같은 this 내부에서 선택자로 추가 필터링한 객체

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            // $('h1').each(function(index,item){})의 사용 방식에서
            // this를 사용하면서 index 값이나 item 변수를 
            // fuction() 안에서 생략하여 사용이 가능함. 
            // 다만 이 경우 현재 this의 인덱스를 알아내려면
            // 별도의 함수가 필요함
            $('h1').each(function(){
                if($(this).is('.select')){
                    $(this).css('color','red');
                    // $(this).innerHTML=$(this).index();
                }
// this 객체에 class 속성으로 select 값이 존재한다면
// 제이쿼리 일반적 선택자로 표현한다면 
// $('h1.select').css('color','red')
            });
        });
    </script>
</head>
<body>
    <h1 class="select">Header - 0</h1>
    <h1>Header - 1</h1>
    <h1 class="select">Header - 2</h1>
</body>
</html>
 
 

 

5. 문서 객체의 클래스 속성 추가

-addClass()

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>addClass</title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        // ex1. 매개변수에 문자열(클래스 이름) 입력
        $(function(){$('h1').addClass('item_1');}); 
        // 전체 h1 태그에 하나의 클래스 적용 
        // <h1>Header-0</h1> 
        // -> <h1 class="item_1">Header-0</h1>

        // ex2. 매개변수에 클래스이름으로 된 
        // 문자열을 리턴하는 익명 함수 입력
        $(function(){
            $('h1').addClass(function(index){return 'item_'
                                             +(index+1);});
        });
        // 각각의 h1에 다른 클래스 적용. 
        // 인덱스값(0,1,2)을 전달인수로 전달받은 익명함수의 리턴값
        // ('item_1','item_2','item_3')이 addClass에 적용됨
        // 익명함수의 위치가 addClass 메서드 안쪽에 위치하기 때문에 
        // 익명함수의 리턴값은 addClass에 적용될 class 이름들임
    </script>
</head>
<body>
    <h1>Header-0</h1>
    <h1>Header-1</h1>
    <h1>Header-2</h1>
</body>
</html>
 

 

6. 문서 객체의 클래스 속성 제거

-removeClass()

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            $('h1').removeClass(
                function(index){
                    if(index==0)
                    return 'item_'+(index+1);});
        }); 
// 문자 연산으로 만들어진 클래스 이름으로 각 h1 태그의 클래스를 제거함
// $('h1').removeClass('item_1'); 
// -> 모든 h1에서 item_1이라는 클래스는 모두 삭제됨
// removeClass 메서드에 전달인수로 
// function(index){return 'item_'+(index+1);}를 넣었다면 
// 인덱스별로 문자연산에 의해 생성된 
// 클래스이름('item_1','item_2','item_3')들을 해당 태그에서 삭제함
// 위 예제는 if문에 의해 h1의 0번째 인덱스에 적용된 
// 클래스 값만 적용된 곳에서만 제거함
    </script>
</head>
<body>
    <h1 class='item_1'>Koala.jpg</h1>
    <img src="images/Koala.jpg" width="150"/>
    <h1 class='item_2'>Koala.jpg</h1>
    <img src="images/Penguins.jpg" width="150"/>
    <h1 class='item_3'>Koala.jpg</h1>
    <img src="images/Tulips.jpg" width="150"/>
</body>
</html>
 

 

7. 문서 객체의 속성 검사

-attr()

-속성과 관련된 모든 기능 수행.

-값을 얻는 동작에 인덱스가 사용되지 않았다면 첫번째 문서객체(인덱스 0번)이 사용됨.

-검사라는 표현보다 조회하여 얻어내는 동작이 더 어울리는 표현임

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            var src=$('img').attr('src'); 
           // img 태그에서 src 속성값을 추출하여 src 변수에 저장
            var header1=document.createElement('h1'); 
           // h1태그 생성
            var textNode=document.createTextNode(src); 
           // 문자열 객체 생성
            header1.appendChild(textNode); 
           // 태그에 문자열을 삽입
            document.body.appendChild(header1); 
           // 태그를 body에 추가
            var w=$('img').attr('width');
            header1=document.createElement('h1');
            textNode=document.createTextNode(w);
            header1.appendChild(textNode);
            document.body.appendChild(header1);
        }); 
// 현재 예제는 each를 사용하지 않아서 맨위의 태그만 적용하고 
// 한번만 출력함
    </script>
</head>
<body>
    <h1 class='item_1'>Koala.jpg</h1>
    <img src="images/Koala.jpg" width="150"/>
    <h1 class='item_2'>Koala.jpg</h1>
    <img src="images/Penguins.jpg" width="150"/>
    <h1 class='item_3'>Koala.jpg</h1>
    <img src="images/Tulips.jpg" width="150"/>
</body>
</html>
 
 
8. 문서 객체의 속성 추가

-attr() 메서드 사용

1) $(selector).attr(name,value);

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            $('img').attr('width','300');
// 속성의 적용에 인덱스 적용이 안되어 있다면 
// 모든 동일한 문서객체에 적용됨
// <img src=""> -> <img src="" width="300">
        }); // img 태그 전체에 같은 속성 적용
    </script>
</head>
<body>
    <h1 class='item_1'>Koala.jpg</h1>
    <img src="images/Koala.jpg" width="150"/>
    <h1 class='item_2'>Koala.jpg</h1>
    <img src="images/Penguins.jpg" width="150"/>
    <h1 class='item_3'>Koala.jpg</h1>
    <img src="images/Tulips.jpg" width="150"/>
</body>
</html>
 
 

*위 코드에서 script 내용만 변경

2) $(selector).attr(name,function(index){});

-익명함수를 이용한 개별 속성값의 추가

-언제든 익명함수를 이용해서 인덱스별로 다른 값이 필요할 땐, 필요한 위치에 index를 매개변수로 하는 익명함수를 구성해주면 됨. (인덱스별 다른 값이 필요한 곳에 그 값을 리턴해주는 익명함수 구성)

$(function(){
    $('img').attr('width',function(index){return (index+1)*100;});
}); // 각 img마다 다른 속성값을 적용
 

3) $(selector).attr(object);

-익명함수이용 & 객체를 활용한 속성 추가

$(function(){
    $('img').attr({'width':function(index){return (index+1)*100;}, 
    'height':200});
}); 
// 함수를 이용하여 개별값으로 width 값을 추가하고, 
// 일괄적으로 height 값을 추가함
 

4) removeAttr(name)

-문서 객체의 속성을 제거해주는 메서드

$(function(){
    $('img').removeAttr('width');
}); 
// 100*200 200*200 300*300인 이미지에서 width를 제거.
// 모두 height 200인 이미지로 변환됨 
// 가로세로 비율은 원본이미지 비율이 적용
 
 

 

5. 문서 객체의 스타일 검사

-css(): 스타일과 관련된 모든 기능을 수행

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            var color=$('h1:eq(1)').css('background-color');
            var header1=document.createElement('h1');
            var textNode=document.createTextNode(color);
            header1.appendChild(textNode);
            document.body.appendChild(header1);
        });
    </script>
</head>
<body>
    <h1 class="item_1">Header-0</h1>
    <h1 class="item_2">Header-1</h1>
    <h1 class="item_3">Header-2</h1>
</body>
</html>

 

6. 문서 객체의 스타일 추가

1) $(selector).css(name,value);

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            $('h1').css('color','red');
        });
    </script>
</head>
<body>
    <h1>Header-0</h1>
    <h1>Header-1</h1>
    <h1>Header-2</h1>
</body>
</html>
 

2) $(selector).css(name,function(index){});

// .선택자로 선택한 문서 객체에 개별적으로 스타일 속성을 적용하고 싶을 때
// 사용하는 방법
$(function(){
    var color=['red','green','blue'];
    $('h1').css('color',function(index){return color[index]});
});
 

3) $(selector).css(object);

$(function(){
    var color=['red','green','blue'];
    $('h1').css(
        {
        'color':function(index){return color[index]},
        'background':'yellow'
        }
    );
});
 

 

7. 문서 객체의 내부 검사

-기존 자바스크립트에서 문서 객체의 innerHTML 속성과 관련된 jQuery 메서드

1) html()

-문서 객체 내부의 글자와 관련된 모든 기능을 수행

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            var html=$('h1').html();
            var header1=document.createElement('h1');
            var textNode=document.createTextNode(html);
            header1.appendChild(textNode);
            document.body.appendChild(header1);
        });
    </script>
</head>
<body>
    <h1>Header-0</h1>
    <h1>Header-1</h1>
    <h1>Header-2</h1>
</body>
</html>
 

2) text()

-문서 객체 내부의 글자와 관련된 모든 기능을 수행

-선택자로 선택한 모든 문서 객체의 글자를 가져와 출력

$(function(){
    var text=$('h1').text();
    var header1=document.createElement('h1');
    var textNode=document.createTextNode(text);
    header1.appendChild(textNode);
    document.body.appendChild(header1);
});

 

8. 문서 객체의 내부 추가

 

-$(selector).html(value); : HTML 태그를 인식해 문자열 삽입

-$(selector).text(value); : HTML 태그를 인식하지 않음

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            $('.useHtml').html('<h1>$().html()</h1>');
        }); // 태그 인식
        $(function(){
            $('.useText').text('<h1>$().text()</h1>');
        }); // 태그 미인식
    </script>
</head>
<body>
    <div class="useHtml"></div>
    <div class="useHtml"></div>
    <div class="useHtml"></div>
    <div class="useText"></div>
    <div class="useText"></div>
    <div class="useText"></div>
</body>
</html>
 

 

-$(selector).html(function(index,html){});

-$(selector).text(function(index,html){});

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
        $('h2').html(function(index,html){
            return '#'+html+'#';
        }); 
// 익명함수의 매개변수로 사용이 되는 html 
// 또는 text는 현재 선택자태그가 갖고 있던 원래 내용임
        $('h3').text(function(index,text){
            return '#'+text+'#';
        });
        // 원래 내용에 #을 양옆에 붙여서 다시 원래 태그에 넣는 예
        }); 
    </script>
</head>
<body>
    <h2>Header-0</h2>
    <h2>Header-1</h2>
    <h2>Header-2</h2>
    <h3>Header-3</h3>
    <h3>Header-4</h3>
    <h3>Header-5</h3>
</body>
</html>
 

 

9. 문서 객체의 내부 제거

1) remove(): 특정 문서 객체를 제거

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            $('h1').first().remove();
        }); // h1 첫번째 태그 자체가 사라져서 안보이는 상태
    </script>
</head>
<body>
    <div style="border: 1px solid black; height:100px;">
        <h1>Header-0</h1>
        <h1>Header-1</h1>
    </div>
</body>
</html>
 

 

2) empty(): 특정 문서 객체의 후손을 모두 제거

$(function(){
    $('div').empty();
});
// div 태그 내의 모든 자식 구성요소를 제거 현재는 h1 태그들이 사라짐
// 자식 구성요소가 제거되어 div는 존재하지만
// 표시할 내용이 없어 안 나오는 것처럼 보이는 상태

 

10. 문서 객체의 생성

-document.createElement(), document.createTextNode() 얘네들은 자바스크립트에서 사용하던 문서 객체 생성함수

-제이쿼리에서 문서객체를 생성

-$(): 문서객체생성

-$() 함수의 매개변수에 HTML태그 자체를 문자열로 넣기만 하면 해당태그의 문서객체가 생성됨

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="script/jquery-3.6.0.js"></script>
    <script type="text/javascript">
// -생성한 문서 객체를 body 태그에 추가하는 방법
        $(function(){
            $('<h1></h1>').html('hello#1').appendTo('body');
        });
// -$() 메서드의 내부에 HTML 태그를 바로 넣어 body 태그에 추가하는 방법
        $(function(){
            $('<h1>hello#2</h1>').appendTo('body');
        });
// -텍스트 노드를 갖지 않는 문서 객체를 생성하는 법
        $(function(){
            $('<img/>').attr(
           {src:'images/Koala.jpg',width:'200'}).appendTo('body');
        });
        $(function(){
            $('<img/>').attr(
           'src','images/Penguins.jpg').appendTo('body');
        });
    </script>
</head>
</html>

 

11. 문서 객체의 삽입

-$(a).appendTo(b): a를 b의 뒷부분(자식요소)에 추가

-$(a).prependTo(b): a를 b의 앞부분(자식요소)에 추가

-$(a).insertAfter(b): a를 b의 뒷(형제요소)에 추가

-$(a).insertBefore(b): a를 b의 앞(형제요소)에 추가

-$(a).append(b): b를 a의 뒷 부분에 추가

-$(a).prepend(b): b를 a의 앞 부분에 추가

-$(a).after(b): b를 a의 뒤에 추가

-$(a).before(b): b를 a의 앞에 추가