✿∘˚˳°∘°

47일차 : 객체탐색 본문

국비수업/jQuery

47일차 : 객체탐색

_HYE_ 2023. 2. 2. 18:18

20230202

 

- JavaScript에서 파생

const li = document.querySelectorAll(".li");

li.forEach(function(item){

       item;

}); // 자바스크립트에서는 위처럼 이벤트를 for문으로 일일히 걸어줘야 한다.

$(".li").on("click") // jquery는 한줄로 가능

 

jQuery 연결 

- CND

- 파일다운로드

 

1. 기본개요

<!DOCTYPE html>
<html lang="ko">
<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>jQuery 기본개요</title>
    <!-- jQuery 연결 방법 -->
    <!-- 1. CND방식 : 인터넷으로 라이브러리를 연결
    <script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
    <!-- min.js와 .js의 차이 : .js는 들여쓰기가 되어있음 min.js는 한줄로 이어적혀있다(용량이 좀더 작다)-->
    <!-- 2. 다운로드 파일 사용 -->
    <!--jQuery를 연결하지 않을 경우 [ $ is not defined ]에러 발생 -->
    <script src="js/jquery-3.6.3.min.js"></script>
    <!-- 순서중요 jQuery라이브러리 이후-->
    <script>
        /*
            window.onload(){
                const p2 = document.querySelector("#p2");
                console.log(p2.innerText);
            }
        */
        /* 정식문법
        $(document).ready(function(){

       }); */
        $(function(){ //window.onload를 대체하는것
            const p2 = $("#p2");
            console.log(p2.text());
        });
    </script>
    <style>
        .test{
            width: 500px;
        }
        .test *{
            display: block;
            border: 2px solid lightgray;
            color: lightgray;
            padding: 5px;
            margin: 15px;
        }
    </style>
</head>
<body>
    <h1>jQuery 기본개요</h1>
    <hr>
    <h2>jQuery는 DOM객체를 CSS 선택자로 처리</h2>
    <h3>$("선택자")</h3>
    <h3>widow.onload=function(){}과 같은개념으로 $(document).ready(function(){})을 사용축약해서 $(function(){})</h3>
    <p id="p1" onclick="func1();">아이디로 처리(인라인방식)</p>
    <p class="p">클래스로 처리1</p>
    <p class="p">클래스로 처리2</p>
    <p id="p2">테스트용 p</p>

 

function func1(){
    //자바스크립트에서 id=p1 dom객체 선택하는 법
    // //방법1
    // const p1 = document.getElementById("p1");
    // //방법2 : es6
    // const p1 = document.querySelector("#p1");

    //jQuery에서 id=p1 dom객체 선택하는 방법
    //jQuery로 dom객체를 가지고오면 jQuery형 객체
    const p1 = $("#p1");
    console.log(p1);
    
    //console.log(p1.innerText);
    console.log(p1.text());
    //console.log(p1.innerHTML);
    //console.log(p1.html());
    //p1.innerText = "변경값";
    p1.text("변경값");

    //p1의 글씨색을 red로 변경
    //p1.style.color = "red";
    //p1.css("color", "red");
    //p1의 배경색을 yellow로 변경
    //p1.style.backgraundColor = "yellow";
    //p1.css("background-color", "yellow");

    //여러 css속성을 한번에 변경하는 경우(js)
    //p1.style.color = "red";
    //p1.style.backgroundColor = "yellow"

    //jQuery로 css속성을 한번에 변경하는 방법1
    // p1.css({
    //     "color" : "red",
    //     "background-color" : "yellow"
    // });

    //jQuery로 css속성을 한번에 변경하는 방법2
    p1.css("color", "red").css("background-color", "yellow");
    //css함수에 매개변수를 1개만 주는경우(속성이름) 해당 속성의 값을 가져옴
    console.log(p1.css("color")); //현재 color속성의 값을 가져옴
}


/*
//클래스로 처리 - js
const p = document.querySelectorAll(".p");
//기본로직
p[0].onclick = function(){
    console.log(this.innerText);
}
p[1].onclick = function(){
    console.log(this.innerText);
}

//for
for(let i=0; i<p.length; i++){
    p[i].onclick = function(){
        console.log(this.innerText);
    }
}


//forEach
p.forEach(function(item){
    item.onclick = function(){
        console.log(this.innerText);
    }
});
*/

