将JavaScript加载延迟到特定的页面锚
我有一些JavaScript代码,我只想在页面滚动到某个id标记时加载这些代码 例如,假设我有一个脚本将JavaScript加载延迟到特定的页面锚,javascript,html,dom,Javascript,Html,Dom,我有一些JavaScript代码,我只想在页面滚动到某个id标记时加载这些代码 例如,假设我有一个脚本model.js和一个html元素 我的目标是在页面到达 我假设有一个相当简单的方法来实现这一点,但我很难找到如何做到这一点。到目前为止,我的研究只得出了在加载中使用defer或async的东西,但这些似乎没有给出我想要的结果 非常感谢您的帮助 为了解决您的问题,我决定在到达元素的滚动位置后,将脚本添加到DOM中,然后将src属性设置为model.js 为了只添加一次脚本,在第一次添加脚本时,
model.js
和一个html元素
我的目标是在页面到达
我假设有一个相当简单的方法来实现这一点,但我很难找到如何做到这一点。到目前为止,我的研究只得出了在
加载中使用defer
或async
的东西,但这些似乎没有给出我想要的结果
非常感谢您的帮助 为了解决您的问题,我决定在到达元素的滚动位置后,将脚本添加到DOM中,然后将
src
属性设置为model.js
为了只添加一次脚本,在第一次添加脚本时,我从文档中删除了事件侦听器
使用jQuery:
let anchorOffsetTop = $("#anchor").offset().top;
$(document).on("scroll", function () {
console.log(anchorOffsetTop, $(window).height(), $(this).scrollTop());
if ($(this).scrollTop() + $(window).height() > anchorOffsetTop) {
let s = document.createElement("script");
s.type = "text/javascript";
s.src = "model.js";
$("body").append(s); // add script to body
$(document).off("scroll"); // remove event listener
console.log(s);
}
});
使用纯香草JS:
let anchorOffsetTop2 = document.getElementById("anchor").offsetTop;
const addScript = () => {
if (
document.documentElement.scrollTop + window.innerHeight >
anchorOffsetTop2
) {
let s = document.createElement("script");
s.type = "text/javascript";
s.src = "model.js";
document.body.appendChild(s);
console.log(s);
window.removeEventListener("scroll", addScript);
}
};
window.addEventListener("scroll", addScript);
请参阅codepen以测试代码。为什么不希望在此之前加载脚本?为什么不加载脚本,在那之前不执行特定的操作呢?你想要纯JS/jQuery的解决方案吗?@David这是一个很好的观点,我想这没有什么区别。该脚本使用D3来执行一些繁重的DOM操作,这也发生在开始加载的其他脚本中,因此我想将其他DOM内容推到某一点,以免减慢转换等。公平地说,我可以控制脚本本身内部的延迟(我已经在滚动位置上执行事件触发器),但是我宁愿把逻辑分开,并且认为延迟整个脚本加载是最干净的方法。谢谢!我正在寻找一个纯JS解决方案来尽可能减少依赖性,但这很好:)@JaredWilber我也用纯JS解决方案更新了我的答案。让我知道这是否足够。