Chapter 03. 노드 다루기 - 노드 찾기.


Lesson 02. 찾은 노드 다루기


- 핵심 01 : 찾은 노드의 개수 구하기

- 핵심 02 : 찾은 노드 중 n번째 노드 접근하기

- 핵심 03 : 자바스크립트 DOM 객체 접근하기

- 핵심 04 : 순차적으로 찾은 노드 접근하기

- 핵심 05 : 찾은 노드 중에서 특정 노드만 찾기

- 핵심 06 : 찾은 노드의 자손 노드 중 특정 노드만 찾기

- 핵심 07 : 인덱스 값 구하기


- 핵심 01 : 찾은 노드의 개수 구하기



사용법 : $대상.length

length 프로퍼티를 이용하면 jQuery 객체 내부에 들어 있는 노드 개수를 구할 수 있습니다.


예제 01. 문서에서 div 태그 노드가 몇 개 인지 출력해 주세요.

1
2
3
4
$(document).ready(function()
{
    alert("length = "+$("div").length); // alert는 화면에 출력
});
cs


- 핵심 02 : 찾은 노드 중 n번째 노드 접근하기


사용법 : $대상.eq(index)
eq() 메서드를 이용하면 찾은 노드의 n번째에 해당하는 노드에 접근할 수 있습니다.

예제 02. ul.menu의 메뉴 노드(li) 중 두 번째 메뉴 노드의 border 속성을 "4px solid #00"으로 변경해 주세요.
1
2
3
4
5
6
7
8
$(document).ready(function()
{
    var $liList = $("ul.menu li");
    var $li_1 = $liList.eq(1); // 배열로 생각하기. 2번째 메뉴의 노드. eq(0)는 1번째 메뉴의 노드
    $li_1.css("border", "4px solid #f00");
    // 한 줄로는
     $("ul.menu li").eq(1).css("border", "4px solid #f00");
});
cs


- 핵심 03 : 자바스크립트 DOM 객체 접근하기


사용법 : $대상.get(index)


* 원하는 기능을 모두 jQuery가 가지고 있지 않을뿐더러, 

jQuery에서 지원하지 않는 기능은 이 기능을 갖고 있는 자바스크립트 DOM에 직접 접근해 사용해야 할때도 종종 있습니다.

이때 사용하는 메서드가 바로 get() 입니다.


예제 03. 풀이 전 코드의 $liList 변수에 들어있는 jQuery 객체 내부의 HTMLLiElement DOM 객체 중 두 번째에 접근해서

DOM 객체의 기능을 사용해 border를 "4px solid #f00"으로 변경하세요.

1
2
3
4
5
6
7
8
9
10
$(document).ready(function()
{
    var $liList = $("ul.menu li");
 
    var li_1 = $liList.get(1); // jQuery 객체가 아니기 때문에 li_1 앞에 $를 붙이지 않는다.
    // []를 이용하는 방법
    var li_1 = $liLIst[1];
    li_1.style.border = "4px solid #f00";
});
 
cs

- 핵심 04 : 순차적으로 찾은 노드 접근하기


사용법 : 

