页面滚动加载例子

本文介绍了一种使用JavaScript实现的懒加载iframe技术,该技术能够提高网页加载速度并优化用户体验。通过对多个iframe元素进行监听,当它们即将进入视口时动态加载内容,从而减轻了浏览器的初始加载负担。
<html>
<body>
<div id="div1" frame_id='frame1'>
<iframe id='frame1' data_src="http://www.baidu.com" style='height:700px;width:400px'></iframe>
</div>

<br/>
<div id="div2" frame_id='frame2'>
<iframe id='frame2' data_src="http://www.baidu.com" style='height:700px;width:400px'></iframe>
</div>

<br/>
<div id="div3" frame_id='frame3'>
<iframe id='frame3' data_src="http://www.baidu.com" style='height:700px;width:400px'></iframe>
</div>

<br/>
<div id="div4" frame_id='frame4'>
<iframe id='frame4' data_src="http://www.baidu.com" style='height:700px;width:400px'></iframe>
</div>

<br/>
<div id="div5" frame_id='frame5'>
<iframe id='frame5' data_src="http://www.baidu.com" style='height:700px;width:400px'></iframe>
</div>

<br/>



<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">

//需加载的初始页面集合,加载后从此集合中去除避免重复加载
var d1 = document.getElementById("div1");
var d2 = document.getElementById("div2");
var d3 = document.getElementById("div3");
var d4 = document.getElementById("div4");
var d5 = document.getElementById("div5");
var div_arr = [d1, d2, d3, d4, d5];

loadFrame();

var itv;
$(window).scroll(function(){
clearTimeout(itv);
itv = setTimeout(loadFrame(),500);
});

function loadFrame(){
$("div[id^='div']").each(function(i){
var div_id = $(this).attr('id');
var load_id = $(this).attr('frame_id');

var id_index = i+1;

//已经加载过的不再加载
if(isContained(div_id)) {
var oTop = $(this).offset().top;
var scrolltop = $(window).scrollTop();
var winHeight = $(window).height();
//alert("oTop="+oTop+" \n" + "scrolltop="+scrolltop+" \n" + "winHeight="+winHeight+" \n" );
if((oTop-scrolltop)>0 && (oTop-scrolltop)<winHeight){
var frame_src = $("#"+load_id).attr("data_src");
$("#"+load_id).attr("src",frame_src);
deleteElement(div_id);
}
}
});

}

//删除已经加载的记录
function deleteElement(id) {
for(var i=0; i<div_arr.length; i++) {
if(div_arr[i]!=undefined && div_arr[i].id == id) {
delete div_arr[i];
return;
}
}
}

//判断未加载列表是否包含当前对象
function isContained(id) {
var result = false;
$.each(div_arr, function(i, n) {
if(n!=undefined && n.id == id) {
result = true;
}
});
return result;
}


</script>
</body>
</html>
### 如何在Web页面中实现无限滚动加载更多数据 #### 使用HTML和CSS构建基础结构 为了创建一个支持无限滚动的网页,首先需要设置基本的HTML和CSS布局。这通常涉及建立一个容器用于容纳所有的项目条目。 ```html <div id="infinite-scroll-container"> <!-- 数据项会在这里动态添加 --> </div> ``` #### JavaScript逻辑处理 通过JavaScript来监控用户的滚动行为并决定何时发起新的请求获取额外的数据。这里介绍一种基于原生JS的方法: ```javascript let container = document.getElementById('infinite-scroll-container'); let loading = false; let page = 1; function loadMoreItems() { if (loading) return; loading = true; // 防止重复加载 fetch(`/api/items?page=${page}`) .then(response => response.json()) .then(data => { data.items.forEach(item => { let itemElement = document.createElement('div'); itemElement.textContent = item.name; container.appendChild(itemElement); }); page++; loading = false; }) .catch(error => console.error('Error:', error)); } // 添加滚动事件监听器 container.addEventListener('scroll', () => { const { scrollTop, scrollHeight, clientHeight } = container; if ((scrollTop + clientHeight >= scrollHeight - 50) && !loading) { loadMoreItems(); } }); ``` 这种方法简单明了,在大多数情况下都能很好地工作[^1]。 #### Vue.js框架下的解决方案 对于采用Vue.js开发的应用程序来说,可以通过组合`ref`和其他特性轻松地集成无限滚动功能。下面是一个简单的例子展示如何做到这一点: ```vue <template> <ul v-infinite-scroll="loadMore" infinite-scroll-disabled="busy" infinite-scroll-distance="10"> <li v-for="(item, index) in items" :key="index">{{ item }}</li> </ul> </template> <script setup> import { ref, onMounted } from 'vue'; const items = ref([]); const busy = ref(false); async function fetchData(pageNumber){ try{ const res = await axios.get(`https://example.com/api/data?page=${pageNumber}`); items.value.push(...res.data.results); } catch(err){ console.log(err); } finally { busy.value = false; } } onMounted(() => { fetchData(1); }); function loadMore(){ if(!busy.value){ busy.value = true; fetchData(items.value.length / 20 + 1); // 假设每页有20个项目 } } </script> ``` 此代码片段展示了如何使用`v-infinite-scroll`指令以及相应的属性控制滚动加载的行为[^2]。 #### 利用第三方库简化操作 如果希望进一步减少编码量,则可以选择一些成熟的UI组件库提供的内置工具,比如Element Plus中的`ElInfiniteScroll`组件。它允许开发者仅需几行配置就能启用强大的无限滚动机制[^3]: ```vue <template> <el-scrollbar style="height:100%;"> <ul class="list-group"> <li v-for="i in count" :key="i" class="list-group-item">Item {{ i }}</li> </ul> <el-backtop target=".el-scrollbar__wrap"></el-backtop> </el-scrollbar> </template> <script lang="ts"> export default defineComponent({ name: "App", components: {}, directives: { ElInfiniteScroll }, props: ["count"], }) </script> ``` 上述实例说明了不同技术栈下实现无限滚动的方式,无论是纯前端还是结合特定框架都可以找到合适的技术方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值