1

这是我的代码:

$selects = $('select');
$selects.val( $selects.prop('defaultSelected'));

它应该重置我所有选择元素的值,但它不能仅与我在 IE9 中的一个元素一起正常工作。它们之间的唯一区别是这个我硬编码在一个 html 文件中,其余部分是用主干渲染的(虽然结构相同!)。标记:

<label>
    <span class="heading">Heading</span>
    <select name="someStatus">
        <option value="Val1" selected="selected">Val2</option>
        <option value="Val2">Val2</option>
        <option value="Val3" >Val3</option>
    </select>
</label>

我模仿了大写和小写,所以如果这会影响,你也可以考虑一下。:)

那么,谁能找到我明显缺少的东西?

4

3 回答 3

4

您的代码实际上并没有按照您的想法执行。

它试图设置为仅第一个.val()的属性。此外,s 没有这样的性质。如果它们是默认的 selected ,则仅适用于s (不是s ) 。defaultSelectedselectselectdefaultSelectedoptionselectoption

以下方法使用.val(), 作为您的代码(此处为演示 jsFiddle):

$selects.val(function () {
    return $(this).find('option').filter(function () {
        return $(this).prop('defaultSelected');
    }).val();
});

如果您更愿意使用.prop()或者如果您有<select multiple>,您应该使用:

$selects.find('option').prop('selected', function () {
    return $(this).prop('defaultSelected');
});

在此处查看演示。

注意:请记住defaultSelected 可以通过编程方式更改,因此请确保您知道代码的边界。

于 2013-11-12T15:26:08.547 回答
2

您的代码不太正确。当您调用 时.val(),它会将您传入的单个值应用于所有元素。你可能想要:

$selects.val(function() { return $(this).prop('defaultSelected'); });

<select>在您的代码中,您获取了集合中第一个元素的“defaultSelected”属性。该属性值被用于设置所有元素,因此那些没有具有该值的选项的<select>元素不会受到影响。通过传递一个函数,您是在告诉 jQuery 询问列表中的每个值使用什么值。上面的函数只是依次获取每个元素的“defaultSelected”属性。

编辑——另外,正如@Bergi 在评论中指出的那样,“defaultSelected”属性在<option>元素上,而不是<select>元素上,所以你必须找到正确的:

$selects.val(function() {
  return $(this).find('option[selected]').val() || undefined;
});
于 2013-11-12T15:22:07.393 回答
1

.defaultSelected是(就像.selected)每个<option>元素的属性,而不是<select>!因此,您的代码会将值设置为undefined.

你想要的是

$selects.find("option").prop("selected", function() {
    return this.defaultSelected;
});
于 2013-11-12T15:28:29.807 回答