//클래스로 처리 - jQuery
const p = $(".p"); //배열
p.click(function(){
    //p라는 class 모두에게 이벤트가 들어간다
    console.log("이벤트동작확인");
    //this를 바로사용하면 js의 객체이기 때문에 jQuery 함수들을 사용할 수 없음
    //$(this) jQuery형 객체로 변환해서 사용
    //선택자로 선택된 모든 dom객체에 한번에 이벤트를 적용하는 경우
    //함수 내부의 this는 이벤트를 발생시킨 해당 dom객체
    console.log($(this).text());
    //클래스1을 클릭하면(이벤트를 발생시키면) this는 클래스1
    //클래스2를 클릭하면(이벤트를 발생시키면) this는 클래스2

    //this를 이용한 index번호 구하는 방법
    const index = p.index(this);
    console.log(index);
});

 

2. 객체탐색

2 - 1 ) 선택된 요소 직접필터링

    <h2>객체 탐색</h2>
    <h3>선택자로 선택된 요소들 중 특정요소만 선택하기위해서 한번더 필터링하는 작업(2차필터링)</h3>
    <h3>1. 선택된 요소 중 직접필터링 : first, last, eq, filter, not</h3>
    <div class="filter">
        <p class="pp1">p-1</p>
        <p class="pp1">p-2</p>
        <p class="pp2">p-3</p>
        <p class="pp3">p-4</p>
    </div>
    <button onclick = "func2();">필터확인</button>
function func2(){
    const filter = $(".filter>p");
    console.log("선택될 엘리먼트 수 : "+filter.length);
    const first = filter.first(); //filter로 선택된 요소중 첫번째 요소
    console.log("first : "+first.text());
    const last = filter.last(); //filter로 선택된 요소중 마지막 요소
    console.log("last : "+last.text());
    const eq = filter.eq(2); //filter로 선택된 요소중 인덱스요소 
    //first() == eq(0);
    //last() == eq(length-1);
    console.log("eq : "+eq.text());

    //filter.filter("선택자") : filter로 선택된 요소 중 선택자에 해당하는 요소만 
    const filter2 = filter.filter(".pp1");
    for(let i=0; i<filter2.length; i++){
        console.log(filter2.eq(i).text());
    }
    //선택자로 가져오던, 탐색함수를 통해서 가지고오건
    //값을 적용하는것은 일괄적가능(css, text)
    //단, 값을 읽어오는것은 따로
    console.log(filter2.text()); //붙어서 하나의 문자열로 나옴 -> 관리가 힘들다
    console.log(filter2.eq(0).text()); //값을 읽어올 때는 이렇게 따로
    console.log(filter.eq(1).text());
    filter2.css("color", "red"); //값을 넣을 때는 한번에 해도 OK
}

2 - 2 ) 상위(부모)요소

parent() : 선택된요소의 바로위 상위요소

parents([인자]) 

:  매개변수가 있는 경우 - 선택된 요소의 모든 상위요소 중 매개변수로 전달한 선택자에 해당하는 요소만

   매개변수가 없는 경우 - 선택된 요소의 모든 상위요소

parentsUntil(인자) : 선택도니 요소부터 인자의 요소까지 범위에 포함되는 요소(단, 선택된요소와 인자요소는 제외)

parent - 선택요소가 span들 이므로 부모인 li/p가 잡힌다

 

매개변수가 있는경우 parents - 선택요소 : span / 매개변수 : div 이므로 상위요소 중 div만 선택됨
매개변수가 없는경우 parents  - span의 상위에있는건 모두 포함된다(body, html까지)
parentsUntil

    <h2>2. 선택된 요소들의 상위요소(부모요소)들을 선택할 수 있는 함수 : parent, parents, parentsUntil</h2>
    <div class="test ancestors">
        <div>
            div(great-grandparent)
            <ul>ul(grandparent)
                <li>li(direct-parent)
                    <span>span</span>
                </li>
            </ul>
        </div>
        <div>div(grandparent)
            <p>p(direct-parent)
                <span>span</span>
            </p>
        </div>
    </div>
    <button onclick="func3();">parent</button>
    <button onclick="func4();">parents</button>
    <button onclick="func5();">parentsUntil</button>
