"this"의 jQuery 첫 번째 자식


317

클릭 한 범위에서 jQuery 함수로 "this"를 전달한 다음 클릭 한 요소의 첫 번째 자식에서 jQuery를 실행할 수 있습니다. 제대로 이해하지 못하는 것 같습니다 ...

<p onclick="toggleSection($(this));"><span class="redClass"></span></p>

자바 스크립트 :

function toggleSection(element) {
  element.toggleClass("redClass");
}

: first-child of element를 어떻게 참조합니까?


4
jQuery를 사용하는 경우 jQuery를 사용하여 이벤트 핸들러를 바인딩하지 않는 이유는 무엇입니까?
Vivin Paliath

2
바인드 이벤트 핸들러는 성능 저하를 추가하는 document.ready ()에서 초기화되어야하기 때문에 (IE6 용 앱). 아니면 다른 방법이 있습니까?
macca1

흠 .. 확실하지 않습니다. jQuery를 사용하여 바인딩하는 것이 표준 방법입니다 (이미 jQuery를 사용중인 경우). 사용할 때 어떤 종류의 성능 저하가 발생 jQuery(document).ready(...)합니까?
Vivin Paliath

개발자가 7 명 이상인 대규모 응용 프로그램입니다. 내가 조금 정리하려고하기 전에 원래 4 + 초였습니다. 그래서 내가 필요하지 않을 때 더 추가하는 것을 피하고 싶습니다 :)
macca1

답변:


482

기존 jQuery 세트가 제공하는 컨텍스트에 선택기를 적용하려면 find () 함수를 시도하십시오 .

element.find(">:first-child").toggleClass("redClass");

Jørn Schou-Rode는 아마도 컨텍스트 요소 의 첫 번째 직계 자손 만을 찾고자 하므로 하위 선택기 (>)를 원한다고 언급했습니다 . 그는 또한 당신이 find ()와 매우 유사한 children () 함수 를 사용할 수 있지만 계층 구조에서 한 수준 깊게 만 검색합니다 (필요한 전부입니다).

element.children(":first").toggleClass("redClass");

1
감사! 완벽하게 작동합니다. 아래에 나열된 다른 방법도 효과가 있다고 생각합니다.
macca1

6
나는 find()모든 자손을 검색하고 :first-child부모 당 하나의 요소와 일치 할 수 있다고 생각 합니다. 따라서이 쿼리는 여러 요소를 반환 할 수 있습니다. 아니면 내가 착각합니까?
Jørn Schou-Rode

19
나는 이것이 오래된 질문 / 답변이라는 것을 알고 있지만 jQuery 1.8에서 부모가없는 ">"선택기의 사용은 감가 상각됩니다 (예 : "> : firstchild"). 내가 대신 사용하는 것이 좋습니다 element.children(":first-child")또는element.children().first();
케빈 B를

3
@KevinB 분명히 그들은 결국 그것을 더 이상 사용하지 않기로 결정
알니 타크

1
가장 좋은 방법은 모든 항목을 반복하지 않고 여기에서 제안한 것처럼 첫 번째 항목을 선택하는 것입니다. 이것은 나쁜 것입니다.
vsync


51

jsperf 테스트를 추가 하여 첫 번째 자녀 (총 1000 명 이상의 자녀)를 얻는 다른 접근법의 속도 차이를 확인했습니다.

주어진, notif = $('#foo')

jQuery 방법 :

  1. $(":first-child", notif) -4,304 ops / sec-가장 빠름
  2. notif.children(":first") -653 ops / sec-85 % 느림
  3. notif.children()[0] -1,416 ops / sec-67 % 느림

기본 방법 :

  1. 자바 스크립트 '기본 ele.firstChild- 4934323 OPS / 초 (위의 모든 접근 방식에 비해 100 % 느립니다 firstChild)
  2. jQery에서 기본 DOM의 ELE : notif[0].firstChild- 4913658 개 작전 / 초

따라서 첫 번째 jQuery 접근 방식은 적어도 첫 번째 자식에게는 권장되지 않습니다 (다른 많은 경우도 마찬가지입니다). jQuery 객체가 있고 첫 번째 자식을 가져와야하는 경우 배열 참조 (권장)를 사용하여 jQuery 객체에서 기본 DOM 요소가져 오거나 를 사용하십시오 . 이는 일반적인 JavaScript 사용법과 동일한 결과를 제공합니다.[0] .get(0)ele.firstChild

