uni-app 【报Bug】uni.createSelectorQuery().in(this).select() 报错 [object DOMException] at view.umd.min.js:1

发布于 1周前 作者 wuwangju 来自 Uni-App

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 元素渲染完成后再执行查询操作,可以使用 setTimeoutnextTick 来延迟执行。
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();
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!