function func3(){
    //parent() : 선택된 요소의 바로위 상위요소
    /*
    const span= $(".ancestors span");
    span.css("border", "2px solid red");
    const parent = span.parent(); //바로상위요소를 가져옴 - 현재 li / p
    parent.css("border", "2px solid blue");
    */
   const select = $(".ancestors span").parent(); //.parent().parent()로 여러개작성도 해도된다
   select.css("border", "2px solid red");
}

function func4(){
    //parents([인자])
    //매개변수가 없는경우 : 선택된요소의 모든 상위요소
    //html, body도 포함
    //const select = $(".ancestors span").parents();
    //select.css("border", "2px solid red");

    //매개변수가 있는경우 : 선택된요소의 모든 상위요소 중 매개변수로 전달한 선택자에 행당되는 요소만
    const select = $(".ancestors span").parents("div");
    select.css("border", "2px solid red");
}

function func5(){
    //parentsUntil(인자) : 선택된 요소부터 인자의 요소까지 범위에 포함되는 요소
    //선택된요소와 인자요소는 제외
    const select = $(".ancestors span").parentsUntil("div"); //span과 div 사이에 있는 요소들 (span과 div는 제외된다)
    select.css("border", "2px solid red");
    //select.eq(0)은 span이 시작이기때문에 li가된다 
}

 

2 - 3 ) 하위(후손)요소

children([인자]) 

: 매개변수가 있는 경우 - 모든 직계자식 중 매개변수의 선택자에 해당하는 요소

  매개변수가 없는 경우 - 모든 직계자식

find(인자) : 직계자신뿐만이 아니라 후손요소 중 인자로 전달받은 선택자에 해당하는 요소

 

매개변수 있는 경우 - 직계자손 중 매개변수로 전달받은 child1만 선택된걸 확인할 수 있다(후손은 불가)

-- 후손인 span태그에도 child1클래스가 지정되어있지만 선택되지않음 

매개변수 없는 경우 - 모든 직계자식(.child1/.child2)이 선택된다
find - 자손 후손 둘다 class = child1을 선택한다

    <h2>3. 선택된 요소들의 하위요소(자손,후손)을 선택할 수 있는 함수 : children, find</h2>
    <div class="test descendants">div(current element)
        <p class="child1">p(child)
            <span class="child1">span(grandchild)</span>
        </p>
        <p class="child2">p(child)
            <span>span(grandchild)</span>
        </p>
    </div>
    <button onclick="func6()">children</button>
    <button onclick="func7()">find</button>
function func6(){
    //children([인자])
    //매개변수가 없는 경우 : 모든 직계자식
    //const select = $(".descendants").children();
    //select.css("border", "2px solid red");
    //매개변수가 있는 경우 : 모든 직계자식 중 매개변수의 선택자에 해당하는 요소만
    const select = $(".descendants").children(".child1");//자손(직계)만 가능 후손X
    select.css("border", "2px solid red");
}

function func7(){
    //find(인자) : 직계자식뿐만이 아니라 모든 후손요소 중 인자로 전달한 요소만
    const select = $(".descendants").find(".child1");
    select.css("border", "2px solid red");
}

2 - 4 ) 동위(형제)요소

siblings([인자])

: 매개변수 있는 경우 - 형제관계에 있는 모든 요소

: 매개변수 없는 경우 - 형제관계에 있는 모든 요소 중 매개변수로 전달받은 선택자에 해당하는 요소만

next() : 선택요소 바로 다음요소

nextAll([인자])

: 매개변수 있는 경우 - 선택요소의 형제중 선택요소 이후에 있는 태그 중 매개변수로 전달한 선택자에 해당하는태그

  매개변수 없는 경우 - 선택요소의 형제중 선택요소 이후에 있는 모든 태그

nextUntil(인자) : 선택요소부터 매개변수로 전달한 요소 사이의 모든 형제 요소(단, 기준이되는 태그제외)

 

prev() : 선택요소 바로 이전요소

prevAll([인자])

: 매개변수 있는 경우 - 선택요소의 형제중 선택요소 이전에 있는 태그 중 매개변수로 전달한 선택자에 해당하는태그

  매개변수 없는 경우 - 선택요소의 형제중 선택요소 이전에 있는 모든 태그

