未捕获的TypeError:无法在“ IntersectionObserver”上执行“观察”:参数1的类型不是“元素”

问题描述

我正在观看有关交叉路口观察员的视频,我已经逐字逐句地复制了他的脚本,但不知何故出现了此错误。有人遇到相同的错误,但通过将querySelectorAll更改为querySelector来解决了他们的问题。即使当我复制他们的代码并将其更改为querySelector时,它仍然无法正常工作。下面的代码是我的。我正在使用vs代码实时服务器。

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <Meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>Document</title>
    <link rel='stylesheet' href='style.css'>
    <script src='script.js'></script>
</head>
<body>
    <section class = 'section1'></section>
    <section></section>
    <section></section>
    <section></section>
    <section></section>
    <section></section>
</body>
</html>
@H_502_4@
const sectionOne = document.querySelector('.section1');

const options = {};

const observer = new IntersectionObserver(function
(entries,observer){
    entries.forEach(entry => {
        console.log(entry);
    });
},options);

observer.observe(sectionOne);
@H_502_4@
body{
    padding: 0;
    margin: 0;
}

section{
    height: 100vh;
    width:100%;
}
section:nth-child(odd){
    background: lightcoral
}
@H_502_4@

解决方法

该元素返回null,因为脚本在HTML解析之前运行。我在脚本标签中使用了defer来避免此问题。

<script src='script.js' defer></script>
,

实际上看起来您发布的示例可以正常工作,您可以在我制作的JSFiddle中进行检查:https://jsfiddle.net/sandro_paganotti/pomtng6f/3/

const sectionOne = document.querySelector('.section1');
const options = {};

const observer = new IntersectionObserver(function
 (entries,observer){
    entries.forEach(entry => {
       console.log(entry);
 });
},options);

observer.observe(sectionOne);

当然,由于观察者仅附加到第一部分,因此只有在第一部分进入或离开视口时才会触发。

,

添加

$(document).ready(function () { // your code }

文档 = 您的 div。

你必须确保 DOM 已经加载,当它“准备好”时,它就会启动:)

,

您选择的是第一个元素,因为 querySelector 选择第一个元素 如果要全选,则使用 querySelectorAll,然后循环遍历它们 观察者可以一一观察,应该是这样的:

const sections = document.querySelectorAll('section');

const options = {};

const observer = new IntersectionObserver(function
(entries,observer){
entries.forEach(entry => {
    console.log(entry);
});
},options);

// loop 
sections.forEach( section => {
observer.observe(section);
});