如何判断Oracle Apex卡片区域完全渲染,以恢复用户浏览位置?
Oracle Apex 卡片区域渲染完成后执行滚动定位的解决方案
场景回顾
- 第1页包含一个分页卡片区域(每页显示32张卡片),用户点击卡片跳转至第11页,第11页有返回按钮可回到第1页。
- 为实现返回第1页时恢复之前的浏览位置,原代码使用以下JS逻辑:
其中apex.region("prods").call('gotoPage', $v("P1_CARDS_PAGE")); $(window).scrollTop(apex.item("P1_SCROLL_POS").getValue());P1_CARDS_PAGE记录跳转前的卡片页码(如示例中的第2页),P1_SCROLL_POS记录点击卡片时的页面滚动位置。
现有问题
返回第1页时,JS代码在卡片区域完全渲染前执行,虽能跳转至对应页码,但无法正确保持卡片的滚动位置。
解决方案
可以利用Oracle Apex提供的区域就绪事件或回调方法,确保在卡片区域渲染完成后再执行滚动定位逻辑,以下是两种可行方案:
方案1:使用whenReady()回调
apex.region().whenReady()方法会在目标区域完成渲染并准备就绪后执行回调函数,适合页面加载时触发的场景:
apex.region("prods").whenReady(function() { // 先跳转至目标页码 apex.region("prods").call('gotoPage', $v("P1_CARDS_PAGE")); // 再恢复滚动位置 $(window).scrollTop(apex.item("P1_SCROLL_POS").getValue()); });
方案2:监听apexafterrefresh事件
卡片区域分页跳转属于区域刷新操作,apexafterrefresh事件会在区域刷新完成后触发,可绑定此事件执行滚动定位:
// 绑定区域刷新完成事件 $("#prods").on("apexafterrefresh", function() { $(window).scrollTop(apex.item("P1_SCROLL_POS").getValue()); }); // 触发页码跳转,完成后自动执行滚动 apex.region("prods").call('gotoPage', $v("P1_CARDS_PAGE"));
原理说明
卡片区域的分页渲染是异步过程,直接执行滚动逻辑时,区域DOM尚未完成更新,导致滚动位置失效。通过上述方法等待区域渲染完成后再执行滚动,就能准确定位到之前的浏览位置。
内容的提问来源于stack exchange,提问作者Ahsan Anwar
相关产品推荐
相关产品推荐

