无法在 JS 中读取未定义的属性(读取 ‘top’)
TypeError: Cannot read property ‘top’ of Undefined in JS
出现“无法读取未定义的属性(读取‘top’)”错误的主要原因有两个:
- 访问
top
不存在的 DOM 元素的属性。 - 在声明 DOM 元素的 HTML 上方插入 JS 脚本标记。
下面是错误如何发生的示例。
索引.js
const el = undefined; // ⛔️ TypeError: Cannot read properties of undefined (reading 'top') console.log(el.top);
如果您使用不存在的标识符,则最常发生该错误。
这是示例的 HTML。
索引.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous" ></script> </head> <body> <div id="box">Content</div> <script src="index.js"></script> </body> </html>
这是试图访问不存在的元素的相关 JS 代码。
索引.js
const el = $('#does-not-exist'); console.log(el); // ⛔️ Cannot read properties of undefined (reading 'top') console.log(el.offset().top);
调用该offset()
方法返回一个undefined
值并访问该
top
属性会导致错误。
top
在访问属性之前确保元素存在
确保您正在访问其top
属性的 DOM 元素存在。
您还可以有条件地检查以避免出现错误。
索引.js
const el = $('#does-not-exist'); // ✅ Using optional chaining const result1 = el?.offset()?.top; console.log(result1);
undefined
如果引用等于or ,可选链接 (?.) 运算符会短路而不是抛出错误null
。
出现错误的另一个常见原因是将 JS 脚本标记放在声明 DOM 元素的代码之上。
将你的 JS 脚本标签放在 body 标签的底部
在声明 HTML 元素之后,确保 JS 脚本标记位于正文的底部。
索引.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous" ></script> </head> <body> <div id="box">Content</div> <!-- ✅ GOOD - Script is run after div is declared ✅ --> <script src="index.js"></script> </body> </html>
请注意,我们将index.js
脚本标记放在创建元素的代码下方
div
。
如果 JS 脚本标记位于创建div
元素的代码上方,则该元素将无法在index.js
文件中访问。
索引.js
const el = $('#box'); console.log(el); // ✅ Works console.log(el.offset().top); // 👉️ 8
当提供正确的标识符并在创建元素后加载 JS 脚本标记时,我们可以访问该top
属性而不会出现错误。
结论
尝试访问top
某个undefined
值的属性时,会发生“无法读取未定义的属性(读取‘top’)”错误。
要解决该错误,请确保仅访问top
有效 DOM 元素上的属性。