모든 테스트는 Chrome Canary 빌드 v15.0.854.0에서 수행됩니다.


20
실제로 firstChildjQuery children()또는 선택기 쿼리 와 동일한 결과를 제공하지 않습니다 . firstChild거의 원하지 않는 텍스트 노드를 포함합니다. jQuery의 contents()기능 에는 그것들 포함되지만 포함 children()되지는 않습니다. 최신 브라우저 firstElementChild는 첫 번째 자식 요소를 제공하지만 IE <9는 지원하지 않습니다. 따라서 사용하는 경우 firstChild첫 번째 비 텍스트 노드 자식을 수동으로 찾아야합니다.
최대

1
$(":first-child", notif)$(":first", notif)예상되는 행동 이어야합니다 . 전자는 모든 첫 번째 하위 요소 후손을 반환합니다.
Drazen Bjelovuk

18
element.children().first();

모든 아이들을 찾아서 먼저 얻으십시오.


1
훨씬 간단한 방법이며보다 효율적 .children(':first')입니다.
Gras Double

3
어떻게 더 효율적입니까? 그것은 모든 자녀를 얻는 다음 첫 번째 자녀를 얻는 것보다 첫 번째 자녀를 얻는 것 같습니다.
Anthony McGrath

9

당신이 시도 했습니까

$(":first-child", element).toggleClass("redClass");

요소를 검색의 컨텍스트로 설정하고 싶다고 생각합니다. 다른 jQuery 전문가가 여기에 뛰어 들어 너를 버릴 수있는 더 좋은 방법이있을 수 있습니다 :)


3
element
손자

4

방금 .firstElementChild가능한 경우 사용하는 플러그인을 작성했으며 필요한 경우 각 개별 노드를 반복 하는 플러그인으로 넘어갔습니다.

(function ($) {
    var useElementChild = ('firstElementChild' in document.createElement('div'));

    $.fn.firstChild = function () {
        return this.map(function() {
            if (useElementChild) {
                return this.firstElementChild;
            } else {
                var node = this.firstChild;
                while (node) {
                    if (node.type === 1) {
                        break;
                    }
                    node = node.nextSibling;
                }
                return node;
            }
        });
    };
})(jQuery);

순수한 DOM 솔루션만큼 빠르지는 않지만 Chrome 24의 jsperf 테스트 에서는 다른 jQuery 선택기 기반 방법보다 몇 배 빠릅니다.


1
나는이 플러그인을 좋아하지만 두 가지 문제가 있습니다 : 1) document.body아직 초기화되지 않았기 때문에 플러그인 스크립트를 헤드에 포함시킬 수 없습니다 . 소수의 어린이 (예 : 10 세 미만)의 $('>:first-child',context)경우 조금 더 빠릅니다. 어린이의 수만 성능에 영향을 미치며 깊이에는 영향을 미치지 않습니다.
codefactor

@codefactor 좋은 점 document.body-그 점을 살펴 보겠습니다.
Alnitak

4

당신은 DOM을 사용할 수 있습니다

$(this).children().first()
// is equivalent to
$(this.firstChild)


1

"myp"와 같이 p를 태그하기 위해 클래스 이름을 지정하십시오.

다음 코드를 사용하십시오.

$(document).ready(function() {
    $(".myp").click(function() {
        $(this).children(":first").toggleClass("classname"); // this will access the span.
    })
})

-3

즉시 첫 아이를 원한다면

    $(element).first();

요소에서 DOM의 특정 첫 번째 요소를 원하면 아래에서 사용하십시오.

    var spanElement = $(elementId).find(".redClass :first");
    $(spanElement).addClass("yourClassHere");

시도 : http://jsfiddle.net/vgGbc/2/


11
이것은 단지 잘못 - 경우 elementDOM 노드가 다음입니다 $(element).first()동등하다 $(element),하지의 첫 번째 자식.
Alnitak

1
요소는 DOM 노드 $ (요소) 좁은 방 () 해당하는 $ (요소)이다 knockoutJS 바인딩이 발생 나 문제가있는 경우, 합의
drgn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.