1
2
3
4
5
$대상.each(function(index)
{
    var $target = $(this);
    또는 var $target = $대상.eq(index);
}
cs

each() 메서드를 사용하면 $대상에 들어있는 노드를 좀더 쉽게 순차적으로 접근할 수 있습니다.

예제 04. each() 메서드의 index 값 확인하기
1
2
3
4
5
6
7
8
9
$(document).ready(function()
{
    var $liList = $("ul.menu li");
    $liList.each(function(index) //
    {
        console.log("index = "+index);
    })
});
 
cs

실행결과
index = 0
index = 1
index = 2
index = 3

노드 개수만큼 //의 내용이 실행되는 것을 알 수 있습니다.
index 값은 each() 메서드가 매개변수 값으로 넘겨받은 함수를 호출할 때 
0부터 $결과.length-1까지의 값을 순차적으로 만들어 넘겨주는 값입니다
index 값은 주로 n번째 노드에 접근할 때 사용합니다.

* $(this)의 의미


1
2
3
4
5
$대상.each(function(index)
{
    var $target = $(this);
    또는 var $target = $대상.eq(index);
}
cs


this는 $ 대상에 들어있는 index 번째에 해당하는 자바스크립트 DOM를 의미합니다.

예제 05. each() 메서드에서 this 값 확인하기
1
2
3
4
5
6
7
$(document).ready(function()
{
    $("ul.menu li").each(function(index)
    {
        concole.log(this);
    });
});
cs

$(this)가 실행되면 이 DOM 객체를 포장하고 있는 새로운 jQuery 객체가 생성됩니다.

예제 06. 메뉴 노트(ul.menu li)의 border 속성을 다음 표와 같이 2배수로 점점 두껍게 만들어 주세요.



풀이 01 : $(this)를 사용한 경우
1
2
3
4
5
6
7
8
9
$(document).ready(function()
{
    var $liList = $("ul.menu li");
    $liList.each(function(index)
    {
        var bordperpx = (index+1)*2;
        $(this).css("border", borderpx+"px solid #f00");
    })
});
cs

자바스크립트 DOM에는 css()라는 기능이 없기 때문에 $() 함수를 이용해서 
일반 자바스크립트 DOM 객체를 감싼 jQuery의 인스턴스로 만들어 css() 메서드를 사용하는 것입니다.
일종의 형변환이라고 생각해도 좋습니다.

jQuery를 사용하지 않고, 자바스크립트 DOM 기능을 이용하는 방법.

1
2
3
4
5
6
7
8
$(document).ready(function()
{
    $("ul.menu li").each(function(index)
    {
        var bordperpx = (index+1)*2;
        this.style.border = borderpx+"px solid #f00";
    })
});
cs


풀이 02 : eq() 메서드를 사용한 경우
1
2
3
4
5
6
7
8
9
$(document).ready(function()
{
    var $liList = $("ul.menu li");
    $liList.each(function(index)
    {
        var bordperpx = (index+1)*2;
        $liList.eq(index).css("border", borderpx+"px solid #f00");
    })
});
cs


- 핵심 05 : 찾은 노드 중에서 특정 노드만 찾기

사용법 : $대상.fliter("선택자")

찾은 노드 중에서 특정 노드만을 걸러(fliter)내고 싶을 때 fliter() 메서드를 사용합니다.
filter() 메서드가 찾는 대상은 오직 현재 찾은 노드이며, 
현재 찾은 노드의 자식 또는 자손 그리고 부모 노드는 모두 관련이 없습니다.

예제 07. 풀이 전 코드에서 $liList 변수로 들어 있는 메뉴 항목 중 select 클래스가 적용된 노드를 찾아 border를 "4px solid #f00"으로 변경하세요.
1
2
3
4
5
$(document).ready(function()
{
    var $liList = $("ul.menu li");
    $liList.fliter(".select").css("border", "4px solid #f00");
});
cs

- 핵심 06 : 찾은 노드의 자손 노드 중 특정 노드만 찾기

사용법 : $대상.find("선택자")


찾은 노드의 자식(자손포함) 노드 중에서 특정 노드를 찾고 싶을때 find() 메서드를 사용합니다.

주의해야 할 점은 

find() 메서드는 현재 노드가 아닌 현재 노드의 자식을 포함한 자손 노드를 검색한다는 것 입니다.

오직 바로 아래 자식 노드에서 특정 노드를 찾고 싶은 경우는 children() 메서드를 사용합니다.


* filter() 메서드와 find() 메서드 차이점

filter() 메서드는 현재 노드 중에서 특정 노드를 걸러내고(filter) 싶을 때 사용. 검색 대상에서는 자식 및 자손노드는 제외

find() 메서드는 현재 노드의 자손 노드 중에서 특정 노드를 찾고(find) 싶을 때 사용. 검색 대상에서 현재 노드는 제외


예제 08. 아래에 등장하는 풀이 전 코드를 보면 $content에는 #content 노드를 감싸고 있는 jQuery 객체가 있습니다.

이 객체를 사용해 #content 노드의 자손(자식 포함) 노드 중 test1 클래스가 적용된 노드를 찾아 border를 "4px solid #f00"으로 변경하세요.


1
2
3
4
5
$(document).ready(function()
{
    var $content = $("#content");
    $content.find(".test1").css("border","4px solid #f00");
});
cs

- 핵심 07 : 인덱스 값 구하기

사용법 : 

$대상.index()

$목록.index($대상)

$목록.index(대상DOM)


index() 메서드를 이용하면 노드가 위치한 인덱스 값을 알 수 있습니다.


예제 09. 풀이 전 코드를 보면 메뉴 항목(ul.menu li)에 클릭 이벤트를 등록해 놓은 상태입니다.

클릭한 노드가 몇 번째 노드인지 index 값을 출력해 주세요.


1
2
3
4
5
6
7
$(document).ready(function()
{
    $("ul.menu li").click(function()
    {
        alert($(this).index());
    })
});
cs



* index()를 사용할때 주의해야 할 사항.

<a> 태그가 <li> 태그에 하나씩 있는 경우, 

즉 연속해서 태그가 있지 않은 경우 jQuery객체.index() 메서드를 호출하면 인덱스 값이 항상 0이 나오게 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<body>
    <ul>
        <li><a href="#">menu1</a></li>
        <li><a href="#">menu2</a></li>
        <li><a href="#">menu3</a></li>
        <li><a href="#">menu4</a></li>
    </ul>
</body>
$(document).ready(function() 
{
    $("ul  li a").click(function()
    {
        console.log("index = "+$(this).index());
    })
});
cs


이럴때는 다음과 같이 알아내야함.

$대상.index($대상);

$대상.index(대상DOM);


1
2
3
4
5
6
7
8
9
$(document).ready(function() 
{
    var $aList = $("ul li a");    
    $aList.click(function()
    {
        alert("index ="+$aList.index(this)) // alert("index ="+$aList.index($(this)))
    })
});
 
cs




Posted by 너래쟁이
: