選択変更時に、データ属性値を取得します


273

次のコードは「未定義」を返します...

$('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/...
ヨルダンブラウン

回答:


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'));
});

変更サブスクライバーは選択の変更イベントをサブスクライブするため、thisパラメーターは選択要素です。data-idを取得するには、選択した子を見つける必要があります。


2016年の時点ではfind()はるかに高速よりchildren()も、我々は唯一の2のツリーの深さを持っている。このようなケースで
Hafenkranich

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

誰もが特定の言語の構文/動作/パフォーマンスに精通しているわけではないため、StackOverflowの説明や参照(またはソリューションが単純/「自明」であっても)で投稿されたコードブロックをサポートするように常に努めてください。
mickmackusa

7

バニラJavascript:

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にはid、select要素の属性がありません(およびのユーティリティのため、属性は必要ありません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.