prevUntil(인자) :  선택요소부터 매개변수로 전달한 요소 사이의 모든 형제 요소(단, 기준이되는 태그제외)

siblings - 선택요소(h3) / 매개변수(p)
siblings - 선택요소(h3) / 매개변수 없음
next() - 선택요소(h3)
nextAll() - 선택요소(h3) / 매개변수(h5)
nextAll() - 선택요소(h3) / 매개변수 없음
nextUntil - 선택요소(h3) / 매개변수(p)
prev() - 선택요소(h3)
prevAll() - 선택요소(h3) / 매개변수(span)
prevAll() - 선택요소(h3) / 매개변수없음
prevUntil() - 선택요소(h3) / 매개변수(p)

    <h3>4. 선택된 요소들과 같은레벨(형제)를 선택할 수 있는 함수</h3>
    <h3> : siblings, next, nextAll, nextUntil, prev, prevAll, prevUntil</h3>
    <div class="test siblings">
        <div>div(parent)
            <p>p</p>
            <span>span</span>
            <h2>h2</h2>
            <h3>h3(current element)</h3>
            <h4>h4</h4>
            <h5>h5</h5>
            <h6>h6</h6>
            <p>p</p>
        </div>
    </div>
    <button onclick="func8();">siblings</button>
    <button onclick="func9();">next</button>
    <button onclick="func10();">nextAll</button>
    <button onclick="func11();">nextUntil</button>
    <button onclick="func12();">prev</button>
    <button onclick="func13();">prevAll</button>
    <button onclick="func14();">prevUntil</button>
function func8(){
    //siblings([인자])
    //매개변수 없는경우 : 형제관계에 있는 모든 요소
    //const select = $(".siblings h3").siblings();
    //매개변수 있는경우 : 형제관계에 있는 요소 중 매개변수 선택자에 해당하는 요소만
    const select = $(".siblings h3").siblings("p");
    select.css("border", "2px solid red");
}
//siblings는 방향이 상관없지만 나머지는 방향O

function func9(){
    //next() : 선택된 요소 바로 다음요소 (인자없음)
    const select = $(".siblings h3").next();
    select.css("border", "2px solid red");
}

function func10(){
    //nextAll([인자]) 
    //매개변수 없는경우 : 선택된요소의 형제중 선택된 요소 이후에 있는 모든태그
    //const select = $(".siblings h3").nextAll();
    //매개변수 있는 경우 : 선택된 요소의 형제 중 선택된 요소 이후에 있는 태그 중 매개변수로 전달한 선택자에 해당하는 태그만
    const select = $(".siblings h3").nextAll("h5"); //.next().next() -> h5
    select.css("border", "2px solid red");
}

function func11(){
    //nextUntil(인자) : 선택된요소 부터 매개변수로 전달한 요소 사이의 모든요소(동위중 이후에 있는 요소중)
    const select = $(".siblings h3").nextUntil("p");
    select.css("border", "2px solid red"); //현재태그(h3)부터 매개변수태그(p)까지 단,기준이되는 태그들은 빠짐
}

function func12(){
    //prev() : 선택된요소 바로 이전요소
    const select = $(".siblings h3").prev();
    select.css("border", "2px solid red");
}

function func13(){
    //prevAll([인자])
    //매개변수가 없는 경우 : 선택된 요소의 형제들 중 이전에 있는 모든요소
    //const select = $(".siblings h3").prevAll();
    //매개변수가 있는 경우 : 선택된 요소의 형제들 중 이전에 있는 요소 중 매개변수 선택자에 해당하는 요소만
    const select = $(".siblings h3").prevAll("span");

    select.css("border", "2px solid red");
}

function func14(){
    //prevUntil(인자) : 선택된 요소의 이전에 있는 형제들 중 선택된 요소와 매개변수 사이에 있는 요소들 모두
    const select = $(".siblings h3").prevUntil("p");
    select.css("border", "2px solid red");
}

- 객체탐색 실습

<!DOCTYPE html>
<html lang="ko">
<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 src="js/jquery-3.6.3.min.js"></script>
    <style>
        .test *{
            display: block;
            border: 2px solid lightgray;
            color : lightgray;
            padding: 3px;
            margin: 15px;
        }
    </style>    
