嗨,我必须通过粘性导航栏将一些代码从 javascript 传递到打字稿
Hi, I have to pass some code over a sticky navbar from javascript to typescript
这是我最初在 javascript 中创建的导航栏(在一个单独的文件夹中,其中包含纯 html、css 和确实有效的 js),但我想将其更改为与 angular.
一起使用的打字稿
window.onscroll = function() {myFunction()};
let navbar = document.getElementById("menu-bottom");
let sticky = navbar.offsetTop;
function myFunction() {
if (window.pageYOffset >= sticky) {
navbar.classList.add("sticky");
} else {
navbar.classList.remove("sticky");
}
}
或者发生的事情是,当我将它传递给打字稿时,它在 navbar
中标记了一个错误,因为它说它是空的(我猜是因为 getElementById
)但我不知道不知道如何更改它以使其工作。
该错误表示 navbar
可能为空,您应该在使用它之前检查一个值,这样它会抛出一个错误,即“无法读取 属性 'offsetTop' 未定义'.
let navbar = document.getElementById("menu-bottom");
if (navbar) {
let sticky = navbar.offsetTop;
}
TL;DR
window.onscroll = function() {myFunction()};
let navbar = document.getElementById("menu-bottom");
// Check if the 'navbar' is not null
if (!navbar) throw new Error("#menu-bottom should be defined")
let sticky = navbar.offsetTop;
function myFunction() {
if (window.pageYOffset >= sticky) {
navbar.classList.add("sticky");
} else {
navbar.classList.remove("sticky");
}
}
详情
你可以用the return value of getElementById() definition in MDN docs看看。它说:
An Element object describing the DOM element object matching the specified ID, or null if no matching element was found in the document.
因此,当“#menu-bottom”未出现在 DOM 树中时,它返回 null
。如果你真的确定它永远不应该是null
,那么最好写一个这样的断言:
if (!navbar) throw new Error("#menu-bottom should be defined")
最好在DOM内容加载完成后再加载脚本:
document.addEventListener("DOMContentLoaded", () => { /* your code goes here */ });
这是我最初在 javascript 中创建的导航栏(在一个单独的文件夹中,其中包含纯 html、css 和确实有效的 js),但我想将其更改为与 angular.
一起使用的打字稿window.onscroll = function() {myFunction()};
let navbar = document.getElementById("menu-bottom");
let sticky = navbar.offsetTop;
function myFunction() {
if (window.pageYOffset >= sticky) {
navbar.classList.add("sticky");
} else {
navbar.classList.remove("sticky");
}
}
或者发生的事情是,当我将它传递给打字稿时,它在 navbar
中标记了一个错误,因为它说它是空的(我猜是因为 getElementById
)但我不知道不知道如何更改它以使其工作。
该错误表示 navbar
可能为空,您应该在使用它之前检查一个值,这样它会抛出一个错误,即“无法读取 属性 'offsetTop' 未定义'.
let navbar = document.getElementById("menu-bottom");
if (navbar) {
let sticky = navbar.offsetTop;
}
TL;DR
window.onscroll = function() {myFunction()};
let navbar = document.getElementById("menu-bottom");
// Check if the 'navbar' is not null
if (!navbar) throw new Error("#menu-bottom should be defined")
let sticky = navbar.offsetTop;
function myFunction() {
if (window.pageYOffset >= sticky) {
navbar.classList.add("sticky");
} else {
navbar.classList.remove("sticky");
}
}
详情
你可以用the return value of getElementById() definition in MDN docs看看。它说:
An Element object describing the DOM element object matching the specified ID, or null if no matching element was found in the document.
因此,当“#menu-bottom”未出现在 DOM 树中时,它返回 null
。如果你真的确定它永远不应该是null
,那么最好写一个这样的断言:
if (!navbar) throw new Error("#menu-bottom should be defined")
最好在DOM内容加载完成后再加载脚本:
document.addEventListener("DOMContentLoaded", () => { /* your code goes here */ });