下面的代码返回'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>

当前回答

通过使用这个,您可以获得文本,值和数据属性。

<select name="your_name" id="your_id" onchange="getSelectedDataAttribute(this)">
    <option value="1" data-id="123">One</option>
    <option value="2" data-id="234">Two</option>
</select>

function getSelectedDataAttribute(event) {
    var selected_text = event.options[event.selectedIndex].innerHTML;
    var selected_value = event.value;
    var data-id = event.options[event.selectedIndex].dataset.id);    
}

其他回答

通过使用这个,您可以获得文本,值和数据属性。

<select name="your_name" id="your_id" onchange="getSelectedDataAttribute(this)">
    <option value="1" data-id="123">One</option>
    <option value="2" data-id="234">Two</option>
</select>

function getSelectedDataAttribute(event) {
    var selected_text = event.options[event.selectedIndex].innerHTML;
    var selected_value = event.value;
    var data-id = event.options[event.selectedIndex].dataset.id);    
}

您需要找到所选的选项:

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

or

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

尽管第一种方法更可取。

试试下面的方法:

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

您的更改订阅者订阅了选择的更改事件,因此this参数是选择元素。您需要找到要从中获取数据id的选定子节点。

$('#foo option:selected').data('id');
 alert($(this).first().data('id'));