如何修改闭合input标签内user-agent shadow root的div文本
问题原因
- 基础写法错误:
$('#myID')返回的是jQuery包装对象,不是浏览器原生DOM节点,直接在jQuery对象上访问DOM原生的shadowRoot属性必然拿到undefined。就算是可正常访问的开放模式Shadow DOM,也需要先拿到原生DOM元素才能操作,正确的元素获取写法是const el = document.getElementById('myID')或者const el = $('#myID')[0]。 - 核心阻塞原因:你在DevTools里看到的
#shadow-root (user-agent)是浏览器渲染原生input控件时自动生成的内置Shadow DOM,这类由浏览器内部创建的Shadow DOM全部是closed(封闭)模式,W3C标准明确规定这类封闭Shadow Root不会对外暴露访问入口,你就算拿到了原生input元素,访问el.shadowRoot也只会返回null,这是浏览器的封装策略,和代码写法无关。 - HTML认知偏差:
<input>是HTML标准定义的void空元素,浏览器解析HTML时遇到<input>开始标签就会完成该元素的解析流程,你写的</input>闭合标签会被直接判定为无效标签丢弃,写在这组标签中间的所有内容,都会被解析成input元素的兄弟节点,根本不会进入input的子树,更不会被放到浏览器生成的user-agent Shadow DOM内部。
解决方案
根据你的实际场景二选一处理:
场景1:需要修改原生input内置Shadow DOM中的div内容
不存在合规、稳定的可生产使用的实现方案。
不同浏览器、同一浏览器的不同版本,原生表单控件的内置Shadow DOM结构都不统一,且被浏览器完全封装禁止外部访问,就算依赖非标准黑科技强行获取到内部节点引用,修改逻辑也会随时因为浏览器版本迭代失效,没有实际使用价值。
如果需要自定义输入框的内部展示结构、文本内容,不要尝试篡改原生控件的内置Shadow DOM,直接实现自定义输入组件即可,参考代码:
<div id="myCustomInput"></div> <script> const host = document.getElementById('myCustomInput'); // 创建开放模式Shadow DOM,外部可自由访问操作内部节点 const shadow = host.attachShadow({ mode: 'open' }); shadow.innerHTML = ` <div class="content">初始展示文本</div> <input type="text" placeholder="请输入内容"> `; // 需要修改内部div文本时直接操作 shadow.querySelector('.content').textContent = '文本已修改完成'; </script>
场景2:需要修改的是你自己写在标签对中间的div
直接在普通DOM流中查找对应节点即可,这个div本质是input的相邻兄弟节点,和Shadow DOM没有任何关系,直接选中修改文本即可:
// 选中input后面紧邻的div修改内容 $('#myID + div').text('修改后的目标文本');
内容的提问来源于stack exchange,提问作者SpiDey
相关产品推荐
相关产品推荐

