부모를 기준으로 자식 요소의 색인을 가져옵니다.


160

이 마크 업이 있다고 가정 해 봅시다.

<ul id="wizard">
    <li>Step 1</li>
    <li>Step 2</li>
</ul>

그리고 나는이 jQuery를 가지고있다 :

$("#wizard li").click(function () {
    // alert index of li relative to ul parent
});

li클릭 할 때 부모와 관련된 자녀의 색인을 어떻게 얻을 수 li있습니까?

예를 들어, "1 단계"를 클릭하면 alert"0"과 함께 팝업이 나타납니다.

답변:


247
$("#wizard li").click(function () {
    console.log( $(this).index() );
});

그러나 각 목록 항목에 하나의 클릭 핸들러를 연결하는 대신 delegate다음과 같은 성능을 사용 하는 것이 좋습니다 (성능 현명) .

$("#wizard").delegate('li', 'click', function () {
    console.log( $(this).index() );
});

jQuery 1.7 이상에서는을 사용해야합니다 on. 아래 예제 #wizard는 델리게이트 이벤트처럼 작동 하는 이벤트를 요소에 바인딩합니다 .

$("#wizard").on("click", "li", function() {
    console.log( $(this).index() );
});

3
안녕하세요 redsquare .. jQuery로 연습하고 있습니다. delegate : D에 대해 n00b입니다. delegate가 요소에 직접 이벤트를 첨부하는 것보다 더 나은 이유는 무엇입니까?
stecb

1
@steweb-Hey-하나의 이벤트 핸들러가 잠재적으로 많은 이벤트 핸들러보다 훨씬 선호되기 때문입니다. 큰 목록이있는 경우 dom에 이벤트를 첨부하는 것은 비용이 많이들 수 있으므로 일반적으로 각 요소의 개별 핸들러 대신 위의 항목을 사용하려고합니다. 깊은 간다 일품이다 briancrescimanno.com/2008/05/19/... - 또한 '자바 스크립트 이벤트 위임'구글
redsquare

좋아, 그래서 이런 식으로 이벤트를 관리하는 것은 전형적인 'dom attachment'보다 가벼운 것입니다 :) ..thanks!
stecb

@steweb-jquery가 모든 li 요소의 초기 조회를 수행 할 필요가 없기 때문에 더 가볍습니다. 컨테이너를 조회하고 해당 레벨에서 클릭 한 오브젝트가 li인지 확인합니다.
redsquare

이 .index 방법은 매우 유용합니다. 정렬을 위해 jQuery Sortable을 사용하고 있지만 의미 순위 정보를 DOM에 저장합니다. .index ()를 사용하면 dom에서 순위를 실제로 깨끗하게 가져올 수 있습니다. 감사!
SimplGy

41

같은 :

$("ul#wizard li").click(function () {
  var index = $("ul#wizard li").index(this);
  alert("index is: " + index)
});

9
큰 추가-부모 선택기에 상대적으로 색인을 찾을 수 있습니다. +1
BasTaller 2018

1
실제로 질문에 대한 대답보다는 예제에 대한 가능한 해결책 인이 답변을 선호하십시오.
DarkMukke

8

예제를 살펴보십시오 .

$("#wizard li").click(function () {
    alert($(this).index()); // alert index of li relative to ul parent
});

4

원하지 않으면 jQuery와 같은 큰 라이브러리가 필요하지 않습니다. 내장 DOM 조작으로이를 달성하려면 li배열 에서 형제 의 모음을 가져 오고 클릭시 indexOf해당 배열에서 클릭 한 요소를 확인하십시오 .

const lis = [...document.querySelectorAll('#wizard > li')];
lis.forEach((li) => {
  li.addEventListener('click', () => {
    const index = lis.indexOf(li);
    console.log(index);
  });
});
<ul id="wizard">
    <li>Step 1</li>
    <li>Step 2</li>
</ul>

또는 이벤트 위임을 통해 :

const lis = [...document.querySelectorAll('#wizard li')];
document.querySelector('#wizard').addEventListener('click', ({ target }) => {
  // Make sure the clicked element is a <li> which is a child of wizard:
  if (!target.matches('#wizard > li')) return;
  
  const index = lis.indexOf(target);
  console.log(index);
});
<ul id="wizard">
    <li>Step 1</li>
    <li>Step 2</li>
</ul>

또는 자식 요소가 동적으로 변경 될 수있는 경우 (할 일 목록과 같이), li미리 클릭하지 않고 클릭 할 때마다 의 배열을 구성해야 합니다.

const wizard = document.querySelector('#wizard');
wizard.addEventListener('click', ({ target }) => {
  // Make sure the clicked element is a <li>
  if (!target.matches('li')) return;
  
  const lis = [...wizard.children];
  const index = lis.indexOf(target);
  console.log(index);
});
<ul id="wizard">
    <li>Step 1</li>
    <li>Step 2</li>
</ul>


$ (...). indexOf는 함수가 아닙니다
Kareem

2
내 답변의 코드 스 니펫이 해당 오류를 생성하지 않습니다. "코드 스 니펫 실행"을 눌러 작동합니다. 당신이 jQuery를 사용하는 것처럼 들리 겠지만, 내 대답은 이런 종류의 물건을 수행하는 방법을 보여주고있다 - 당신이 오류가 발생하는 경우 다른 코드를 사용 하지 않고 jQuery를
CertainPerformance

그럴 수 있지. 예, JQuery를 사용하고 있습니다. 감사합니다
Kareem

3

Delegate와 Live는 사용하기 쉽지만 더 이상 li : s를 동적으로 추가하지 않으면 일반적인 바인드 / 클릭으로 이벤트 지연을 사용할 수 있습니다. 일치하는 새로운 요소에 대해 DOM을 모니터링 할 필요가 없으므로이 방법을 사용하면 성능이 약간 향상됩니다. 실제 숫자는 없지만 의미가 있습니다. :)

$("#wizard").click(function (e) {
    var source = $(e.target);
    if(source.is("li")){
        // alert index of li relative to ul parent
        alert(source.index());
    }
});

jsFiddle에서 테스트 할 수 있습니다 : http://jsfiddle.net/jimmysv/4Sfdh/1/


1
이 'DOM을 모니터링 할 필요가 없습니다'라고 말할 때 무엇을 말하는 것입니까? jq delegate는 dom을 모니터하지 않습니다.
redsquare

@redsquare Delegate가 Live의보다 효율적인 변형이라는 인상을 받았습니다. 이것은에서입니다 api.jquery.com/delegate : "루트 요소의 특정 설정을 기반으로, 현재 또는 미래에 선택을, 일치하는 모든 요소에 대한 하나 개 이상의 이벤트에 핸들러를 연결합니다." 미래에 구속력을 모니터링해야합니까?
jimmystormig

아니요. 위 코드와 같이 컨테이너에서 위임을 사용합니다. 컨테이너에 새 li 요소를 삽입하면 컨테이너 클릭 이벤트가 계속 발생하고 모든 것이 여전히 작동합니다. 모니터링이 필요하지 않습니다.
redsquare

@redsquare 예, 맞습니다. 내 솔루션은 DOM 이로 드 된 후 새로운 요소가 추가 된 경우에도 작동합니다. Delegate는 Live를 내부적으로 사용하기 때문에 ( stackoverflow.com/questions/2954932/… 참조 ) 여전히 최적화되어 있지만 편리하지는 않습니다. 그러나 내가 말했듯이, 나는 숫자가 없습니다.
jimmystormig 2018

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.