需求描述:“异步获取列表的,如果点击列表的某一行进入详情页,在详情页处理完要返回列表页的时候,能否返回之前所在的分页? ”
现有有两个可行的方案:1.使用 url参数 来记录之前的分页数;2.使用 HTML5 sessionStorage 记录之前的分页数;
方案1:特点是可以特定某些链接跳回列表页时回到之前所在分页;缺点是改动文件多,改动量大,容易出错;宝贝-标题优化已使用这种方式;
方案2:特点是对一个 session 进行分页数存储,无论哪个页面跳到列表页都可以回到之前所在分页;优点是只改 js;缺点是得针对 IE6、IE7 做兼容(已有方案可解决);【个人推荐】
方案1
进度(toushou-tbv3):
a.已完成:素材-投放管理;
b.前端完成:素材-海报(跳回链接需在 flash 中添加);
c.前端完成后发现无需(囧):素材关联列表(所有)-》制作完成后跳到“我的关联列表”
说明:改动了4个页面,分别对应1、2、3、4;第3步 a 的方法可能丢失分页参数(如果在操作页不是点击链接返回列表,而是用浏览器的返回按钮、或是 Mac 系统用双指回退),在之后异步 block 回传数据,用 js 渲染列表内容可避免这个问题;以下例子是 tbv3的素材-投放管理页的修改步骤;
步骤:
- 列表所在的 phtml 页面,添加
<input type="hidden" id="J_PageId" value="getRequest()->getParam('page_id','1');?>" />
- 在异步加载的(block)html,给需要跳转链接记住上次所在分页的上加
class= J_LiA
;如果此链接不是使用 href 跳转而是用 onclick 控制,则分解 onclick 事件:链接放到 data-url 属性中;在第3步 a 中处理onclick 事件; 列表所在的 js 页面:
a. 对象中加入分页记录属性:pageId : DOM.val(DOM.get("#J_PageId")),
b. 渲染异步列表后,用 js 给链接加分页参数,(例如在 renderItems() 方法中)
1.如果第2步使用 href 跳转:
var liA = DOM.query('#J_MaterialItems .J_LiA');
S.later(function(){
for(var i=0;i
如果第2步使用 onclick 跳转:
Event.on('.J_LiA','click',function(ev){
if(!showPermissions('editor_material','促销素材')){return ;}
var link = DOM.attr(ev.currentTarget,'data-url');
window.location.href=link+'&page_id='+templet.pageId;
//window.open(link+'&page_id='+templet.pageId);
})
加载列表的方法(例如:searchPutItems() ),第一行加入var pageId = listControl.pageId;
加载列表的方法,发送的请求中多加参数+"&page_id="+pageId
加载列表的方法,成功后的回调(例如:submitHandle() ),渲染完分页后,再指定分页跳转;例如:
if(pageId > 1){
listControl.paginator.setPage(pageId).setPageCount(pageCount).printHtml('#J_Paging',2);
}
分页操作的方法第一行加入:listControl.pageId = turnTo;
在列表页跳出的操作页面,给需要跳回上次所在分页的链接所在的 php echo 方法中加入,array('page_id'=>$this->getRequest()->getParam('page_id','1'))
例如:
<a href="getUrl('material/show/index',array('page_id'=>$this->getRequest()->getParam('page_id','1')))?>">
—————————————————————方案2分割线————————————————————————
说明:只改动列表页所在的 js;
步骤:
分页控制方法中,把分页存入 sessionStorage:
if(window.sessionStorage){
var ss = window.sessionStorage;
var last_pagination = {'udp_item_index' : turnTo};
ss.setItem("hlg_ss_tbv3",JSON.stringify(last_pagination));
}
加载列表的方法中,读取 sessionStorage,并指定分页数:
a.获取分页数:
var ss = window.sessionStorage;
var hlg_ss = JSON.parse(ss['hlg_ss_tbv3']);
if(ss && ss.getItem('hlg_ss_tbv3') && hlg_ss['udp_item_index']){
var pageId = parseInt(hlg_ss['udp_item_index']);
}else{
var pageId = 1;
}
b.传参:data += "&page_id="+pageId;
c.请求成功后跳转:
if(pageId > 1){
list.paginator.setPage(pageId).setPageCount(pageCount).printHtml('#J_Paging',2);
}
交流区