首页 web前端 js教程 Ajax无刷新分页的性能优化方法

Ajax无刷新分页的性能优化方法

May 25, 2018 am 11:39 AM
ajax 优化 性能

这篇文章主要介绍了Ajax无刷新分页的性能优化方法的相关资料,需要的朋友可以参考下

Ajax无刷新分页,已经是一个大家比较熟悉的事物了,大概就是web前端页面上有一个js的方法,通过Ajax去请求服务器端的分页数据接口,拿到数据后再在页面上创建html结构,展现给用户,类似于下面这样:

<script type=”text/javascript”>
function getPage(pageIndex){
ajax({
url:” RemoteInterface.cgi”,
method:”get”,
data:{pageIndex:pageIndex},
callback:callback
});
}
function callback(datalist){
//todo:根据返回的datalist数据创建html结构展现给用户。
}
</script>
登录后复制

其中,RemoteInterface.cgi是一个服务器端的接口。我们这里限于篇幅,涉及的实例代码可能都不是完整的,只为了把意思表达明白。

UI上,可能会有各种款式的分页控件,大家也都比较熟悉,比如:

但无非都是用户点击控件触发这里的getPage(pageIndex)方法,这个getPage方法可能不是那么简单。

如果按照代码片段1的写法,我们可以想象,用户每次点击翻页的时候,都会请求一次RemoteInterface.cgi,在忽略数据可能有更新的情况下,除了第一次,后面每次getPage(1) 、getPage(2)、getPage(3)等等所触发的远程接口请求以及在网络上往返的数据流量,其实都是重复的、不必要的。每页第一次请求的时候都可以把这些数据以某种形式缓存在页面上,用户如果有兴趣回头来看之前翻过的页,getPage方法应该先检查本地缓存当中是否包含该页数据,如果有,则直接重新展现给用户,而不是去调用远程接口。按照这个想法,我们可以把代码片段1修改一下,如下:

<script type=”text/javascript”>
var pageDatalist={};
function getPage(pageIndex){
if(pageDatalist[pageIndex]){ //如果本地的数据列表中包含当前请求页码的数据
showPage(pageDatalist[pageIndex])//直接展现当前数据
}
else
{
ajax({
url:” RemoteInterface.cgi”,
method:”get”,
data:{pageIndex:pageIndex},
callback:callback
});
}
}
function callback(pageIndex,datalist){
pageDatalist[pageIndex]= datalist; //缓存数据
showPage(datalist);//展现数据
}
function showPage(datalist){
//todo:根据返回的datalist数据创建html结构展现给用户。
}

</script>
登录后复制

这样做一来节约网络请求往返的时间,更重要的是节约宝贵的网络流量和减轻接口服务器的负担。在低网速环境下或者接口服务器运行压力已经比较大的情况下,这种必要的改进更能显现明显的优化效果。大名鼎鼎的yahoo 34条,第一条就是尽量减少HTTP请求次数。Ajax的异步请求,毫无疑问也是在http请求的范畴内。访问量小的web应用或许感觉没有必要,但是想象一下,如果有一个这样的页面:每天访问量1000万次,用户平均翻5页,其中有一页为重复查看。那么这样一个页面,按照代码片段1的写法,平均每天将触发5000万次的数据请求,而按照代码片段2的写法,则平均每天至少可减少1000万次请求。如果每次请求的数据量是20kb,则可以节约1000万*20kb=200,000,000kb 约合190G的网络流量。这样看节约的资源是相当可观的。

如果要继续深究的话,代码片段2当中数据缓存方法还值得讨论一下。我们前面假定可以忽略分页数据的时效性,但实际应用里面时效性却是个不能回避的问题。缓存毫无疑问会导致时效性的降低,真正的缓存方案应该还要依赖对应用时效性要求的分析和取舍。

