uni-app 【报Bug】uni.createSelectorQuery().in(this).select() 报错 [object DOMException] at view.umd.min.js:1
uni-app 【报Bug】uni.createSelectorQuery().in(this).select() 报错 [object DOMException] at view.umd.min.js:1
信息类别 | 详细信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC版本号 | Windows 10 家庭中文版 22H2 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 3.96 |
手机系统 | Android |
手机版本号 | Android 12 |
手机厂商 | 华为 |
手机机型 | JEF-AN00 |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 离线 |
项目创建方式 | HBuilderX |
示例代码:
//长按事件回调
openMessageBox(e) {
let id = e.currentTarget.id;
console.log(id)
const query = uni.createSelectorQuery().in(this);
query.select('#'+id).boundingClientRect(data => {
console.log("得到布局位置信息" + JSON.stringify(data));
console.log("节点离页面顶部的距离为" + data.top);
}).exec();
}
操作步骤:
通过v-for 循环遍历一个列表,并将其的唯一属性作为id绑定到view上,并且给这个view 绑定长按事件。触发长按事件后通过event拿到view 的id,通过选择器选中这个元素,打印元素属性。
预期结果:
打印出该元素属性
实际结果:
报错,报错信息 [object DOMException] at view.umd.min.js:1
bug描述:
uni.createSelectorQuery().in(this).select() 报错 [object DOMException] at view.umd.min.js:1
这个是长按事件回调,id是通过v-for进行绑定的,并不存在id重复的情况
//长按事件回调
openMessageBox(e) {
let id = e.currentTarget.id;
console.log(id)
const query = uni.createSelectorQuery().in(this);
query.select('#'+id).boundingClientRect(data => {
console.log("得到布局位置信息" + JSON.stringify(data));
console.log("节点离页面顶部的距离为" + data.top);
}).exec();
}
执行此代码,会报错,报错信息 [object DOMException] at view.umd.min.js:1
并且只能打印出 id
2 回复
提供下测试工程
在使用 uni-app
开发时,uni.createSelectorQuery().in(this).select()
报错 [object DOMException]
可能由多种原因引起。以下是一些常见的原因及解决方法:
1. 组件未挂载
- 原因: 在组件未挂载时调用
createSelectorQuery
,可能会导致 DOM 元素还未准备好,从而抛出错误。 - 解决方法: 确保在组件挂载后再执行查询操作。可以在
mounted
生命周期钩子中调用相关代码。
export default {
mounted() {
uni.createSelectorQuery().in(this).select('.my-element').boundingClientRect(rect => {
console.log(rect);
}).exec();
}
}
2. 选择器错误
- 原因: 如果选择器
select('.my-element')
中的.my-element
不存在或拼写错误,会导致查询失败。 - 解决方法: 确保选择器正确且对应的 DOM 元素存在。
<view class="my-element">Hello World</view>
3. 作用域问题
- 原因: 在自定义组件中使用
in(this)
时,this
可能未正确指向当前组件实例。 - 解决方法: 确保
this
指向正确的组件实例。如果是在methods
或其他函数中调用,确保this
未丢失上下文。
export default {
methods: {
getRect() {
uni.createSelectorQuery().in(this).select('.my-element').boundingClientRect(rect => {
console.log(rect);
}).exec();
}
},
mounted() {
this.getRect();
}
}
4. DOMException 类型错误
- 原因:
DOMException
通常表示在操作 DOM 时发生了某种错误,可能是由于 DOM 元素不可访问、不支持的操作等。 - 解决方法: 检查是否有其他操作影响了 DOM 元素的正常访问,确保 DOM 结构稳定且符合预期。
5. uni-app 版本问题
- 原因: 某些
uni-app
版本可能存在 bug 或兼容性问题。 - 解决方法: 尝试更新
uni-app
到最新版本,或者查看官方文档和社区是否有相关问题的解决方案。
6. 异步问题
- 原因: 如果
createSelectorQuery
在异步操作中调用,可能会导致 DOM 元素还未渲染完成。 - 解决方法: 确保在 DOM 元素渲染完成后再执行查询操作,可以使用
setTimeout
或nextTick
来延迟执行。
export default {
mounted() {
this.$nextTick(() => {
uni.createSelectorQuery().in(this).select('.my-element').boundingClientRect(rect => {
console.log(rect);
}).exec();
});
}
}
7. 跨平台兼容性
- 原因:
uni-app
支持多平台,某些平台可能对createSelectorQuery
的支持不完全一致。 - 解决方法: 检查目标平台的兼容性,确保代码在目标平台上正常运行。
8. 调试与日志
- 原因: 错误信息不够详细,难以定位问题。
- 解决方法: 使用
console.log
或调试工具逐步排查问题,确保每一步操作都符合预期。
export default {
mounted() {
const query = uni.createSelectorQuery().in(this);
console.log(query); // 打印 query 对象
query.select('.my-element').boundingClientRect(rect => {
console.log(rect); // 打印查询结果
}).exec();
}
}