HTML菜单中有关selected=true和setAttribute(“selected“,“selected“)的异同以及selected设置无法生效的问题解析

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

在前端编写select功能的时候,遇到了设置下拉首选默认项selected无效的问题,百度上有说用autocomplete="off"来解决的,实际上完全是错误的,即便在某些情况下有效果了,也可能是碰巧其它因素导致了生效而已。

首先上代码:

<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script>
function testSelect()
{
	var options=document.getElementById("select_test").options;
	options[6].setAttribute("selected","selected");
}
</script>
</head>
<body>
<select id="select_test">
	<option value="a">a</option>
	<option value="b" selected="selected">b</option>
	<option value="c">c</option>
	<option value="d" selected="selected">d</option>
	<option value="e">e</option>
	<option value="f" selected="selected">f</option>
	<option value="g">g</option>
</select>
<input type="button" onclick="testSelect()" value="点击查看效果"/>
</body>
</html>

【规则1】:
某个option在HTML源码中被“唯一”设定为selected="selected"的情况,前端选中项必定是这个option;

【规则2】:
多个option都设定了selected="selected"的情况下,前端选中项是option列表中的最后一个被设定为selected的项;

【规则3】:
添加以下js代码到testSelect(),用来选中value="g"的那一项option:
options[6].setAttribute(“selected”,“selected”)
g可以被成功选中,原因是options[6]原来没有selected属性,新添加会导致浏览器选中该项;

【规则4】:
如果使用setAttribute设定一个已经有了selected属性的option会怎样呢?例如我们设定value="b"这一项:
options[1].setAttribute(“selected”,“selected”)
结果b没有被选中,因为b已经有了selected属性,浏览器会忽略这一步重复操作;

【规则5】:
如果使用removeAttribute删除最初被选中的f会怎样?选中项会顺次变为d吗?
options[5].removeAttribute(“selected”);
结果并不是d,而是options的第一项a;说明删除选中项的selected的属性,并不会让浏览器重新选择其他有selected属性的option。而是默认选择option的第一项;

【规则6】:
如果使用removeAttribute删除的不是被选中的option会怎样呢?选中项会变为首项吗?
options[1].removeAttribute(“selected”);
答案是不会,依然是f,因为原来的选中项的selected属性并未被删除。

另外一个设定selected属性的方法是:dom.selected=true;因为该方法不会影响到html源码的内容,这也是导致很多人困惑的原因,明明看源码是某个option被selected,但是前端显示的却偏偏不是。

【规则7】:
使用selected=true是最直接最有效设置selected属性的方法,设置即生效。

可能有人会问了,如果这样,我们直接用selected=true就可以了,完全可以摒弃复杂易错的setAttribute了吗?其实不是的,selected=true不会影响到源码的内容,这会导致在需要复制某个dom的时候,无法完全一致地完成复制,因为selected=true的设定是不体现在源码中的,此时,一定需要用setAttribute和removeAttribute配合使用,以便让正确的选中项复制到新的dom中去。

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ardentrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值