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

在前端编写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属性,浏览器会忽略这一步重复操作,通俗讲就是:你(ya)的之前有selected都无效,再重复设置selected也是设了个寂寞;

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Vue2 ,使用 v-html 指令动态渲染 HTML 代码时,如果 HTML 代码包含有点击事件绑定,会出现点击事件不生效问题。这是因为 v-html 渲染的 HTML 代码会被当做静态内容插入到 DOM 树,而不会像 Vue 模板的标签一样被 Vue 进行编译和渲染。 为了解决这个问题,可以使用 Vue2 的事件委托机制,将点击事件委托给父级元素或者根元素。 具体实现方法如下: 1. 在 div 标签上添加 @click.prevent="handleClick" 事件,用于捕获点击事件。 2. 在 handleClick 方法,判断点击事件的 target 是否为包含有点击事件绑定的元素,如果是,则执行点击事件对应的方法。 3. 在包含有点击事件绑定的元素上添加一个自定义属性,用于标识该元素需要绑定点击事件。 4. 在 div 标签上使用 v-html 指令渲染 HTML 代码时,将包含有点击事件绑定的元素的自定义属性一同渲染出来。 示例代码如下: HTML 代码: ```html <div @click.prevent="handleClick" v-html="html"></div> ``` Vue 实例: ```javascript new Vue({ el: "#app", data: { html: `<p><a custom-click href="javascript:void(0)">点击我</a></p>` }, methods: { handleClick(e) { const target = e.target; if (target.hasAttribute('custom-click')) { // 执行点击事件对应的方法 console.log('点击事件生效了'); } } }, mounted() { // 在 v-html 渲染的 HTML 代码添加自定义属性 const a = document.querySelector('a[custom-click]'); if (a) { a.setAttribute('custom-click', 'true'); } } }); ``` 通过以上方法,就可以实现在 div 使用 v-html 渲染的 HTML 代码绑定点击事件,同时点击事件也能够正常生效了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ardentrain

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

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

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

打赏作者

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

抵扣说明:

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

余额充值