</head>
<body>
    <h1>jQuery 기본 예제</h1>
    <hr>
    <h3>1. 문제1에 있는 3개의 엘리먼트에 id,class,name속성을 이용하여 각 엘리먼트 클릭 시 해당하는 엘리먼트의 내부 텍스트를 console을 이용하여 출력하여라.</h3>
    <fieldset>
        <legend>문제1</legend>
        <p id="text">text-1</p>
        <h3 class="text">text-2</h3>
        <p name="text">text-3</p>
    </fieldset>
	<button onclick="func1();">클릭</button>
	<button onclick="func2();">클릭</button>
	<button onclick="func3();">클릭</button>
    <hr>    
    <h3>2. 아래 체크박스를 체크한 후 버튼클릭 시 몇개가 체크되었는지 console을 이용하여 출력하여라.</h3>
    <fieldset>
        <legend>문제2</legend>
        <input type="checkbox" name="study" id="java"><label for="java">자바</label>
        <input type="checkbox" name="study" id="oracle"><label for="oracle">오라클</label>
        <input type="checkbox" name="study" id="html"><label for="html">HTML</label>
        <input type="checkbox" name="study" id="css"><label for="css">CSS</label>
        <input type="checkbox" name="study" id="javascript"><label for="javascript">Javascript</label>
        <input type="checkbox" name="study" id="jquery"><label for="jquery">jQuery</label>
    </fieldset>
    <button onclick="func4();">클릭</button>
    <hr>
    <h3>3. 각 버튼의 요구사항에 맞게 처리하시오.</h3>
    <div class="test">
        <div>
            <ul>
                <li>당근</li>
                <li>김치</li>
                <li>오이</li>
                <li>양배추</li>
                <li>파프리카</li>
            </ul>
            <p id="pp">
                <span id="pica">피카츄</span>
                <span>파이리</span>
                <span>꼬부기</span>
            </p>     
            <p>test</p>       
        </div>
    </div>
    <p>3-1. 버튼클릭 시 p태그(id=pp)를 기준으로하여 당근을 선택하여 테두리를 빨간색으로 변경<button onclick="exam1();">클릭</button></p>
    <p>3-2. 버튼클릭 시 ul태그를 기준으로하여 파이리를 선택하여 테두리를 빨간색으로 변경<button onclick="exam2();">클릭</button></p>
    <p>3-3. 버튼클릭 시 span태그(id=pica)를 기준으로하여 ul태그와 p태그를 감싸고있는 div태그의 테두리를 파란색으로 변경<button onclick="exam3();">클릭</button></p>
    <p>3-4. 버튼클릭 시 div태그(class=test)를 기준으로하여 당근,김치,오이,양배추,파프리카를 console에 출력<button onclick="exam4();">클릭</button></p>
<script src = "js/exam1.js"></script>
</body>
</html>

function func1(){
    const text1 = $("#text");
    console.log(text1.text());
}

function func2(){
    const text2 = $(".text");
    console.log(text2.text());
}

function func3(){
    const text3 = $("[name=text]");
    console.log(text3.text());
}

function func4(){
    /*js 방식
    const inputs = document.getElementsByName("study");
    let count = 0;
    for(let i=0; i<inputs.length; i++){
        if(inputs[i].checked){
            count++;
        }
    }
    */
    console.log(count);
    const select = $("[name=study]:checked");
    console.log(select.length);
}

function exam1(){
    const select = $("#pp").prev().children().first();
    //const pp = $("#pp").parent().children().first().children().first();
    //const pp = $("#pp").parent().find("li").first();
    select.css("border", "2px solid red");
}

function exam2(){
    // const select = $(".test ul").parent().find("span").eq(1);
    // cosnt select = $(".test ul").parent().find("#pica").next();
    const select = $("ul").next().children().eq(1);
    select.css("border", "2px solid red");
}

function exam3(){
    //const select = $("#pica").parent().parent();
    const select = $("#pica").parents("div").eq(0); //기준이 pica이므로 가까운부모가 eq(0)
    select.css("border", "2px solid blue");
}

function exam4(){
    const select = $(".test").find("li");
    //const select = $(".test").children().children().first().children();
    for(let i=0; i<select.length; i++){
        console.log(select.eq(i).text());
    }
}

[ 후기 ]

할때는 너무너무 쉽다고 생각했는데 막상 실습해보니까 너무어려웠다ㅎ 

Comments