uni-app H5环境下uni.createIntersectionObserver报错

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

uni-app H5环境下uni.createIntersectionObserver报错

开发环境 版本号 项目创建方式
Windows win11 CLI

操作步骤:

  • 使用 uni.createIntersectionObserverH5 环境下报错

预期结果:

  • 使用 uni.createIntersectionObserverH5 环境不报错

实际结果:

  • Uncaught (in promise) TypeError: Cannot read properties of null (reading ‘io’) at addIntersectionObserver (uni-h5.es.js:6842:8) at ServiceIntersectionObserver.observe (uni-h5.es.js:4631:) at Proxy.created (index.vue:101:41) at callWithErrorHandling (vue.runtime.esm.js:1375:36) at callWithAsyncErrorHandling (vue.runtime.esm.js:1384:21) at callHook$1 (vue.runtime.esm.js:4966:5) at applyOptions (vue.runtime.esm.js:4862:9) at finishComponentSetup (vue.runtime.esm.js:8761:9) at setupStatefulComponent (vue.runtime.esm.js:8672:9) at setupComponent (vue.runtime.esm.js:8594:11) created index.vue:101 Promise.then (异步)

3 回复

“vite”: “4.0.3”, “vue”: “^3.2.45”, 小程序正常,编译成h5会报错 APP暂时没测试


请提供下测试工程

uni-app 的 H5 环境下,使用 uni.createIntersectionObserver 时可能会遇到报错,这通常是因为 H5 环境下对 IntersectionObserver 的支持不完全或存在兼容性问题。以下是一些可能的原因和解决方案:

1. H5 环境不支持 IntersectionObserver

  • IntersectionObserver 是一个较新的 API,部分浏览器可能不支持它,尤其是在一些旧版本的浏览器中。
  • 解决方案:你可以在代码中先检查浏览器是否支持 IntersectionObserver,如果不支持,可以使用 polyfill 或者回退到其他方法。
if (!('IntersectionObserver' in window)) {
    console.warn('IntersectionObserver is not supported in this browser.');
    // 使用其他方法替代
} else {
    const observer = uni.createIntersectionObserver(this);
    // 继续使用 observer
}

2. uni.createIntersectionObserver 在 H5 环境下的实现问题

  • uni-app 的 H5 环境可能对 createIntersectionObserver 的实现存在一些问题,导致报错。
  • 解决方案:你可以尝试使用原生的 IntersectionObserver 替代 uni.createIntersectionObserver
const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            // 元素进入视口
            console.log('Element is in viewport');
        }
    });
});

const target = document.querySelector('.target-element');
if (target) {
    observer.observe(target);
}

3. uni.createIntersectionObserver 的参数问题

  • uni.createIntersectionObserver 的参数可能在某些情况下不兼容 H5 环境。
  • 解决方案:检查你传递给 uni.createIntersectionObserver 的参数,确保它们符合 H5 环境的要求。
const observer = uni.createIntersectionObserver(this, {
    thresholds: [0.5], // 设置阈值
    initialRatio: 0, // 初始比例
    observeAll: false // 是否观察所有目标
});

observer.relativeTo('.parent-element').observe('.target-element', (res) => {
    console.log(res);
});

4. H5 环境下的 DOM 结构问题

  • 在 H5 环境下,某些 DOM 结构可能会导致 IntersectionObserver 无法正常工作。
  • 解决方案:确保你的 DOM 结构是合理的,并且目标元素在页面中是可见的。

5. uni-app 版本问题

  • 如果你使用的是较旧版本的 uni-app,可能存在一些已知的 bug 或兼容性问题。
  • 解决方案:尝试升级 uni-app 到最新版本,看看问题是否得到解决。

6. 使用 uni.createIntersectionObserver 的替代方案

  • 如果以上方法都无法解决问题,你可以考虑使用其他方法来实现类似的功能,比如监听 scroll 事件,手动计算元素是否进入视口。
window.addEventListener('scroll', () => {
    const target = document.querySelector('.target-element');
    if (target) {
        const rect = target.getBoundingClientRect();
        if (rect.top < window.innerHeight && rect.bottom >= 0) {
            console.log('Element is in viewport');
        }
    }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!