Laravel 5.5 重定向带锚点并传递Session数据的实现问询
我来帮你搞定这个订阅后滚动到footer的需求,之前你尝试的写法问题出在语法上,导致要么Session丢失要么滚动不生效,给你两个靠谱的方案:
方案1:带锚点的正确重定向(保留Session数据)
你之前写的 return redirect()->back()->with('failed', '提示信息'). '#sitefooter'; 是错误的——因为redirect()->back()->with(...)返回的是RedirectResponse对象,直接和字符串#sitefooter拼接会把对象转成字符串输出,而不是发送正确的重定向响应。
正确的写法应该是把锚点直接拼在重定向的URL里,再通过with()传递Session数据:
public function registerNewsletter(Request $request) { $email = $request->input('email'); $isSub = Newsletter::hasMember($email); if($isSub) { // 拼接上一页URL + 锚点,再传递失败提示 return redirect()->to(url()->previous() . '#sitefooter') ->with('failed', 'You have been already registered in our Newsletter system.'); } else { Newsletter::subscribe($email); // 同样带锚点传递成功提示 return redirect()->to(url()->previous() . '#sitefooter') ->with('success', 'You have been registered in our Newsletter system.'); } }
这样重定向后,浏览器会自动滚动到id为sitefooter的元素,同时Session里的提示信息也能正常显示。
方案2:前端JS自动滚动(更稳定的方案)
如果遇到上一页URL有复杂参数、锚点拼接失效的情况,用前端JS处理会更可靠。思路是:页面加载时,检测是否存在订阅成功/失败的Session提示,若存在则自动滚动到footer区域。
在你的footer.blade.php里添加这段代码(放在Session提示的后面即可):
@if(Session::has('success') || Session::has('failed')) <script> // 等待页面DOM加载完成 document.addEventListener('DOMContentLoaded', function() { // 找到footer元素(替换成你实际的footer ID) const footerElement = document.getElementById('sitefooter'); if(footerElement) { // 平滑滚动到footer,behavior: 'smooth'是可选的,去掉就是直接跳转 footerElement.scrollIntoView({ behavior: 'smooth', block: 'center' // 滚动后footer居中显示,可选值还有start/end }); } }); </script> @endif
这种方案不需要修改控制器代码,只要确保footer有对应的ID(比如sitefooter),就能在页面加载后自动滚动过去,体验更流畅。
内容的提问来源于stack exchange,提问作者Konstantinos Natsios
相关产品推荐
相关产品推荐

