解决JS报错:items[i].innerText.splice is not a function
错误原因
你遇到的报错核心是对数据类型的方法调用错误,具体有3个问题:
items[i].innerText返回值是字符串类型,splice()是数组专属的操作方法,字符串原型上没有这个方法,直接调用必然抛出类型错误- 代码中裸写的
splice(-1, -4)没有绑定调用主体,运行时会直接抛出「splice未定义」的错误,且字符串截取对应的原生方法是slice(),不是数组用的splice() - 你每次操作都重复读取
innerText,如果中途修改了元素文本,后续读取到的是修改后的值,会导致逻辑计算错误
修复后代码
先把每个元素的原始文本一次性缓存到变量,用字符串原生的slice()方法做截取,逻辑和你的预期完全对齐:
function convert() { const items = document.getElementsByClassName("spa"); for (let i = 0; i < items.length; i++) { // 缓存原始文本,避免重复读取DOM属性 const rawText = items[i].innerText.trim(); // 截取最后1位拿到乘数(对应你写的splice(-1)逻辑) const multiplier = rawText.slice(-1); // 截掉最后4位固定后缀(即" x N"部分),移除人民币符号 const clean = rawText.slice(0, -4).replace('¥', ''); console.log(clean, multiplier) // 示例:这里可以直接计算总价替换原文本,按需修改即可 items[i].innerText = Number(clean) * Number(multiplier); } }; convert()
对应你的测试DOM结构,运行后会正确解析:
- 第一个
.spa元素解析出价格58.00、乘数2,计算结果为116 - 第二个
.spa元素解析出价格8.00、乘数4,计算结果为32
注意事项
- 不要混淆数组方法和字符串方法:
splice()会直接修改原数组,仅适用于数组;字符串截取请使用slice()、substring()这类字符串原生方法 - 如果你的文本后缀长度不固定(比如乘数是两位数的情况),可以用
split(' x ')拆分字符串取内容,适配性更强:const [pricePart, multiplier] = rawText.replace('¥', '').split(' x '); getElementsByClassName返回的是动态HTMLCollection,如果遍历过程中会改动DOM结构,建议先转成静态数组再遍历:const items = Array.from(document.getElementsByClassName("spa"))
内容的提问来源于stack exchange,提问作者back2match
相关产品推荐
相关产品推荐

