在开发项目的时候,每每会有一些父级页面,例如这样:javascript
点击便可返回上一层目录,但是这样是返回到父级页面的首页,咱们本来的操做记录清空了(好比说咱们翻到第3页博客,点击去看,再返回父级页面的时候又回到第一页了):php
这种体验至关糟糕,我不得不从新点回第三页。前端
这时候我想起了一个解决方案,使用window.history.go(-1)或window.location.go(-1)。java
window.history.go(-1) 是返回上一页 window.location.go(-1) 是刷新上一页
这样处理若是仅限于一个地址,没有任何跳转或其余操做,的确是可行的,那么当有其余操做的时候该怎么办呢?个人解决方案是,渲染该页面的时候,在返回“父级页面“这个按钮的href连接处记录进入到这个页面以前的url地址,从而实现这个效果(PHP使用的是laravel)。laravel
原本是使用base64加密解密的方法进行处理,但因为项目局限没法引入第三方jq库,只能使用转化成16进制的方法进行解决。ui
首先前端代码:this
function goPerson(uid,article_id){ var local = stringToHex(window.location.href); //不能直接把url当作参数传递,得进行字符串的处理 var url = "/blog/"+uid+"?article_id="+article_id+"&url="+local; //拼接url,传递参数至php端 //url内容相似这样:/blog/1007?article_id=15&url=\u0068\u0074\u0074\u0070\u003a window.location.href = url; } function stringToHex(str) { var arr = []; for (var i = 0; i < str.length; i++) { arr[i] = "00" + str.charCodeAt(i).toString(16); } return "\\u" + arr.join("\\u"); }
PHP端代码(laravel):加密
//获取用户项目详情 public function getBlog($uid, Request $request) { $url = $request->input('url'); $url = $this->unescape(str_replace('\\',"%",$url)); //其余业务逻辑 //xxxxx //xxxxx //xxxxx return view("adm.staff.blogInfo",["blogInfo" => $blogInfo,'url' => $url]); } protected function unescape($str) { $ret = ''; $len = strlen ( $str ); for($i = 0; $i < $len; $i ++) { if ($str [$i] == '%' && $str [$i + 1] == 'u') { $val = hexdec ( substr ( $str, $i + 2, 4 ) ); if ($val < 0x7f) $ret .= chr ( $val ); else if ($val < 0x800) $ret .= chr ( 0xc0 | ($val >> 6) ) . chr ( 0x80 | ($val & 0x3f) ); else $ret .= chr ( 0xe0 | ($val >> 12) ) . chr ( 0x80 | (($val >> 6) & 0x3f) ) . chr ( 0x80 | ($val & 0x3f) ); $i += 5; } else if ($str [$i] == '%') { $ret .= urldecode ( substr ( $str, $i, 3 ) ); $i += 2; } else $ret .= $str [$i]; } return $ret; }
跳转后的页面代码:url
<a href="{{$url}}">返回上一级页面</a>
这样,即可以记录上一级页面的全部url地址了。code