在jQuery中取消选择<select>的最佳方法?


219
<select size="2">
<option selected="selected">Input your option</option>
<option>Input your option</option>
</select>

使用jQuery优雅地取消选择该选项的最佳方法是什么?

Answers:


347

使用removeAttr ...

$("option:selected").removeAttr("selected");

道具

$("option:selected").prop("selected", false)

3
在IE 8下无法正常工作。请参见stackoverflow.com/questions/7960773/…–
克林顿·皮尔斯

60
这个答案不是做事情的方法(并且不能普遍启动)。正确的方法是- .val([]).prop("selected", false)向下滚动。
2012年

1
JQuery必须已解决此问题,它对我来说使用JQuery 1.7.2在IE8中是完美的。
Mikey G

2
或.val([''])选择空值(如果有)。
Mark

2
$("option:selected").prop("selected", false)有时不起作用。(不适用于带有jquery
v1.4.2的

163

这里有很多答案,但是不幸的是,所有答案都已经很老了,因此只能依靠attr/ removeAttr,这确实不是解决之道。

@coffeeyesplease正确提到要使用一个好的跨浏览器解决方案

$("select").val([]);

另一个好的跨浏览器解决方案是

// Note the use of .prop instead of .attr
$("select option").prop("selected", false);

您可以在此处看到它进行了自检。在IE 7/8/9,FF 11,Chrome 19上进行了测试。


1
比选择答案要好得多((可以跨浏览器工作,并且不涉及属性集的混乱)
Timothy Groote

1
取消选择所有选项的完美答案。但是它实际上不能用于取消选择特定选项,而removeAttr可以。
Mikey G

2
@MikeyG:指出,Array.indexOf需要为IE <9填充工具(或者可以使用任何等同的方法,许多JS库提供)。
乔恩

1
之后,您是否检查过HTML $('#select').val([]);?不幸的是,这不会删除selected="selected"属性。这可能最终会发布错误的数据。我不推荐这种方法!
Fr0zenFyr 2015年

1
@ Fr0zenFyr:如果从预选选项开始,然后单击鼠标手动取消选择,则也不会删除该属性,但是当然可以保证提交表单能够正确发布数据。HTML 属性(确定初始状态)和DOM 属性(确定什么显示以及提交什么)之间存在很大的差异。实际上,这就是专注于属性的解决方案不正确的原因。该属性确定该属性的初始值,但已尽其所能。
2015年

24

从问到已经有一段时间了,我还没有在较旧的浏览器上进行过测试,但是在我看来,更简单的答案是

$("#selectID").val([]);

.val()也可用于选择http://api.jquery.com/val/


这是最好的方法,实际上可以清除大多数浏览器的价值-谢谢。
Sagive SEO 2012年

这仅适用于多选。 $("select option").prop("selected", false);普遍适用(适用于多选和单选)。
溅出

23

最简单的方法

$('select').val('')

我只是在选择本身上使用了它,就成功了。

我在jQuery 1.7.1上


1
我只是面对有关此解决方案的一个问题。选项标签仍将具有“已选择”属性
塔玛拉

@Tamara真的吗?我没有检查。您是否正在使用“选择的”东西,这会给您带来麻烦?
Joshua Pinter

19

到目前为止,答案仅适用于IE6 / 7中的多项选择。对于更常见的非多重选择,您需要使用:

$("#selectID").attr('selectedIndex', '-1');

在flyfishr64链接的帖子中对此进行了解释。如果您看一下,您将看到有2种情况-多重/非多重。没有什么可以阻止您同时寻求两者的完整解决方案:

$("#selectID").attr('selectedIndex', '-1').find("option:selected").removeAttr("selected");

7

哦,jquery。

由于还存在本机javascript方法,我觉得有必要提供一种方法。

var select = document.querySelector('select'); //hopefully you'll use a better selector query
select.selectedIndex = 0; // or -1, 0 sets it to first option, -1 selects no options

只是向您展示这有多快:基准


感谢没有jQuery的答案!:)
Saromase

6
$("#selectID option:selected").each(function(){
  $(this).removeAttr("selected");
});

这将遍历每个项目,并且仅取消选择已选中的项目


5

一个快速的Google发现了这篇文章,描述了如何针对IE中的单个和多个选择列表执行所需的操作。该解决方案似乎也很优雅:

$('#clickme').click(function() {
        $('#selectmenu option').attr('selected', false);

}); 



3

非常感谢您的解决方案。

单选组合列表的解决方案运行完美。我在许多网站上搜索后发现了这一点。

$("#selectID").attr('selectedIndex', '-1').children("option:selected").removeAttr("selected");


2

另一个简单的方法:

$("#selectedID")[0].selectedIndex = -1


1

通常,当我使用选择菜单时,每个选项都有一个与之关联的值。例如

<select id="nfl">
  <option value="Bears Still...">Chicago Bears</option>
  <option selected="selected" value="Go Pack">Green Bay Packers</option>
</select>
console.log($('#nfl').val()) logs "Go Pack" to the console
Set the value to an empty string $('#nfl').val("")
console.log($('#nfl').val()) logs "" to the console

现在,这不会从选项中删除选定的属性,但我真正想要的只是值。


0

在您的选择中设置一个ID,例如:
<select id="foo" size="2">

然后,您可以使用:
$("#foo").prop("selectedIndex", 0).change();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.