对于一般不是特别强调时效性的内容,页面上的缓存应该还是可以接受的,一来用户不会一直停留在一个页面上,页面之间有跳转造成重新加载时,可以获得更新后的数据。另外如果用户有刷新页面的习惯的话,当他特别想看列表是否有数据更新的时候,可以选择刷新页面。如果追求完美的话,还可以考虑设定一个时间范围,比如5分钟。如果用户一直停留在当前页面超过5分钟,那么5分钟内他的翻页都是先读取页面上的缓存,5分钟以后的翻页才再次请求服务器的数据。

有些情况,如果我们可以预知数据的更新频率,比如多少天才可能会有一次数据更新,甚至可以考虑使用本地存储,隔一定时间才触发一次对服务器数据的请求,这样对请求数和流量的节约就更加彻底了。当然最终什么样的缓存方法适用,归根结底还取决于产品对时效性的要求,但原则还是能节约的请求和流量,尽量节约,对于访问量超大的页面尤其如此。

对于时效性要求高的一类数据,缓存就完全不适用么?当然不是的,只不过整体的思路还得再变一变。一般所谓变化,可能主要是列表当中的数据有增、减或者改动,但是绝大多数的数据还是保持不变的。大多数情况下,前面讲的设定在一段时间范围内做缓存还是适用的。

如果有接近于要求实时更新数据的需求,大家可能很容易想到使用定时器的方法,比如每20秒执行一次getPage(pageIndex)方法并重绘列表。但大家只要联想到前面1000万次页面访问的假设,就会发现这无疑是一件超级恐怖的事情,按照这种访问量和重试的频率,服务器压力山大呀。关于这种情况怎么处理,我想请大家去看一看Gmail、163邮箱和新浪邮箱等对邮件列表页的处理方式。它们几乎同时满足了我们之前的假设:超级大的日访问量,对数据要求实时更新等。用网络抓包工具分析一下不难发现,它们在用户重复请求同一个页码的数据时,都不会向服务器发出请求。为了保证有消息更新时能够及时通知用户并且更新邮件列表,可以使用一个定时、重复进行的异步请求,但是这个请求只是做一个状态查询,而不是刷新列表。只有获取到有消息更新的状态时才会发起请求去获取更新的数据,或者状态查询的接口在发现有更新时会直接把更新的数据返回。事实上,163邮箱这个定时的状态查询,间隔时间都是设的比较长的,大概两分钟一次,新浪邮箱这个时间间隔更长一些,大概5分钟一次,可以了解它们都在尽力减少请求数量。但是这种处理方式,可能就不是仅前端单方面就能做的,实现方案需要和后台接口整体考虑才行。

现在我们再回过头来看一下代码片段2当中的数据缓存方法。现在不再讨论请求数量和流量的节约,我们来看一下前端的实现上还有没有什么值得深究一下的。按照代码片段2示意的处理方式,原始数据被储存起来,当再次被调用时,showPage(datalist)需要再次根据数据去重建html结构展现给用户,但是之前这个创建结构的过程我们是有做过的,是不是可以考虑在第一次创建结构的时候,直接把这个结构存起来呢?这样可以减少js重复的计算,特别当结构比较复杂时更值得考虑。再想一下,这个结构之前在页面上创建过了,翻页的时候销毁并再次创建新的结构,也是耗费资源的,能不能第一次创建好了之后,翻页的时候不销毁,只是通过控制CSS样式给它隐藏起来,重复翻页的时候也只是在这些创建好的结构之间控制彼此显示或者隐藏?

最后,这里讨论的方法,不一定适用所有情景,但或者会有些许启发,可以在适当的时候尝试其中一二。同时思想如果发散开来,或者还不仅仅可以运用在无刷新分页。这里抛砖引玉,大家一起探讨。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

基于firefox实现ajax图片上传

Ajax加载外部页面弹出层效果实现方法

ajax跨域(基础域名相同)表单提交的方法

以上是Ajax无刷新分页的性能优化方法的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

