Failed to execute ‘querySelector‘ on ‘Document‘: ‘#161725collapse‘ is not a valid selector.

本文记录了一位开发者在使用JavaScript时遇到的一个问题:当ID以数字开头时,document.querySelector会抛出'querySelector' on 'Document': '#161725collapse' is not a valid selector的异常。通过测试,确认了这是由于JavaScript中ID选择器不支持数字开头的ID导致的。解决方案是将ID改为字母开头,从而避免了该错误。
部署运行你感兴趣的模型镜像

记录一个小问题:

写JS遇到一个异常

 Uncaught DOMException: Failed to execute 'querySelector' on 'Document': '#161725collapse' is not a valid selector.
    at i (https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js:6:543)
    at HTMLAnchorElement.<anonymous> (https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js:6:20270)
    at HTMLDocument.n (https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js:6:4406)

但是我的html代码里面明明有这个 #161725collapse id,为什么会找不到呢

然后我用JQuery选择器和document原生的选择器测试了一下:

document原生的选择器的确是找不到,后来自己折腾了半天发现如果你的ID是是以数字开头的话document选择器就会报这个错,所以后来我把ID改成字母在前面,这样就可以了 

 

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

<think> 我们正在处理一个JavaScript错误:&#39;Failed to execute &#39;querySelector&#39; on &#39;Document&#39;: &#39;#4&#39; is not a valid selector&#39; 根据引用内容,我们可以分析错误原因和解决方法。 错误分析: 引用[2]明确指出:HTML中的ID不能以数字开头。在引用[2]的示例中,ID为"1"的按钮导致querySelector(&#39;#1&#39;)报错,因为选择器&#39;#1&#39;是无效的。 同样,当前错误信息中的选择器是&#39;#4&#39;,也是以数字开头,因此违反了选择器的命名规则。 原因: 在CSS选择器规范中,ID选择器如果以数字开头,则不是一个有效的选择器。因为规范要求选择器不能以数字开头(除非进行转义,但通常不推荐)。 解决方法: 1. 修改ID的命名,确保不以数字开头。例如,可以添加一个字母前缀。 例如:将id="4"改为id="item4"或"id4"。 2. 如果无法修改ID(比如ID是动态生成的),则可以考虑使用其他方式选择元素,例如: - 使用`document.getElementById()`方法,因为该方法可以直接使用字符串作为ID,并且对数字开头的ID是有效的(但注意,HTML4规范中ID不能以数字开头,HTML5允许,但为了兼容性和CSS选择器,仍然不建议使用数字开头)。 但是,注意:`getElementById`方法对于数字开头的ID在大多数浏览器中是可以工作的,因为HTML5允许ID以数字开头。但是,使用这样的ID仍然会导致CSS样式无法通过ID选择器应用,以及querySelector/querySelectorAll无法使用(因为它们是遵循CSS选择器规范的)。 然而,根据引用[3]中的情况,他们使用的是动态生成的ID(使用Date.now()),这可能会导致生成一个以数字开头的ID。因此,在动态生成ID时,应避免使用纯数字,或者确保加上一个字母前缀。 具体到错误&#39;#4&#39;,我们可以这样修改: 原始代码可能类似: document.querySelector(&#39;#4&#39;) 修改为: // 如果ID必须为数字,则可以使用getElementById,但注意HTML4不允许数字开头的ID,HTML5允许,所以现代浏览器中getElementById可以工作 document.getElementById(&#39;4&#39;) 但是,更推荐的做法是修改ID的生成方式,使其不以数字开头。例如,在生成ID时添加一个前缀: 原ID生成:可能是直接使用数字4,我们可以改为 `id="prefix-4"`,然后使用 `document.querySelector(&#39;#prefix-4&#39;)` 或 `document.getElementById(&#39;prefix-4&#39;)` 另外,引用[3]中提到了在Vue组件中动态生成ID,并且使用了Date.now(),这可能会生成一个纯数字的ID(因为Date.now()返回的是时间戳,是一个数字)。他们的解决方法也是避免使用纯数字,例如: 将id: `${Date.now()}` 改为 id: `id-${Date.now()}` 总结步骤: 1. 检查代码中生成ID的地方,确保生成的ID不以数字开头。如果是以数字开头,添加一个字母前缀(如"id-")。 2. 在通过querySelector选择元素时,使用修改后的ID字符串(带前缀)。 3. 或者,如果不想改ID,并且确定该元素只有一个,可以使用getElementById(传递原始字符串,包括数字开头的字符串)。但注意:这种方法虽然能选择到元素,但是不符合规范,可能会导致其他问题(如CSS样式无法应用)。 因此,优先建议修改ID的命名。 示例代码: 错误代码: <div id="4">...</div> <script> var elem = document.querySelector(&#39;#4&#39;); // 报错 </script> 修改方法1(推荐): <div id="item4">...</div> <script> var elem = document.querySelector(&#39;#item4&#39;); // 正确 </script> 修改方法2(使用getElementById,但不推荐,因为不符合规范): <div id="4">...</div> <script> var elem = document.getElementById(&#39;4&#39;); // 不会报错,但ID命名不规范 </script> 注意:如果使用修改方法2,虽然可以避免这个错误,但是该ID在CSS中无法使用(不能写成`#4{...}`),同样在querySelector中仍然无效。所以强烈推荐修改方法1。 根据引用[2]中的结论:“按照ID的设置规则,不以数字开头就好了”。 因此,针对用户当前的错误,我们给出如下解决方案: 步骤: 1. 检查HTML中ID为"4"的元素,将其ID修改为不以数字开头的字符串(如"element4")。 2.JavaScript代码中,将querySelector(&#39;#4&#39;)改为querySelector(&#39;#element4&#39;)。 3. 或者,如果这个ID是动态生成的,确保动态生成时添加前缀。 例如,在引用[3]的Vue示例中,可以这样修改: 原代码:id: `${Date.now()}` 修改为:id: `id-${Date.now()}` 然后在querySelector中使用:document.querySelector(`#id-${me.id}`) 是不需要的,因为此时ID已经带前缀,直接使用生成的值即可。注意,实际上在Vue组件中,更好的做法是通过ref获取DOM元素,而不是使用querySelector。 但用户的问题中,错误是直接由&#39;#4&#39;引起的,所以修改该选择器即可。 结论:修改ID,使其不以数字开头,然后相应更新选择器字符串。 相关问题: 1. 如何正确设置HTML元素的ID? 2. 除了querySelector,还有哪些方法可以获取DOM元素? 3. 为什么CSS选择器不能以数字开头? 4. 在动态生成ID时需要注意什么? </think> ### 解决 `Failed to execute &#39;querySelector&#39; on &#39;Document&#39;: &#39;#4&#39; is not a valid selector` 错误的方法 #### 💡 错误原因分析 根据引用内容([^2]),核心问题是 **CSS选择器规范要求ID不能以数字开头**: ```html <!-- 错误示例:ID以数字开头 --> <button id="4">按钮</button> <!-- 违反规范 --> <script> document.querySelector(&#39;#4&#39;); // 触发错误 </script> ``` `querySelector` 遵循CSS选择器语法规则,而CSS规范明确规定: - **ID选择器不能以数字开头**(如 `#4`) - 允许的字符:字母(`a-z`)、连字符(`-`)、下划线(`_`)、冒号(`:`)等 - 必须以字母、`_` 或 `:` 开头 #### ✅ 解决方案(逐步操作) 1. **修改ID命名规则(推荐)** 在HTML中为元素添加**字母前缀**: ```html <!-- 正确示例:添加前缀 --> <div id="item4">...</div> ``` 在JavaScript中使用修改后的ID: ```javascript document.querySelector(&#39;#item4&#39;); // 正常执行 ``` 2. **替代方案:使用 `getElementById`** 若无法修改ID(如第三方库生成),改用: ```javascript document.getElementById(&#39;4&#39;); // 可直接使用数字开头的ID ``` > ⚠️ 注意:`getElementById` 允许数字开头的ID,但会导致CSS样式失效(无法通过 `#4{...}` 定义样式) 3. **动态生成ID时的防护措施(引用[^3]场景)** 若ID通过代码生成(如 `Date.now()`),添加固定前缀: ```javascript // 原错误写法(生成纯数字ID) id: `${Date.now()}`; // 可能生成 "#1644394137513" // 修正方案:添加字母前缀 id: `id-${Date.now()}`; // 生成 "#id-1644394137513" ``` #### 🌰 完整修正示例 ```html <!-- HTML修改 --> <div id="container4">目标元素</div> <!-- JavaScript修正 --> <script> // 方法1:querySelector + 前缀 const element1 = document.querySelector(&#39;#container4&#39;); // 方法2:getElementById(不推荐长期使用) const element2 = document.getElementById(&#39;4&#39;); // 假设ID无法更改 </script> ``` #### ⚙️ 规范要求 | 方法 | 允许数字开头ID | 符合CSS规范 | 适用场景 | |--------------------|----------------|-------------|------------------------| | `querySelector` | ❌ | ✅ | 需要CSS选择器灵活性时 | | `getElementById` | ✅ | ❌ | 紧急兼容旧代码时 | > **最佳实践**:始终遵循 **字母开头的ID命名规则**(如 `item4`、`section-4`),避免兼容性问题[^2]。 --- ### 🔍 相关问题 1. 如何规范命名HTML/CSS选择器以避免常见错误? 2. `getElementById` 和 `querySelector` 在DOM操作中有哪些核心区别? 3. 动态生成元素ID时有哪些最佳实践? 4. 为什么CSS选择器对数字开头的ID有限制? [^1]: DOMException: Failed to executequerySelectorAll‘ onDocumentis not a valid selector 报错... [^2]: Uncaught DOMException Document.querySelector#1‘ is not a valid selector... [^3]: Failed to executequerySelectoronDocument:#1644394137513‘ is not a valid selector...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值