How to configure jQuery.Lazy() Plugin to load second element ONLY after first is loaded(如何将jQuery.Lazy()插件配置为仅在加载第一个元素后加载第二个元素)
问题描述
我使用jQuery.Lazy()
插件和ASP.NET Core Razor页面和Bootstrap 4应用程序通过AJAX从数据库中检索2个列表(见图)。一切都运行得很好,除了一件事:在移动设备上,我不知道如何延迟Content Data 2 List
的检索/显示,直到用户在浏览器中向下滚动足够远的地方,以便Title 2/content
在他们的视窗中。桌面上不存在这个问题(因为列表是并排显示的,并且两个列表都需要检索),但在移动设备上,如果用户从未向下滚动足够远才能看到Content Data 2 List
,我不想检索它。
当页面第一次加载时,两个标题都会与一个带有微调按钮的小数据区域一起显示。使用AJAX,我检索数据,隐藏微调控制项,然后在适当的位置显示检索到的数据。我的过度简化的超文本标记语言是: 数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
<div class="col-sm-12 col-lg-6 lazy" data-loader="lazyAJAX1">
<div class="col">
<label class="">Title 1</label>
</div>
<div class="col">
<div class="">
<div class="lp-spinner mt-4 mb-4">
</div>
</div>
<div id="Content1List" class="col-12">
</div>
</div>
</div>
<div class="col-sm-12 col-lg-6 lazy" data-loader="lazyAJAX2">
<div class="col">
<label class="">Title 2</label>
</div>
<div class="col">
<div class="">
<div class="lp-spinner mt-4 mb-4">
</div>
</div>
<div id="Content2List" class="col-12">
</div>
</div>
</div>
,相关的JQuery为: 数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
$(".lazy").Lazy({
scrollDirection: 'vertical',
effect: 'fadeIn',
visibleOnly: true,
bind: 'event',
threshold: 0,
lazyAJAX1: function () {
loadAJAX1Partial();
},
lazyAJAX2: function () {
loadAJAX2Partial();
}
});
试了一段时间后,我认为问题出在数据加载器上。具体地说,data-loader="lazyAJAX2"
,因为它最初在页面加载时显示在用户的视窗中,因此自动检索Content Data 2 List
。我想要的是Lazy()首先检索Content Data 1 List
(这将把Title 2
内容向下推到用户的视窗之外),然后为Content Data 2 List
启用/激活Lazy(),这样当用户向下滚动到Title 2
时,Content Data 2 List
将被检索到。我希望这是有道理的。
我曾考虑使用addClass()来尝试解决此问题,但也许有更多.Lazy()经验的人对如何做到这一点有更好的想法。
提前感谢您的任何建议/帮助...:)
推荐答案
经过反复试验,我找到了解决困境的办法。根据@Eisbehr的建议,秘诀在于DOM刷新。
问题是:当通过loadAJAX1Partial()检索第一个Content Data 1 List
时,Content Data 2 List
也通过loadAJAX2Partial()被异步调用/检索。根据数据(从服务器返回的大小和时间)的不同,这两个列表中的任何一个都可以以任何顺序返回。使用@eisbehr建议的用法不能保证序列,也不能保证在异步/等待中包装调用(至少我不能不断地让它工作)。
那么答案是什么?使用setTimeout()或questAnimationFrame()并按照@eisbehr的建议对检索进行排序。
有一篇非常好的文章介绍了DOM以及它如何刷新浏览器中的内容(请参阅When DOM Updates Appear to Be Asynchronous),但基本上您需要给浏览器时间来更新/刷新屏幕上的Content Data 1 List
,这样Lazy
才能发挥它的魔力。
因此,在我的第一个AJAX调用(loadAJAX1Partial())中,on Success:(在检索列表之后),我只需调用:setTimeout(loadAssetList,500)来加载AssetList(),但给它500ms(1/2秒)以允许浏览器屏幕在初始化前刷新'Lazy'
:
function loadAssetLists() {
$(".lazy").Lazy({
scrollDirection: 'vertical',
effect: 'fadeIn',
visibleOnly: true,
bind: 'event',
threshold: 0,
lazyAJAX2: function () {
loadAJAX2Partial();
},
lazyAJAX3: function () {
loadAJAX3Partial();
}
// Chain additional AJAX calls here, if needed
});
};
loadAJAX1Partial();
Lazy
初始化之前刷新屏幕将显示Content Data 1 List
,从而将Content Data 2 List
视区向下推。这似乎一直奏效。
还请注意,一旦将视区向下移动,您就可以轻松地链接多个负载(即,loadAJAX2Partial()、loadAJAX3Partial()等)。一切都按预期运行。
最棒的是:当用户完全显示页面时(通过部分向下滚动以检索所有AJAX数据),单击到新页面,然后单击"后退"按钮,所有'Lazy'
功能都会按预期工作。
这篇关于如何将jQuery.Lazy()插件配置为仅在加载第一个元素后加载第二个元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何将jQuery.Lazy()插件配置为仅在加载第一个元素后加载第二个元素
基础教程推荐
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- SSE 浮点算术是否可重现? 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- c# Math.Sqrt 实现 2022-01-01