不同Java框架的性能对比 不同Java框架的性能对比 Jun 05, 2024 pm 07:14 PM

不同Java框架的性能对比:RESTAPI请求处理:Vert.x最佳,请求速率达SpringBoot2倍,Dropwizard3倍。数据库查询:SpringBoot的HibernateORM优于Vert.x及Dropwizard的ORM。缓存操作:Vert.x的Hazelcast客户机优于SpringBoot及Dropwizard的缓存机制。合适框架:根据应用需求选择,Vert.x适用于高性能Web服务,SpringBoot适用于数据密集型应用,Dropwizard适用于微服务架构。

PHP 数组键值翻转:不同方法的性能对比分析 PHP 数组键值翻转:不同方法的性能对比分析 May 03, 2024 pm 09:03 PM

PHP数组键值翻转方法性能对比表明:array_flip()函数在大型数组(超过100万个元素)下比for循环性能更优,耗时更短。手动翻转键值的for循环方法耗时相对较长。

C++ 程序优化:时间复杂度降低技巧 C++ 程序优化:时间复杂度降低技巧 Jun 01, 2024 am 11:19 AM

时间复杂度衡量算法执行时间与输入规模的关系。降低C++程序时间复杂度的技巧包括:选择合适的容器(如vector、list)以优化数据存储和管理。利用高效算法(如快速排序)以减少计算时间。消除多重运算以减少重复计算。利用条件分支以避免不必要的计算。通过使用更快的算法(如二分搜索)来优化线性搜索。

C++中如何优化多线程程序的性能? C++中如何优化多线程程序的性能? Jun 05, 2024 pm 02:04 PM

优化C++多线程性能的有效技术包括:限制线程数量,避免争用资源。使用轻量级互斥锁,减少争用。优化锁的范围,最小化等待时间。采用无锁数据结构,提高并发性。避免忙等,通过事件通知线程资源可用性。

PHP 与 Ajax:构建一个自动完成建议引擎 PHP 与 Ajax:构建一个自动完成建议引擎 Jun 02, 2024 pm 08:39 PM

使用PHP和Ajax构建自动完成建议引擎:服务器端脚本:处理Ajax请求并返回建议(autocomplete.php)。客户端脚本:发送Ajax请求并显示建议(autocomplete.js)。实战案例:在HTML页面中包含脚本并指定search-input元素标识符。

PHP 与 Ajax:创建动态加载内容的解决方案 PHP 与 Ajax:创建动态加载内容的解决方案 Jun 06, 2024 pm 01:12 PM

Ajax(异步JavaScript和XML)允许在不重新加载页面情况下添加动态内容。使用PHP和Ajax,您可以动态加载产品列表:HTML创建一个带有容器元素的页面,Ajax请求加载数据后将数据添加到该元素中。JavaScript使用Ajax通过XMLHttpRequest向服务器发送请求,从服务器获取JSON格式的产品数据。PHP使用MySQL从数据库查询产品数据,并将其编码为JSON格式。JavaScript解析JSON数据,并将其显示在页面容器中。点击按钮触发Ajax请求,加载产品列表。

PHP 数组转对象对性能的影响是什么? PHP 数组转对象对性能的影响是什么? Apr 30, 2024 am 08:39 AM

在PHP中,数组到对象的转换会对性能产生影响,主要受数组大小、复杂性、对象类等因素影响。为了优化性能,可以考虑使用自定义迭代器、避免不必要的转换、批量转换数组等技巧。

C++与其他语言的性能比较 C++与其他语言的性能比较 Jun 01, 2024 pm 10:04 PM

在开发高性能应用程序时,C++的性能优于其他语言,尤其在微基准测试中。在宏基准测试中,其他语言如Java和C#的便利性和优化机制可能表现更好。在实战案例中,C++在图像处理、数值计算和游戏开发中表现出色,其对内存管理和硬件访问的直接控制带来明显的性能优势。

See all articles