Причина, по которой вы видите TypeError: $elem.offset(...) is undefined
, заключается в том, что вы пытаетесь вызвать метод offset
для элемента, который не существует на вашей странице.
Вы должны изменить свою логику c, которая проверяет, существует ли элемент. В настоящее время ваша функция isOnScreen
принимает строку в качестве аргумента и проверяет, является ли length
этого string
0
- это фактически не проверяет, находится элемент на странице или нет.
function isOnScreen(elem) {
if (elem.length == 0) {
return
}
}
window.addEventListener(`scroll`, function (e) {
if (isOnScreen(`#lfdesign`) {
// passing a string and checking it's length
// inside the `isOnScreen` function doesn't tell
// you if this element is on the page or not
}
})
Вместо этого вам следует сначала попытаться найти / найти элемент с помощью jQuery
, если вы этого хотите, и проверить, существует ли он. Если это так, делайте все, что вам нужно, иначе return
рано.
function isOnScreen(selector) {
var el = $(selector)
if (el.length !== 1) {
console.log(`element ${selector} does not exist!`)
return;
}
console.log(`element ${selector} exists!`)
// do work
}
// inside of `window.addEventListener` callback function
if (isOnScreen("#lfdesign")) {
// do work
}
if (isOnScreen("#books")) {
// do work
}
if (isOnScreen(".srp-color")) {
// do work
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="lfdesign">
<h4>My ID is <b>lfdesign</b>!</h4>
</div>
<div id="books">
<h4>My ID is <b>books</b>!</h4>
</div>
Одно замечание, которое я хотел бы сделать, это то, что window.addEventListener("scroll", callback)
будет вызываться много за короткий промежуток времени, что может вызвать проблемы с производительностью. Если вы сталкиваетесь с проблемами с производительностью, вы должны взглянуть на throttling
и / или debouncing
:
Надеюсь, это поможет.