基于jQuery实现类似Prototype的Ajax.PeriodicalUpdater并优化请求间隔
实现类似Prototype.js Ajax.PeriodicalUpdater的jQuery自适应延迟更新功能
嘿,我帮你重构了代码,完美实现你想要的功能——页面加载完成后立即请求目标内容,后续如果请求到的内容和之前一致,就自动增加下次请求的延迟(直到设定的最大延迟),一旦内容更新就立刻重置回初始请求频率,有效降低服务器负载:
<div id="div_a_updater" class="div_a_updater">Mettre ici</div> <script> function mettreajour_periodique(span_id, url_traitement, nos_parametres, our_frequency, our_decay, our_decay_to_reset) { jQuery(document).ready(function(){ var target = jQuery("#"+span_id); var lastContent = ''; var currentDelay = our_frequency; // 定义核心更新函数 function updateContent() { jQuery.get(url_traitement + nos_parametres, function(newContent) { // 对比新旧内容 if (newContent !== lastContent) { // 内容有更新:替换内容,重置延迟 target.html(newContent); lastContent = newContent; currentDelay = our_frequency; } else { // 内容无变化:增加延迟,但不超过设定的最大值 currentDelay += our_decay; if (currentDelay > our_decay_to_reset * 1000) { // 转换秒为毫秒 currentDelay = our_decay_to_reset * 1000; } } // 安排下一次请求 setTimeout(updateContent, currentDelay); }); } // 页面加载完成后立即执行第一次更新 updateContent(); }); } // 调用函数:注意参数拼接格式 mettreajour_periodique('div_a_updater', 'brouillons_touse.php', '&membre=', 15000, 2000, 3600); </script>
关键逻辑说明:
- 替换
setInterval为setTimeout:setInterval是固定间隔无法动态调整,setTimeout可以在每次请求完成后,根据内容变化情况灵活设置下一次的延迟时间 - 内容对比机制:用
lastContent变量存储上一次请求的内容,每次新请求完成后直接对比字符串,判断是否有更新 - 自适应延迟规则:
- 内容更新时:重置延迟为初始的
our_frequency(15秒),确保及时获取最新内容 - 内容无变化时:每次增加
our_decay(2秒)的延迟,直到达到our_decay_to_reset(3600秒=1小时)的最大延迟,避免无意义的频繁请求
- 内容更新时:重置延迟为初始的
- 初始立即执行:页面DOM就绪后直接调用
updateContent(),实现加载完成即更新的需求
小提示:
如果你的nos_parametres参数需要更安全的传递方式,建议改用jQuery.get的参数对象形式,避免URL拼接的格式问题:
jQuery.get(url_traitement, { membre: '' }, function(newContent) { // 内部逻辑保持不变 });
内容的提问来源于stack exchange,提问作者Man Of God
相关产品推荐
相关产品推荐

