선택 변경시 데이터 속성 값 가져 오기


273

다음 코드는 'undefined'를 반환합니다.

$('select').change(function(){
    alert($(this).data('id'));
});

<select>
    <option data-id="1">one</option>
    <option data-id="2">two</option>
    <option data-id="3">three</option>
</select>

$ (this) .find ( ': selected') 또는 $ (this) .children ( 'option : selected')을 사용하는 것이 더 낫습니까?
userBG

2
이 질문을보십시오 : stackoverflow.com/questions/648004/…
Jordan Brown

답변:


640

선택한 옵션을 찾아야합니다.

$(this).find(':selected').data('id')

또는

$(this).find(':selected').attr('data-id')

첫 번째 방법이 바람직하지만.


내 초기 게시물에서 실수로 attr ()을 사용했는데 data ()를 의미했지만 'undefined'를 반환합니다.
userBG

6
방금이 문제를 겪었고 성능상의 이유 또는 다른 이유로 첫 번째 방법이 선호되는지 궁금합니다. @JordanBrown
Clarkey

1
@Clarkey 내 생각에 attr ()은 속성 유형을 파악하기 위해 추가 작업을 수행해야하기 때문에 data ()가 attr ()보다 빠릅니다. 그냥 추측.
dev_willis

37

다음을 시도하십시오 :

$('select').change(function(){
  alert($(this).children('option:selected').data('id'));
});

변경 가입자는 select의 change 이벤트를 구독하므로 this매개 변수는 select 요소입니다. data-id를 가져 오려면 선택한 자식을 찾아야합니다.


2016 년 현재 나무 깊이가 2 인이 같은 경우 find()보다 훨씬 빠릅니다 children().
Hafenkranich

9
document.querySelector('select').onchange = function(){   
   alert(this.selectedOptions[0].getAttribute('data-attr')); 
};

모든 사람들이 주어진 언어의 구문 / 동작 / 성능에 익숙하지는 않기 때문에 StackOverflow에 대한 설명 및 / 또는 참조 (솔루션이 단순하거나 "자명 한 설명"이더라도)를 사용하여 게시 된 코드 블록을 지원하도록 항상 노력하십시오.
mickmackusa

7

바닐라 자바 ​​스크립트 :

this.querySelector(':checked').getAttribute('data-id')

모든 사람들이 주어진 언어의 구문 / 동작 / 성능에 익숙하지는 않기 때문에 StackOverflow에 대한 설명 및 / 또는 참조 (솔루션이 단순하거나 "자명 한 설명"이더라도)를 사용하여 게시 된 코드 블록을 지원하도록 항상 노력하십시오.
mickmackusa

5

당신은 사용할 수 있습니다 context와 구문을 this하거나 $(this). 이것은와 같은 효과 find()입니다.

$('select').change(function() {
    console.log('Clicked option value => ' + $(this).val());
    <!-- undefined console.log('$(this) without explicit :select => ' + $(this).data('id')); -->
    <!-- error console.log('this without explicit :select => ' + this.data('id')); -->
    console.log(':select & $(this) =>    ' + $(':selected', $(this)).data('id'));
    console.log(':select & this =>       ' + $(':selected', this).data('id'));
    console.log('option:select & this => ' + $('option:selected', this).data('id'));
    console.log('$(this) & find =>       ' + $(this).find(':selected').data('id'));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
    <option data-id="1">one</option>
    <option data-id="2">two</option>
    <option data-id="3">three</option>
</select>

미세 최적화의 문제로을 선택할 수 있습니다 find(). 코드 골퍼가 더 많으면 컨텍스트 구문이 더 간단합니다. 기본적으로 코딩 스타일이 적용됩니다.

관련 성능 비교 는 다음과 같습니다 .


2
$('#foo option:selected').data('id');

1
모든 사람들이 주어진 언어의 구문 / 동작 / 성능에 익숙하지는 않기 때문에 StackOverflow에 대한 설명 및 / 또는 참조 (솔루션이 단순하거나 "자명 한 설명"이더라도)를 사용하여 게시 된 코드 블록을 지원하도록 항상 노력하십시오.
mickmackusa

OP에는 idselect 요소에 대한 속성이 없으며의 유틸리티로 인해 속성이 필요하지 않습니다 this.
mickmackusa

1

이것은 나를 위해 작동

<select class="form-control" id="foo">
    <option value="first" data-id="1">first</option>
    <option value="second" data-id="2">second</option>
</select>

그리고 스크립트

$('#foo').on("change",function(){
    var dataid = $("#foo option:selected").attr('data-id');
    alert(dataid)
});

1
모든 사람들이 주어진 언어의 구문 / 동작 / 성능에 익숙하지는 않기 때문에 StackOverflow에 대한 설명 및 / 또는 참조 (솔루션이 단순하거나 "자명 한 설명"이더라도)를 사용하여 게시 된 코드 블록을 지원하도록 항상 노력하십시오.
mickmackusa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.